【问题标题】:React form with lot of children, parent state与很多孩子,父母状态反应形式
【发布时间】:2018-11-29 09:25:30
【问题描述】:

我有一个表单,它基本上是一个复选框矩阵(数百个),并且有一个标题文本输入。

这些行中的一些东西:

render() {
    <form>
        <input type=text>title</input>
        {checkboxes.map(return <cell />)}
    </form>
}

之前,我将全局状态保存在父级中,但是单次检查需要很长时间,因为每个单元格都会触发渲染。

现在,我在每个单元格中都有状态(检查真/假),所以速度更快。我不能真正使用函数onChecked 将状态提升到父级原因,然后我会回到相同的缓慢模式。

我的问题是:父级应该如何保存全局状态(例如,我可以将其发送到服务器)?

我正在考虑将所有数据保存在与状态无关的变量(在父级中,例如 this.data)中,因为每个子级都在处理自己的状态。

谢谢

【问题讨论】:

  • 使用shouldComponentUpdate处理程序,您可以将所有复选框的状态保持在父状态,但仅重新渲染那些更新的复选框

标签: forms reactjs react-state-management


【解决方案1】:

如 cmets 中所述,您应该为您的 Cell 组件实现 shouldComponentUpdate() 方法。比如:

shouldComponentUpdate(nextProps) {
  if(nextProps.checked === this.props.checked) {
    return false;
  }

  return true;
}

这将确保如果 checked 属性自上次重新渲染后没有更改,则永远不会发生重新渲染。您现在应该能够将状态保持在父级中而没有任何延迟。


或者,但不推荐,您可以保留每个组件的状态并将ref 添加到您的&lt;form&gt;。这允许您利用表单和表单元素独有的一些辅助方法。

这可能看起来像:

<form ref={el => this.formRef = el}>
  ...

onSubmitToServer() {
  const data = jQuery(this.formRef).serializeArray();
  //do something
}

显然,您需要安装和导入 jQuery 才能使上述工作正常工作,或者实现您自己的序列化数组解决方案。

【讨论】:

  • 你认为在类内部存储数据怎么样? (如this.data
  • @HRK44,取决于你如何使用它。如果render() 需要this.data,并且它的值会随着时间而改变,那么这是一个坏主意,应该在this.state.data 中。如果this.data 未在渲染中使用或始终是静态的,则可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2019-05-22
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多