Я використовую класи es6, і в кінцевому підсумку я отримав кілька складних об'єктів у своєму найвищому стані і намагався зробити свій основний компонент більш модульним, тому я створив просту обгортку класу, щоб зберегти стан на верхньому компоненті, але дозволити більше локальної логіки .
Клас обгортки приймає функцію свого конструктора, який встановлює властивість на стан основного компонента.
export default class StateWrapper {
constructor(setState, initialProps = []) {
this.setState = props => {
this.state = {...this.state, ...props}
setState(this.state)
}
this.props = initialProps
}
render() {
return(<div>render() not defined</div>)
}
component = props => {
this.props = {...this.props, ...props}
return this.render()
}
}
Тоді для кожного складного властивості у верхньому стані я створюю один клас StateWrapped. Тут ви можете встановити реквізити за замовчуванням у конструкторі, і вони будуть встановлені, коли клас ініціалізований, ви можете звернутися до місцевого стану для значень та встановити локальний стан, посилатися на локальні функції та передати його в ланцюг:
class WrappedFoo extends StateWrapper {
constructor(...props) {
super(...props)
this.state = {foo: "bar"}
}
render = () => <div onClick={this.props.onClick||this.onClick}>{this.state.foo}</div>
onClick = () => this.setState({foo: "baz"})
}
Тож мій компонент верхнього рівня просто потребує конструктора для встановлення кожного класу у його властивості стану верхнього рівня, простому візуалізації та будь-яких функціях, що передають міжскладові компоненти.
class TopComponent extends React.Component {
constructor(...props) {
super(...props)
this.foo = new WrappedFoo(
props => this.setState({
fooProps: props
})
)
this.foo2 = new WrappedFoo(
props => this.setState({
foo2Props: props
})
)
this.state = {
fooProps: this.foo.state,
foo2Props: this.foo.state,
}
}
render() {
return(
<div>
<this.foo.component onClick={this.onClickFoo} />
<this.foo2.component />
</div>
)
}
onClickFoo = () => this.foo2.setState({foo: "foo changed foo2!"})
}
Здається, це працює досить добре для моїх цілей, майте на увазі, хоча ви не можете змінити стан властивостей, які ви присвоюєте загорнутим компонентам на компоненті верхнього рівня, оскільки кожен обгорнутий компонент відстежує власний стан, але оновлення стану на верхньому компоненті щоразу змінюється.