将表单元素状态传递给同级/父元素的正确方法是什么?

  • 假设我有一个React类P,它呈现两个子类C1和C2
  • C1包含一个输入字段。我将把这个输入字段称为Foo
  • 我的目标是让C2对Foo的变化做出反应

我提出了两个解决方案,但两个都不太合适

第一个解决方案:

  1. 为P分配一个状态,状态。输入
  2. 在P中创建一个onChange函数,它接收一个事件并设置状态。input
  3. 将此onChange作为props传递给C1,并让C1将this.props.onChange绑定到Foo的onChange

这很有效。每当Foo的值改变时,它就会触发P中的setState,因此P将有输入传递给C2

但出于同样的原因,它感觉不太正确:我正在从子元素设置父元素的状态。这似乎违背了React的设计原则:单向数据流。
我应该这样做,还是有更具反应性的天然溶液?

第二种解决方案:

把福放在p

但这是我在构建应用程序时应该遵循的设计原则吗?将所有表单元素放在最高级别的渲染中?

就像在我的例子中,如果我有一个大的C1渲染,我真的不想把整个C1的render放到p的render,仅仅因为C1有一个表单元素

我该怎么做

所以,如果我理解正确,您的第一个解决方案是建议您在根组件中保持状态?我不能代表React的创建者说话,但总的来说,我觉得这是一个合适的解决方案

保持状态是创建React的原因之一(至少我认为是这样)。如果您曾经实现过自己的状态模式客户端,用于处理具有许多相互依赖的移动部件的动态UI,那么您会喜欢React,因为它减轻了很多这种状态管理的痛苦

通过在层次结构中进一步保持状态,并通过事件进行更新,您的数据流仍然是单向的,您只是对根组件中的事件进行响应,您并不是通过双向绑定在那里获取数据,而是告诉根组件“嘿,这里发生了一些事情,请检查这些值”或者您正在向上传递子组件中某些数据的状态,以便更新状态。您更改了C1中的状态,并且希望C2知道它,因此,通过更新根组件中的状态并重新渲染,C2的道具现在是同步的,因为状态在根组件中更新并传递

类示例扩展React.Component{
建造师(道具){
超级(道具)
this.state={data:'test'}
}
渲染(){
返回(
<div>
<C1 onUpdate={this.onUpdate.bind(this)}/>
<C2 data={this.state.data}/>
</div>
)
}
onUpdate(data){this.setState({data})}
}
类C1扩展了React.Component{
渲染(){
返回(
<div>
<输入类型='text'ref='myInput'/>
<input type='button'onClick={this.update.bind(this)}value='update C2'/>
</div>
)
}
更新(){
this.props.onUpdate(this.refs.myInput.getDOMNode().value)
}
})
C2类扩展了反应组件{
渲染(){
返回<div>{this.props.data}</div>
}
})
ReactDOM.renderComponent(<Example/>,document.body)

发表评论