Car*_*ven 3 javascript architecture typescript reactjs
我对React很新,我正在尝试理解子组件之间相互通信的简洁方法.
在一个简单的组件中,我知道我可以使用props将数据传递给子节点,并让子节点的回调将数据传递回父组件.

在稍微复杂的情况下,当我在父组件中有多个子组件时,子组件之间的通信会有点混乱.我不确定我应该为同级别的儿童组件做些什么来相互沟通.

在我的情况下,我决定,也许,我可以使用states.所以我将state在父组件中有一个值,并将其传递给子项的道具.类似地,父组件中的回调处理程序(从子组件调用)将有助于相应地设置状态,以便通过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>
)
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,我开始怀疑,如果在2种处理方法,逻辑,即onSomethingHandler()与onSomethingElseHandler()在父组件,实际上应子组件里面自己居住?我想到了这一点,因为这些逻辑看起来像子组件应该自己处理它们的目的.父组件不应该为它们执行,否则它可能会变得混乱.但我别无选择,因为我正在处理他们的沟通.除此之外,我还创建了一个新的状态,只是为了让他们进行交流.
到目前为止,这仍然是相对可控的.但是在我自己的实验中,它已进入一个阶段,我将子组件嵌套在另一个子组件中,这些子组件需要在相同(或有时不同)级别的其他子组件之间进行通信.使用状态进行交流也意味着我到处都有很多州,这对我来说并不是一个好主意.并且父组件最终得到了大量凌乱的回调处理程序方法来管理组件树上下的所有数据传播.
您可以在上面的插图中看到,ChildB最终还有另一个状态,只是为了帮助在其子组件之间传递信息.
我确定我错过了一些我应该知道的关于React的东西.我在父组件中的回调似乎有点太多,只是为了处理数据传播.我应该如何以干净和可维护的方式真正组织儿童组件的沟通?
每个React程序员都会在某个时间点撞到这堵墙.我也是.答案是使用Redux进行状态管理.您已经体验过使用React的原生状态是多么乏味.
Redux是一种状态管理机制,可以与React一起使用.所以你不会使用React的状态,而是使用Redux.
Redux提供单个存储,存储整个应用程序的状态.您可以使用connect()方法访问组件中的状态.
但有一点需要注意.并非所有反应组件都连接到Redux存储.有两种类型的组件 -
我们的想法是通过React将状态从redux存储传递到Connected组件props.连接的组件可以直接从商店消耗状态.哑组件不直接连接到redux商店.连接的组件也通过状态传递给哑组件props.所以你看,React的状态完全被绕过了.现在,如果你想改变状态,必须发生以下事件 -
Actions 派遣到 storeReducers根据建立一个新的国家actions.store.Store将通过connect()直通将新状态返回到连接的组件propsprops什么是行动和减少?
操作只是描述如何更改状态的javascript对象.
Reducer是一个"纯"函数,它根据调度到商店的操作构建并返回新的状态树.
Redux - http://redux.js.org/
Redux-thunk - https://github.com/gaearon/redux-thunk
Redux-saga - https://github.com/yelouafi/redux-saga
最时尚的方法是使用 Redux.js(或 Flux.js)来维护子组件状态。
如果你不喜欢调用第三方js。您可以使用refs属性:
https://facebook.github.io/react/docs/more-about-refs.html
| 归档时间: |
|
| 查看次数: |
1885 次 |
| 最近记录: |