第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 setState 掛鉤中更改 prev 狀態(tài)更新視圖,而無需重新呈現。為什么?

在 setState 掛鉤中更改 prev 狀態(tài)更新視圖,而無需重新呈現。為什么?

繁星點點滴滴 2022-09-23 09:40:17
我的更改產品名稱函數稱為 setState,它返回“突變的上一個狀態(tài)”。我將函數傳遞給子組件,并通過上下文 API 在子組件中調用它。該函數已成功更新了子級和父級中顯示的產品名稱,但父級確實觸發(fā)了重新渲染。父級如何在不重新渲染的情況下更新視圖?誰能解釋一下設置狀態(tài)中的上一個狀態(tài)實際上是什么?const App = () => {  const [products, setProducts] = useState(initialValues);  const changeProductName = (id, newName) => {    setProducts((prevState) => {   //is preState a copy of state?        prevState.products.filter(        (product) => product.id === id       )[0].name = newName;        //Mutates prevState      return prevState;           //Did I return a new state?    });  };  useEffect(() =>     console.log("I would know when App re-renders")); //No re-render!  return (    <>    //Some React Switch and Routers     <div>      {product.map(product=>product.name)}   //Successfully Updated!    </div>    <ProductContext value={(products, changeProductName)}>       <ProductPage />     //call changeProductName and it works!    </ProductContext>    </>     ); };如果我更改的函數不觸及 prevState,父級將按預期重新呈現。這種方法更好嗎?  //this will trigger parent re-render.  const changeProductName = (id, newName) => {     setProducts((prevState) => {      prevState.products.filter(        (product) => product.id === id      )[0].name = newName;      return prevState;    });  };
查看完整描述

2 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

據我所知,改變國家通常是一個壞主意。

根據這個答案,改變狀態(tài)可能不會導致重新渲染,因為在突變過程中對狀態(tài)對象的引用不會改變。

我寧愿使用某種類似 redux 的不可變模式:

const changeProductName = (id, newName) => { 

  setProducts((prevState) => (

    prevState.map(product=>{

      if(product.id!==id){

        // name is not changed since the id does not match

        return product;

      } else {

        // change it in the case of match

        return {...product, name:newName}

      }

    }

  )

}


查看完整回答
反對 回復 2022-09-23
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

誰能解釋一下設置狀態(tài)中的上一個狀態(tài)實際上是什么?


prev 狀態(tài)是對前一個狀態(tài)的引用。它不是狀態(tài)的副本,它是位于狀態(tài)內部的對象的引用。因此,更改該對象不會更改對象引用。


因此,它不應該直接突變。相反,應通過基于 prevState 的輸入構建新對象來表示更改。


例如,如果您在更改中進行檢查,例如:


setProducts(prevState => {

  prevState.filter(product => product.id == id)[0].name = newName;

  console.log(prevState === products); // This will console true

  return prevState;

}); 

另外,由于您正在使用鉤子,因此當您編寫...本身已經是產品了。因此,當您嘗試訪問 時,您將在示例中得到未定義的錯誤。setProducts((prevState) => { prevState.products}prevState.products


所以我建議你這樣做:


  const changeProductName = (id, newName) => {

    setProducts(prevProducts =>

      prevProducts.map(product =>

        product.id === id ? { ...product, name: newName } : product

      )

    );

  };

.map將基于 prevState 構建一個新數組,并更改在函數中調用 ID 的產品的名稱。


查看完整回答
反對 回復 2022-09-23
  • 2 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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