Sto usando le classi es6 e ho finito con diversi oggetti complessi sul mio stato superiore e stavo cercando di rendere il mio componente principale più modulare, quindi ho creato un semplice wrapper di classe per mantenere lo stato sul componente superiore ma consentire più logica locale .
La classe wrapper accetta una funzione come costruttore che imposta una proprietà sullo stato del componente principale.
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()
}
}
Quindi, per ogni proprietà complessa sullo stato superiore, creo una classe StateWrapped. Qui puoi impostare gli oggetti di scena predefiniti nel costruttore e verranno impostati quando la classe viene inizializzata, puoi fare riferimento allo stato locale per i valori e impostare lo stato locale, fare riferimento alle funzioni locali e far passare la catena:
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"})
}
Quindi il mio componente di primo livello ha solo bisogno del costruttore per impostare ogni classe sulla sua proprietà di stato di livello superiore, un semplice rendering e tutte le funzioni che comunicano tra i componenti.
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!"})
}
Sembra funzionare abbastanza bene per i miei scopi, tieni presente che non puoi cambiare lo stato delle proprietà che assegni ai componenti avvolti al componente di livello superiore poiché ogni componente avvolto sta monitorando il proprio stato ma aggiornando lo stato sul componente superiore ogni volta che cambia.