reactjs - 同时从多个子组件更新父状态

标签 reactjs

我有一个父组件,它有自己的状态,并且在子组件之间共享。
在我的子组件中,我有一个表单和数据,我创建了一个本地状态。让我们调用这个子组件。
在我的父组件中,有一个单击按钮,我将数据从我 child 的本地状态更新到我 parent 的状态。这是我通过将一个标志从父级传递给子级来实现的。
此外,我的 parent 将同一个 child 渲染了两次,最终代码如下:

const parent = () => {
  const [parentState, setParentState] = useState(null);
  const [submitSignal, setSubmitSignal] = useState(false);

  const handleSave = () => {
    setSubmitSignal(true);
  }

  return (
    <div>
      <div onClick={handleSave}>
        Save Data
      </div>

      <Child
        pos={0}
        key={0}
        parentState={parentState}
        submitSignal={submitSignal}
        setParentState={setParentState}
      />

      <Child
        pos={1}
        key={1}
        parentState={parentState}
        submitSignal={submitSignal}
        setParentState={setParentState}
      />
    </div>
  )
}

const Child = (props) => {
  const [childState, setChildState] = useState(null);

  React.useEffect(() => {
    const { pos, submitSignal, parentState, setParentState } = props;
    if (submitSignal) {
      setParentState(...parentState, ...childState);
    }
  }, [props.submitSignal])

  return (
    <div>
      // A large form which multiple fields
    </div>
  )
}
现在这里发生的事情是,一旦我从我的父组件中设置 submitSignal 为真,子组件就会同时接收它并尝试更新父组件的状态。这是一种竞争条件情况,即 Child 0 更新数据,但在它甚至在父状态中更新之前 Child 1 也会更新父状态,从而覆盖/删除 Child 0 添加的内容。
这个你能帮我吗。
附注:我采用这种结构的原因是,在我的 child 中,我有一个非常大的表格,并且同一个表格被使用了两次。

最佳答案

您必须使用回调函数,而不是直接设置父状态。这样,您将在覆盖状态时获得更新的先前状态。

    if (submitSignal) {
      setParentState((pstate)=>{
         return {...pstate,...childstate}
      });
    }
https://stackoverflow.com/a/68531170/5707801

关于reactjs - 同时从多个子组件更新父状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67798460/

相关文章:

javascript - 悬停并放大时,获取较小的图像以完整质量加载

javascript - 在换行符后对文本框中的文本进行切片

javascript - 从 JSON 中删除 src 以创建图像

javascript - 带有 useState 钩子(Hook)的 React 功能组件立即执行函数

javascript - 如何按值(value)对产品进行排序?

javascript - React中如何通过api数据进行映射?

node.js - 如何使用 Express 服务器/ react 客户端在另一个域中 SSO 并重定向到另一个域?

reactjs - 将导入的图标添加到 TabBarIOS.Item

reactjs - 从节点模块导入所有功能是不好的做法吗?

javascript - 从 firebase 链接应用程序中的 .val() 对象读取值?