Вы можете создать компонент высшего порядка (HOC) для этого, в основном вы просто пишете компонент с тем же методом, который повторяется, а затем в функции render()
вызываете функцию this.props.children
с любыми аргументами внутреннего состояния HOC, которые выхотите, вы также можете передать всю функцию state
и setState
, чтобы вы могли изменить состояние HOC внутри базового компонента.
Например:
class HOC extends React.Component {
constructor(props) {
super(props);
state = {
someState: 'foo',
};
}
componentWillMount() {
console.log('i mounted!')
}
render() {
return (
<div>
{this.props.children({ state: this.state, setState: this.setState })}
</div>
)
}
}
const SomeComponent = () =>
<HOC>
{({ state, setState }) => (
<div>
<span>someState value: </span>
<input
value={state.someState}
onChange={e => setState({ someState: e.target.value})}
/>
</div>
)}
</HOC>
Youс ним можно также делать действительно классные и интересные вещи, например, подключать фрагмент своего состояния редукса, когда вам это нужно:
import { connect } from 'react-redux';
const ProfileState = connect(
state => ({ profile: state.profile }),
null,
)(({
profile,
children
}) => (
<div>
{children({ profile })}
</div>
));
const ProfilePage = () => (
<div>
Your name is:
<ProfileState>
{({ profile }) => (
<span>{profile.name}</span>
)}
</ProfileState>
</div>
);
Здесь - полная документация по этой технике.