react hook使用useState更新數(shù)組,無法更新問題及解決
問題描述
const [textList, setTextList] = useState(原數(shù)組); setTextList(新數(shù)組);
當(dāng)修改原數(shù)組時(shí),如果原數(shù)組是個(gè)深層數(shù)組,使用setTextList修改時(shí),不會(huì)觸發(fā)頁(yè)面刷新
原因分析
這個(gè)涉及到可變對(duì)象和不可變對(duì)象的知識(shí),
在vue和react中,如果更新可變對(duì)象時(shí),可能會(huì)引起視圖更新,
這是因?yàn)?,vue和react默認(rèn)都是淺監(jiān)聽,只會(huì)監(jiān)聽數(shù)據(jù)的第一層,
如果數(shù)據(jù)是引用類型,內(nèi)層數(shù)據(jù)發(fā)生改變,并不會(huì)監(jiān)聽到。
解決方法
這里應(yīng)該先將原數(shù)組淺拷貝,賦值給新數(shù)組,再修改新數(shù)組(不影響原狀態(tài))
將修改后的新數(shù)組使用setValue傳遞進(jìn)去,這樣就會(huì)引起視圖更新
const [value, setValue] = useState(initialArray); return{ //item是個(gè)數(shù)組 add: (item: T) => setValue([...value, item]), removeIndex: (index: number) => { // 把value copy一遍,解構(gòu)一遍,再把結(jié)構(gòu)的值為了生成新的數(shù)組,相當(dāng)于淺拷貝,這樣才能觸發(fā)更新數(shù)據(jù) const copy = [...value]; copy.splice(index, 1); setValue(copy); }, }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
React實(shí)現(xiàn)前端選區(qū)的示例代碼
本文主要介紹了React實(shí)現(xiàn)前端選區(qū)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05React中的Context應(yīng)用場(chǎng)景分析
這篇文章主要介紹了React中的Context應(yīng)用場(chǎng)景分析,Context 提供了一種在組件之間共享數(shù)據(jù)的方式,而不必顯式地通過組件樹的逐層傳遞 props,通過實(shí)例代碼給大家介紹使用步驟,感興趣的朋友跟隨小編一起看看吧2021-06-06詳解react使用react-bootstrap當(dāng)輪子造車
本篇文章主要介紹了詳解react使用react-bootstrap當(dāng)輪子造車,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08react-router?重新加回跳轉(zhuǎn)攔截功能詳解
這篇文章主要為大家介紹了react-router?重新加回跳轉(zhuǎn)攔截功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02每天一個(gè)hooks學(xué)習(xí)之useUnmount
這篇文章主要為大家介紹了每天一個(gè)hooks學(xué)習(xí)之useUnmount,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05