Estoy usando clases es6, y terminé con varios objetos complejos en mi estado superior e intentaba hacer que mi componente principal fuera más modular, así que creé un contenedor de clase simple para mantener el estado en el componente superior pero permitir más lógica local .
La clase wrapper toma una función como su constructor que establece una propiedad en el estado del componente principal.
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()
}
}
Luego, para cada propiedad compleja en el estado superior, creo una clase StateWrapped. Puede establecer los accesorios predeterminados en el constructor aquí y se establecerán cuando se inicialice la clase, puede consultar el estado local para los valores y establecer el estado local, consultar las funciones locales y hacer que pase por la cadena:
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"})
}
Entonces, mi componente de nivel superior solo necesita que el constructor establezca cada clase en su propiedad de estado de nivel superior, un render simple y cualquier función que comunique componentes cruzados.
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!"})
}
Parece que funciona bastante bien para mis propósitos, tenga en cuenta que no puede cambiar el estado de las propiedades que asigna a los componentes encapsulados en el componente de nivel superior ya que cada componente encapsulado sigue su propio estado pero actualiza el estado en el componente superior Cada vez que cambia.