- 假设我有一个React类P,它渲染了两个子类C1和C2。
- C1包含一个输入字段。我将此输入字段称为Foo。
- 我的目标是让C2对Foo的变化做出反应。
我已经提出了两种解决方案,但是它们都不对。
第一个解决方案:
- 为P分配一个状态,
state.input
。 onChange
在P中创建一个函数,该函数接受一个事件并设置state.input
。onChange
将其作为传递给C1props
,然后让C1绑定this.props.onChange
到onChange
Foo。
这可行。每当Foo的值更改时,它都会触发setState
P中的a,因此P会将输入传递给C2。
但是由于相同的原因,感觉不太正确:我正在从子元素中设置父元素的状态。这似乎背叛了React的设计原理:单向数据流。
这是我应该怎么做,还是有一个更自然的React解决方案?
第二种解决方案:
只需将Foo放在P中即可。
但这是我在构建应用程序时应遵循的设计原则—将所有表单元素都放在render
最高级别的类中?
就像在我的示例中一样,如果我渲染了很大的C1,我真的不想仅将render
C1 放在render
P中就因为C1具有表单元素。
我该怎么办?
我很惊讶,在我撰写本文时,没有一个简单的惯用React解决方案的答案。所以这是一个(将大小和复杂度与其他进行比较):
任何受控的
input
(在React中使用表单的惯用方式)都会在其onChange
回调中更新父状态,并且仍然不会出卖任何东西。例如,仔细查看C1组件。您是否看到
C1
内置input
组件处理状态更改的方式有何重大不同?您不应该,因为没有。对于原始React来说,提升状态并传递值/ onChange对是惯用的。如某些答案所示,不使用裁判。