Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在React中对this.props.children调用setState或其他方法是一种好的做法吗?_Javascript_Reactjs - Fatal编程技术网

Javascript 在React中对this.props.children调用setState或其他方法是一种好的做法吗?

Javascript 在React中对this.props.children调用setState或其他方法是一种好的做法吗?,javascript,reactjs,Javascript,Reactjs,在我的理解中,道具是由家长设置的,状态是组件的私有属性 this.state是组件专用的,可以通过调用this.setState()进行更改。当状态更新时,组件将重新呈现自身 父组件应该不对其子组件调用setState。这是正确的吗 假设父级在提交时有一些验证机制,并且希望传递所有的验证错误它应该通过道具来实现这一点,还是可以对其子项调用setState? 最后,在子组件上调用任何东西是一种好的做法吗 考虑这种方法: validate: function () { var hasError

在我的理解中,道具是由家长设置的,状态是组件的私有属性

this.state是组件专用的,可以通过调用this.setState()进行更改。当状态更新时,组件将重新呈现自身

父组件应该对其子组件调用
setState
。这是正确的吗

假设父级
在提交时有一些验证机制,并且希望传递所有
的验证错误它应该通过道具来实现这一点,还是可以对其子项调用
setState

最后,在子组件上调用任何东西是一种好的做法吗

考虑这种方法:

validate: function () {
  var hasError = false;

  React.Children.forEach(this.props.children, function(child) {
    if (child.validate) {
      hasError = hasError || child.validate();
    }
  });

  return !hasError;
}
这是可行的,但我不确定duck-typing children方法是否是React中的方法
你觉得怎么样?

这不是个好主意

在验证示例中,虽然如果表单有几个直接子组件,它会起作用,但如果您还想验证
中的字段,该怎么办?它们不会是直接的子对象,因此现在您的逻辑约束了您的标记

实现您想要的一种方法是通过给孩子一个特殊的对象,让他们完全控制父母的状态。React有一个内置的示例:


您可以采用相同的想法并将其应用于验证。

react中的每个组件都是独立的,每个组件都应该保持自己的状态,而不是其他组件。他们只能向其他组件发送道具,并根据其他组件的决定是否更新其状态。因此,更好的做法是向孩子们发送道具,而不是调用他们的
setState

但是,根据您在表单验证中提出的问题,如果表单已提交且表单无效,则表单会在其每个输入字段上触发无效事件


因此,您可以编写函数来处理每个子级上的无效事件,因此您也不必将道具从父级传递到子级

您应该更新子道具,而不是它们的状态。但是我看不出您希望在代码中如何做到这一点,看起来您正在从您的子组件收集
有效
状态,不是吗?@David:此代码对每个具有此方法的子组件调用
validate()
。再说一次,我认为这不是一个好方法,但我不能清楚地解释为什么。好吧。。。但你的问题是关于什么的?标题与您的代码示例不匹配。@大卫:有两个问题密切相关。我编辑了标题并增加了重点。我不认为调用子方法和设置其状态之间有什么相似之处,只是
setState
也是一种方法。但处理状态与调用自定义方法完全不同。您是否打算引用其他方法?答案的格式为引号。