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])
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
React Native中NavigatorIOS組件的簡單使用詳解
這篇文章主要介紹了React Native中NavigatorIOS組件的簡單使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
React中useMemo、useCallback的具體使用
useMemo和useCallback是React中用于緩存計算結(jié)果和函數(shù)的Hooks,本文就來介紹一下useMemo、useCallback的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01
React利用路由實現(xiàn)登錄界面的跳轉(zhuǎn)
這篇文章主要介紹了React利用路由實現(xiàn)登錄界面的跳轉(zhuǎn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

