亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在孩子的第一次渲染 useEffect 上用舊狀態反應鉤子 useState

在孩子的第一次渲染 useEffect 上用舊狀態反應鉤子 useState

ABOUTYOU 2023-08-05 21:12:50
示例: https: //codesandbox.io/s/react-hooks-playground-forked-15ctx ?file=/src/index.tsx一名父級具有 1 個 useState 掛鉤,3 個子級具有 1 個 useEffect 掛鉤。我希望子級通過回調更新父級中的狀態,以便所有組件狀態都更新為父級中的一個對象。這不適用于初始/第一次渲染,因為當前狀態不會在每個 useEffect 觸發的回調之間更新(請參見上面的示例或下面的代碼)。這意味著組合狀態僅包含最后一個子級的狀態。const ChildElement = ({ index, callback }) => {  useEffect(() => {    callback(index);  }, []);  return <>{index}</>;};const App = () => {  const [state, setState] = useState(0);  const callback = (index: any) => {    const newObject = { a: index };    setState({ ...state, [index]: newObject });  };  console.log(state);  return (    <>      <ChildElement index={0} callback={callback} />      <ChildElement index={1} callback={callback} />      <ChildElement index={2} callback={callback} />    </>  );};我可以在父級中聲明初始狀態,但這需要更多代碼我可以在渲染緩存中使用(我像 useStae 一樣手動更新的對象,但立即更改),但這感覺很臟鉤子 useReducer 是一個好的解決方案嗎?有什么建議么?解決這個問題的最佳方法是什么?
查看完整描述

1 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

你面臨著競爭條件。


如果你改變


const callback = (index: any) => {

    const newObject = { a: index };

    setState({ ...state, [index]: newObject });

  };

到:


  const callback = (index: any) => {

    const newObject = { a: index };

    setState((currentState) => ({ ...currentState, [index]: newObject }));

  };


你的代碼會起作用


雖然這樣:


所有組件狀態都更新為父級中的一個對象


這不是一個好的做法。


更好的子組件擁有自己的狀態,如果這些狀態彼此相似,您可以通過創建自定義掛鉤來減少代碼。


查看完整回答
反對 回復 2023-08-05
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號