- 假设我有一个 React 类 P,它呈现两个子类,C1 和 C2。
- C1 包含一个输入字段。我将此输入字段称为 Foo。
- 我的目标是让 C2 对食物的变化做出反应。
我提出了两种解决方案,但都感觉不太正确。
第一个解决方案:
- 为 P 分配一个状态,
state.input
.
- 创建一个
onChange
P 中的函数,它接收一个事件并设置state.input
.
- 通过这个
onChange
将 C1 作为props
,并让 C1 绑定this.props.onChange
to the onChange
of Foo.
这有效。每当 Foo 的值发生变化时,就会触发setState
在 P 中,因此 P 将有输入传递给 C2。
但出于同样的原因,感觉不太正确:我正在从子元素设置父元素的状态。这似乎违背了React的设计原则:单向数据流。
这是我应该这样做的,还是有更 React 自然的解决方案?
第二种解决方案:
只需将 Foo 放入 P 即可。
但这是我在构建应用程序时应该遵循的设计原则吗?将所有表单元素放在render
最高级别的班级?
就像我的例子一样,如果我有一个大的 C1 渲染,我真的不想把整个render
C1 至render
P 只是因为 C1 有一个表单元素。
我该怎么做呢?
那么,如果我理解正确的话,您的第一个解决方案是建议您在根组件中保留状态?我不能代表 React 的创建者说话,但总的来说,我认为这是一个合适的解决方案。
维护状态是创建 React 的原因之一(至少我认为)。如果您曾经实现过自己的状态模式客户端来处理具有大量相互依赖的移动部分的动态 UI,那么您会喜欢 React,因为它减轻了很多状态管理的痛苦。
通过将状态保持在层次结构中的更高位置,并通过事件更新它,您的数据流仍然几乎是单向的,您只是响应根组件中的事件,您并没有真正通过双向绑定获取数据,您告诉根组件“嘿,这里发生了一些事情,请检查这些值”,或者您正在向上传递子组件中某些数据的状态以更新状态。您更改了 C1 中的状态,并且希望 C2 知道它,因此,通过更新根组件中的状态并重新渲染,C2 的 props 现在是同步的,因为状态在根组件中更新并传递。
class Example extends React.Component {
constructor (props) {
super(props)
this.state = { data: 'test' }
}
render () {
return (
<div>
<C1 onUpdate={this.onUpdate.bind(this)}/>
<C2 data={this.state.data}/>
</div>
)
}
onUpdate (data) { this.setState({ data }) }
}
class C1 extends React.Component {
render () {
return (
<div>
<input type='text' ref='myInput'/>
<input type='button' onClick={this.update.bind(this)} value='Update C2'/>
</div>
)
}
update () {
this.props.onUpdate(this.refs.myInput.getDOMNode().value)
}
})
class C2 extends React.Component {
render () {
return <div>{this.props.data}</div>
}
})
ReactDOM.renderComponent(<Example/>, document.body)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)