我对React很新,我正在尝试理解子组件之间相互通信的简洁方法.
在一个简单的组件中,我知道我可以使用props将数据传递给子节点,并让子节点的回调将数据传递回父组件.
在稍微复杂的情况下,当我在父组件中有多个子组件时,子组件之间的通信会有点混乱.我不确定我应该为同级别的儿童组件做些什么来相互沟通.
在我的情况下,我决定,也许,我可以使用状态.所以我将在父组件中有一个状态值,并将其传递给子项的道具.类似地,父组件中的回调处理程序(从子组件调用)将有助于相应地设置状态,以便通过React的绑定将状态值从一个子节点传递到另一个子节点.
伪代码可能看起来像:
//Inside Parent Component
constructor() {
//initialise state for the child components
this.setState({testList: []});
}
render() {
return (
<div>
<ChildA onSomething={this.onSomethingHandler} testList={this.state.testList} />
<ChildB onSomethingElse={this.onSomethingElseHandler} testList={this.state.testList} />
</div>
);
}
onSomethingHandler(evt):void {
if(blah.blah.blah) this.setState({testList: this.state.testList.splice().push(evt.value)};
}
onSomethingElseHandler(evt):void {
//Some other complex biz logic...
if(blah.blah.blah) this.setState({testList: this.state.testList.splice().push(somethingOtherStuffDueToLogic)};
}
//Inside ChildA Component
export IChildAProps {
onSomething: (evt)=>void
}
render() {
//Do some logic from the value in testList property
if(this.state.testList == blah blah)...
return (
<button onClick={this.props.onSomething({id:321, value:"wassup! I'm ChildA."})}>ChildA</button>
)
}
//Inside ChildB Component
export IChildBProps {
onSomethingElse: (evt)=>void
}
render() {
//Do some logic from the value in testList property
if(this.state.testList == blah blah)...
return (
<button onClick={this.props.onSomething({id:123, value:"yo! I'm ChildB."})}>ChildB</button>
)
}
在这一点上,我开始想知道2个处理程序方法中的逻辑,即Parent组件中的onSomethingHandler()和onSomethingElseHandler()是否应该实际存在于子组件本身中?我想到了这一点,因为这些逻辑看起来像子组件应该自己处理它们的目的.父组件不应该为它们执行,否则它可能会变得混乱.但我别无选择,因为我正在处理他们的沟通.除此之外,我还创建了一个新的状态,只是为了让他们进行交流.
到目前为止,这仍然是相对可控的.但是在我自己的实验中,它已进入一个阶段,我将子组件嵌套在另一个子组件中,这些子组件需要在相同(或有时不同)级别的其他子组件之间进行通信.使用状态进行交流也意味着我到处都有很多州,这对我来说并不是一个好主意.并且父组件最终得到了大量凌乱的回调处理程序方法来管理组件树上下的所有数据传播.
你可以在上面的插图中看到,ChildB最终还有另一个状态,只是为了帮助在其子组件之间传递信息.
我确定我错过了一些我应该知道的关于React的东西.我在父组件中的回调似乎有点太多,只是为了处理数据传播.我应该如何以干净和可维护的方式真正组织儿童组件的沟通?
解决方法:
每个React程序员都会在某个时间点撞到这堵墙.我也是.答案是使用Redux进行状态管理.您已经体验过使用React的原生状态是多么乏味.
Redux是一种状态管理机制,可以与React一起使用.所以你不会使用React的状态,而是使用Redux.
Redux提供单个存储,存储整个应用程序的状态.您可以使用connect()方法访问组件中的状态.
但有一点需要注意.并非所有反应组件都连接到Redux存储.有两种类型的组件 –
>智能/连接组件:连接到redux商店
>哑组件:取决于连接的组件
我们的想法是通过React的道具将状态从redux存储传递到Connected组件.连接的组件可以直接从商店消耗状态.哑组件不直接连接到redux商店.连接的组件也通过道具将状态传递给哑组件.所以你看,React的状态完全被绕过了.现在,如果你想改变状态,必须发生以下事件 –
>从智能/哑元组件触发事件.
>操作被分派到商店
>减速器根据动作创建新状态.
>新的状态将存储在商店中.
> Store将通过props()通过props将新状态返回到连接的组件
>哑组件将通过道具从连接组件接收新状态
什么是行动和减少?
操作只是描述如何更改状态的javascript对象.
Reducer是一个“纯”函数,它根据调度到商店的操作构建并返回新的状态树.
Redux – http://redux.js.org/
Redux-thunk – https://github.com/gaearon/redux-thunk
Redux-saga – https://github.com/yelouafi/redux-saga