Javascript 如何在react.js中执行子组件验证而不使用无限循环
我在react中有一个非常简单的例子。父组件通过Javascript 如何在react.js中执行子组件验证而不使用无限循环,javascript,reactjs,Javascript,Reactjs,我在react中有一个非常简单的例子。父组件通过props将数据传递给子组件。在子组件内部,我可以更改此数据,也可以随时将新数据从父组件传递给子组件。在父级上,我还有保存按钮。按下后,如果某些验证未通过,我将显示验证消息。 我以这种方式实施了它。从父级,我通过回调通知父级数据的有效性已更改。在child内部,我在三个位置执行验证: componentDidMount-验证初始数据 组件将接收props-验证可从父级传递的数据 onChange验证输入的数据 任何时候,当孩子执行数据验证时,我都
props
将数据传递给子组件。在子组件内部,我可以更改此数据,也可以随时将新数据从父组件传递给子组件。在父级上,我还有保存按钮。按下后,如果某些验证未通过,我将显示验证消息。
我以这种方式实施了它。从父级,我通过回调通知父级数据的有效性已更改。在child内部,我在三个位置执行验证:
-验证初始数据componentDidMount
-验证可从父级传递的数据组件将接收props
验证输入的数据 任何时候,当孩子执行数据验证时,我都会调用回调来通知家长数据的有效性。问题出在onChange
中。在父项中设置状态时,此部分会导致无限循环-请参见下图。 请检查控制台中的此处,您可以看到我将无限循环限制为10次迭代,以防止浏览器崩溃组件willreceiveprops
组件将以不太智能的方式接收道具
-每个渲染周期,而不是仅在道具实际更改时调用它。
我真的很想知道解决这个问题的方法是什么。我应该只在child中存储子状态吗?我还试图将孩子的有效性存储在州外的父母中——但我的同事说这不是反应方式——为什么 以下是我如何看待您的挑战:
- 您希望在子组件中包含验证方法,因为它特定于此类子组件(例如密码输入字段)。-但在react中,不允许任何外部组件(子组件除外)直接调用此方法
- 您希望您的家长了解每个子组件的验证(例如,确定所有字段的验证和允许表单提交)-因此您需要家长组件中验证方法的结果,这必须是状态
- 不要将子项的有效性存储在子项状态中。将结果+任何消息保存在父级中,并将其作为道具传递给子级。Child只渲染道具李>
- 实现
,检查是否有任何道具或状态变量已更改。如果不返回shouldComponentUpdate()
,否则返回false
true
- 将对
的调用从validate()
移动到componentWillReceiveProps
。这是在componentWillUpdate()
之后调用的。因此,只有当道具或子状态发生更改时,才会进行验证(和重新渲染)shouldComponentUpdate()