Estou usando classes es6 e acabei com vários objetos complexos no meu estado superior e estava tentando tornar meu componente principal mais modular. Por isso, criei um invólucro de classe simples para manter o estado no componente superior, mas permitir uma lógica mais local .
A classe wrapper assume uma função como seu construtor que define uma propriedade no estado do 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()
}
}
Em seguida, para cada propriedade complexa no estado superior, crio uma classe StateWrapped. Você pode definir os props padrão no construtor aqui e eles serão definidos quando a classe for inicializada; você poderá consultar o estado local para obter valores e definir o estado local, consultar funções locais e passar a cadeia:
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"})
}
Portanto, meu componente de nível superior precisa apenas do construtor para definir cada classe como sua propriedade de estado de nível superior, uma renderização simples e quaisquer funções que se comuniquem entre componentes.
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 funcionar muito bem para meus propósitos, lembre-se de que você não pode alterar o estado das propriedades que atribui aos componentes agrupados no componente de nível superior, pois cada componente agrupado está acompanhando seu próprio estado, mas atualizando o estado no componente superior cada vez que muda.