在层次结构中呈现的输入字段
input fields rendering in a hierarchy
我正在构建一个具有以下组件层次结构的简单React应用程序:
---ReqList(显示请求项列表)
------ReqListHeader(一个具有列表标题和一些按钮的div)
------ReqTable(请求项目列表)
---------ReqRow(一行请求)
------------ReqItemHeader
------------ReqItemBody
------------。。。之间还有几个组件
---------------ReqEditor
------------------文本区域
根组件通过ajax调用接收数据,并根据React的标准文档调用setState(data),一切都很好,这是正确的。我能够显示所有子代组件及其值。
但是对于表单输入(文本区域),输入不会更改。我知道我必须实现一个变更处理程序。我不确定的是,在哪里实施它?
-
选项一:我最初想,我只需要在它的直接所有者中添加一个changeHandler函数,方法是调用它的setState()。但我担心,我在中级组件中引入一个状态会打破单向数据流原则。
-
选项二:我是否应该将changeHandler回调作为一个属性从say"ReqRow"组件一直传递到ReqEditor,这样它就可以绑定到textArea更改事件?
-
选项III:或者我应该从层次结构的根开始,即ReqList?这是因为,即使ReqRow也会从其所有者和其父级接收数据,等等,因为这是数据的入口点。
我不太确定在这种情况下我应该做的向上传播的水平。大多数示例都是具有两级层次结构的简单示例。我确信这是可以做到的,但需要将更改处理程序回调一直传递到它的孙子。
这是正确的吗,或者还有其他更好的方法吗?
您面临的问题可以通过使用任何Flux模式实现来解决。React只为数据呈现部分提供了一个解决方案,但它没有提供任何关于如何处理数据流的线索。
Flux是Facebook提出的一种模式,它试图构建你的应用程序,以便以干净的方式管理数据的变化。
来自Flux文档:
所有数据都通过调度器作为中心集线器进行传输。动作是在动作创建者方法中提供给调度器的,并且通常源于用户与视图的交互。然后,调度器调用存储已向其注册的回调,将操作调度到所有存储。在已注册的回调中,存储会响应与其维护的状态相关的任何操作。然后,存储发出一个更改事件,提醒控制器视图数据层发生了更改。控制器视图侦听这些事件,并从事件处理程序中的存储中检索数据。控制器视图调用它们自己的setState()方法,从而导致它们自己及其在组件树中的所有子代的重新呈现。
这密集的一段是对你的问题的解决方法的总结。
EDIT:您还可以使用猴面包树,这是一个库,它提供了一个不可变的数据树,当某些字段(或其子字段)更新时,它会发出事件。因此,每个组件都会侦听所需字段的更改。有一个将其与React集成的包。我用过,效果很好。
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 而循环只设置php中输入字段中的第一个值
- 在输入字段中将最小金额设置为
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- 如何在HTML输入字段中添加不可删除的后缀
- 互斥单选按钮和相应的输入字段
- 在IE9中的输入字段中输入焦点最近按钮
- 选中单选框时将属性添加到输入字段
- 当设置addFromAutocompleteOnly时,剩余文本将保留在输入字段中
- 我如何在数字插入中使用逗号,这样它就不会'不要破坏我的输入字段
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 输入字段将't获取更新的值
- 如何选择多个输入字段并删除所需的属性
- 输入字段,只接受0到12之间的数字
- 单击鼠标,用MySQL数据填充html表单输入字段
- 使用jquery将输入字段转换为文本
- Model中的Typeahead返回空值以形成输入字段
- 如何从查询字符串中的输入字段发回文本
- 如何验证日期、月份和日期的3个独立输入字段;年使用jquery或javascript
- 将值传递给jquery创建的输入字段