Tôi đang sử dụng các lớp es6 và tôi đã kết thúc với một số đối tượng phức tạp ở trạng thái hàng đầu của mình và đang cố gắng làm cho thành phần chính của mình trở nên mô đun hơn, vì vậy tôi đã tạo một trình bao bọc lớp đơn giản để giữ trạng thái trên thành phần trên cùng nhưng cho phép logic cục bộ hơn .
Lớp trình bao bọc lấy một hàm làm hàm tạo của nó để đặt một thuộc tính trên trạng thái thành phần chính.
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()
}
}
Sau đó, đối với mỗi thuộc tính phức tạp ở trạng thái trên cùng, tôi tạo một lớp StateWrapping. Bạn có thể đặt các đạo cụ mặc định trong hàm tạo ở đây và chúng sẽ được đặt khi lớp được khởi tạo, bạn có thể tham khảo trạng thái cục bộ cho các giá trị và đặt trạng thái cục bộ, tham khảo các hàm cục bộ và chuyển nó qua chuỗi:
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"})
}
Vì vậy, thành phần cấp cao nhất của tôi chỉ cần hàm tạo để đặt mỗi lớp thành thuộc tính trạng thái cấp cao nhất, kết xuất đơn giản và bất kỳ chức năng nào giao tiếp thành phần chéo.
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!"})
}
Có vẻ như hoạt động khá tốt cho mục đích của tôi, hãy nhớ rằng bạn không thể thay đổi trạng thái của các thuộc tính bạn gán cho các thành phần được bọc ở thành phần cấp cao nhất vì mỗi thành phần được bọc đang theo dõi trạng thái của chính nó nhưng cập nhật trạng thái trên thành phần trên cùng mỗi lần nó thay đổi.