我如何将 useState 值从子级传递给父级

Posted

技术标签:

【中文标题】我如何将 useState 值从子级传递给父级【英文标题】:How can i pass useState value from child to parent 【发布时间】:2021-12-26 06:59:43 【问题描述】:

我有两个子组件,它们有一个单独的状态。现在我想使用两个子组件中的状态并在父组件中渲染它。我该怎么做呢

function ChildA() 
  const [solutestate, setsolutestate] = useState("");
  return (
    <div>
      <Jsme
        
        
        options="oldlook,star"
        onChange=setsolutestate
      />
    </div>
  );


const childB = () => 
  const [solventstate, setsolventstate] = useState("");

  return (
    <div>
      <Jsme
        
        
        options="oldlook,star"
        onChange=setsolventstate
      />
    </div>
  );
;


function App() 
  return (
    <div className="App">
      <ChildA />
      <ChildB />

      <div>solutestate</div>
      <div>solventstate</div>
    </div>
  );

【问题讨论】:

您的文字基本上告诉我们,这根本不是子状态,而是父状态,子中的动作应该触发父状态的变化,而不是子状态。他们可能会得到这个事件,但他们应该通过调用父母给他们的 props-passed 处理函数来处理它,这让父母为自己设置这个值。 【参考方案1】:

您应该将状态保存在父级中(称为提升状态),然后将设置器传递给子级。

function ChildA( setsolutestateA) 
    return (
      <div>
        <Jsme
          
          
          options="oldlook,star"
          onChange=setsolutestateA
        />
      </div>
    );
  
  
  const childB = ( setsolutestateB) => 
    return (
      <div>
        <Jsme
          
          
          options="oldlook,star"
          onChange=setsolutestateB
        />
      </div>
    );
  ;
  
  
  function App() 
    const [solutestateA, setsolutestateA] = useState("");
    const [solutestateB, setsolutestateB] = useState("");

    return (
      <div className="App">
        <ChildA ...setsolutestateA/>
        <ChildB ...setsolutestateB/>
  
        <div>solutestateA</div>
        <div>solutestateB</div>
      </div>
    );
  

【讨论】:

谢谢,它解决了我的问题,但你能给出更多关于它是如何工作的解释吗?使用... 得到了价值 它只是 javascript 解构,你可以在 MDN 上阅读更多内容,它只是传递许多 props 的简写语法。但是,不要过度使用它,因为它会损害性能(每次解构都会创建一个新对象) 您在 childB 中使用了两个 是故意还是错误。我得到了输出,但它正在重复。我该怎么办? 提供工作代码沙箱,我可以帮助你【参考方案2】:

您应该将一个设置状态的函数从您的父组件传递给子组件,以便子组件可以通过调用通过 props 传递的函数来更新父组件的状态。

例如: 家长:

function App() 
  const [solventstate, setsolventstate] = useState("");

  const sendDataToParent = (solventstate) =>  // the callback. Use a better name
    setsolventstate(solventstate);
  
 
  return (
    <div className="App">
      <ChildA sendDataToParent=sendDataToParent/>
      <ChildB sendDataToParent=sendDataToParent/>
    </div>
  );
;

孩子:

const childB = (sendDataToParent) => 
  return (
    <div>
      <Jsme
        
        
        options="oldlook,star"
        onChange=sendDataToParent(solventstate)
      />
    </div>
  );
:

【讨论】:

以上是关于我如何将 useState 值从子级传递给父级的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2:仅当表单数据有效时才将表单数据从子级传递给父级

React - 在下拉选择中将状态从子级传递给父级

如何为 v-select 组件从子级传递值到父级

将对象从子状态传递给父状态

如何将值从子窗体传递回父窗体?

我可以使用react中的useEffect挂钩从子级设置父级的状态