react中hooks使用useState的更新不觸發(fā)dom更新問題及解決
問題
const [tableData, setTableData] = useState([{ key: '1' }]) const newAddField = () => { tableData.push({ key: `${fieldNum + 1}` }) setFieldNum(fieldNum + 1) // 這種方法并不會(huì)更新dom節(jié)點(diǎn) setTableData(tableData) }
這種方法,雖然更新的useState,但是dom節(jié)點(diǎn)并不會(huì)更新
原因
在 Hook 中直接修改 state 的一個(gè)對(duì)象(或數(shù)組)屬性的某個(gè)子屬性或值,然后直接進(jìn)行 set,不會(huì)觸發(fā)重新渲染。
對(duì) Class Component來說,state 是 Immutable 的,setState 后一定會(huì)生成一個(gè)全新的 state 引用。
它是通過 this.state 方式讀取 state,所以每次代碼執(zhí)行都會(huì)拿到最新的 state 引用。
對(duì) Hook Function Component 而言,useState 產(chǎn)生的數(shù)據(jù)也是 Immutable 的,通過數(shù)組第二個(gè)參數(shù) Set 一個(gè)新值后,原來的值會(huì)形成一個(gè)新的引用在下次渲染時(shí)。
解決方法
通過擴(kuò)展運(yùn)算符改變引用地址
const [tableData, setTableData] = useState([{ key: '1' }]) const newAddField = () => { tableData.push({ key: `${fieldNum + 1}` }) setFieldNum(fieldNum + 1) // 這種方法并不會(huì)更新dom節(jié)點(diǎn) // setTableData(tableData) // 通過擴(kuò)展運(yùn)算符實(shí)現(xiàn)深拷貝 setTableData([...tableData]) }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Stack?Navigator中使用自定義的Render?Callback
這篇文章主要為大家介紹了Stack?Navigator中使用自定義的Render?Callback使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10使用React+SpringBoot開發(fā)一個(gè)協(xié)同編輯的表格文檔實(shí)現(xiàn)步驟
隨著云計(jì)算和團(tuán)隊(duì)協(xié)作的興起,協(xié)同編輯成為了許多企業(yè)和組織中必不可少的需求,本文小編就將為大家介紹如何使用React+SpringBoot簡單的開發(fā)一個(gè)協(xié)同編輯的表格文檔,感興趣的朋友一起看看吧2023-11-11react路由守衛(wèi)的實(shí)現(xiàn)(路由攔截)
react不同于vue,通過在路由里設(shè)置meta元字符實(shí)現(xiàn)路由攔截。本文就詳細(xì)的介紹一下,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08react-redux集中式狀態(tài)管理及基本使用與優(yōu)化
react-redux把組件分為兩類,一類叫做UI組件,一類叫做容器組件,這篇文章主要介紹了集中式狀態(tài)管理<react-redux>基本使用與優(yōu)化,需要的朋友可以參考下2022-08-08