Что, скорее всего, происходит. Компонент-наследник дёргает какой-то API компонента-родителя.
Вот это "переиспользуемую" часть выносите отдельно и имплементируете render props.
Супер вымышленный пример, но надеюсь посыл поняли.
// inheritance
class UrlLoader extends React.Component {
state = {
loading: false,
result: null,
error: null,
};
componentDidMount() {
this.setState({
loading: true,
});
this.load().then(
(result) => {
this.setState({
result,
loading: false,
});
},
(error) => {
this.setState({
error,
loading: false,
});
},
);
}
load() {
return fetch(this.props.url);
}
render() {
const { loading, error, result } = this.state;
if (loading) {
return 'Loading...';
}
if (error) {
return (
<div className="error">
{error}
</div>
);
}
return (
<div className="page-result">
{result}
</div>
);
}
}
class FancyUrlLoader extends UrlLoader {
componentDidMount() {
super.componentDidMount();
this.doSomethingElse();
}
doSomethingElse() {
// something else
}
render() {
const result = super.render();
return (
<div className="super-fancy">
{result}
</div>
);
}
}
// somewhere
const MyComponent = () => {
return (
<div>
<FancyUrlLoader url="https://google.com" />
</div>
);
};
// composition
class UrlLoader extends React.Component {
state = {
loading: false,
result: null,
error: null,
};
componentDidMount() {
this.setState({
loading: true,
});
this.load().then(
(result) => {
this.setState({
result,
loading: false,
});
},
(error) => {
this.setState({
error,
loading: false,
});
},
);
}
load() {
return fetch(this.props.url);
}
render() {
const { loading, error, result } = this.state;
let render;
if (loading) {
render = 'Loading...';
} else if (error) {
render = (
<div className="error">
{error}
</div>
);
} else {
render = (
<div className="page-result">
{result}
</div>
);
}
return this.props.children(render);
}
}
class FancyMaker extends React.Component {
componentDidMount() {
this.doSomethingElse();
}
doSomethingElse() {
// something else
}
render() {
return (
<div className="super-fancy">
{this.props.children}
</div>
);
}
}
// somewhere
const MyComponent = () => {
return (
<div>
<UrlLoader url="https://google.com">
{(children) => (
<FancyMaker>
{children}
</FancyMaker>
)}
</UrlLoader>
</div>
);
};