【发布时间】:2019-03-08 19:44:36
【问题描述】:
我已经在 React 工作了一年多,我读过 Thinking in react、Lifting state up 和 State and lifecycle。
我了解到React的数据流概念是单向数据流。
来自这些页面的引用:
React 的单向数据流(也称为单向绑定)使一切都模块化且快速。
记住:React 是关于单向数据沿着组件层次结构向下流动的。可能无法立即清楚哪个组件应该拥有什么状态。这通常是新手最难理解的部分,所以请按照以下步骤来弄清楚:...
如果您将组件树想象为道具的瀑布,则每个组件的状态就像一个额外的水源,在任意点加入它,但也会向下流动。
据我了解,以下示例是不允许的,因为我将子 state 数据传递给父级。但我看到一些开发人员是这样工作的:
class Parent extends React.Component {
constructor(props) {
super(props);
this.state = { fromParent: null };
}
addSomething(stateValueFromChild) {
this.setState({fromParent: stateValueFromChild});
}
render() {
return <Child
addSomething={(stateValueFromChild) => this.addSomething(stateValueFromChild)}>
// ...
</Child>;
}
}
class Child extends React.Component {
constructor(props) {
super(props);
this.state = { fromChild: 'foo' };
}
render() {
return <Form onSubmit={() => this.props.addSomething(this.state.fromChild)}>
// ...
</Form>;
}
}
我现在的问题是:
- 真的不允许吗?
- 为什么不应该是模块化和快速的?
- 这真的会阻止单向数据流,变成双向数据流吗?
- 这种方式还会出现什么其他问题?
- 当我将状态提升时,您将如何解决以下情况; 50 个使用该子组件的具体父级,每个父级是否应该为他们正在使用的同一个子级具有相同的初始化子状态?
【问题讨论】:
-
这对我来说看起来不错 - 单向数据流并不意味着没有孩子到父母的通信,它只是意味着你不应该有相同的状态被存储/修改多个地方。在您的示例中,存储在父状态和子状态中的数据并不完全相同 - 您的子组件存储表单的 current 状态(无论用户是否已提交),而父组件存储用户提交的具体数据。
-
在您有 50 位父母的情况下,我想说这取决于这 50 位父母是否需要了解彼此 - 如果不需要,您可能会摆脱存储直接在父母中的数据,但如果他们都需要知道提交的数据的所有,你最好将它传递到另一层(再次通过回调道具)到公共父母。