react中hooks使用useState的更新不觸發(fā)dom更新問題及解決
問題
const [tableData, setTableData] = useState([{ key: '1' }])
const newAddField = () => {
tableData.push({
key: `${fieldNum + 1}`
})
setFieldNum(fieldNum + 1)
// 這種方法并不會更新dom節(jié)點
setTableData(tableData)
}
這種方法,雖然更新的useState,但是dom節(jié)點并不會更新
原因
在 Hook 中直接修改 state 的一個對象(或數(shù)組)屬性的某個子屬性或值,然后直接進行 set,不會觸發(fā)重新渲染。
對 Class Component來說,state 是 Immutable 的,setState 后一定會生成一個全新的 state 引用。
它是通過 this.state 方式讀取 state,所以每次代碼執(zhí)行都會拿到最新的 state 引用。
對 Hook Function Component 而言,useState 產(chǎn)生的數(shù)據(jù)也是 Immutable 的,通過數(shù)組第二個參數(shù) Set 一個新值后,原來的值會形成一個新的引用在下次渲染時。
解決方法
通過擴展運算符改變引用地址
const [tableData, setTableData] = useState([{ key: '1' }])
const newAddField = () => {
tableData.push({
key: `${fieldNum + 1}`
})
setFieldNum(fieldNum + 1)
// 這種方法并不會更新dom節(jié)點
// setTableData(tableData)
// 通過擴展運算符實現(xiàn)深拷貝
setTableData([...tableData])
}
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決react中useState狀態(tài)異步更新的問題
本文主要介紹了react中useState狀態(tài)異步更新的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
React動態(tài)更改html標簽的實現(xiàn)方式
這篇文章主要介紹了React動態(tài)更改html標簽的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

