3 回答

TA貢獻1866條經驗 獲得超5個贊
最有效的方法是什么
最有效的方法可能是針對這種特定形狀的數據進行自定義比較。您可以使用JSON.stringify
或其他一些通用比較函數,但由于顯而易見的原因,它不太可能是最有效的。
因此,在您的示例中,一個簡單的比較函數可能看起來像 ->
const array1 = [{id:1,title:'one'},{id:2,title:'two'},{id:3,title:'three'}];
const array2 = [{id:1,title:'one'},{id:2,title:'two'},{id:3,title:'four'}];
const arrayIsEqual = (a1, a2) =>
a1 === a2 ||
a1.length === a2.length &&
a1.every((f,i) =>
f.id === a2[i].id &&
f.title === a2[i].title
)
//tests
const a1clone = [...array1];
//different arrays not equal
console.log(arrayIsEqual(array1, array2)); //false
//different arrays equal
console.log(arrayIsEqual(array1, a1clone)); //true
//different arrays same values, but different order
a1clone.reverse();
console.log(arrayIsEqual(array1, a1clone)); //false
//same arrays, fastest check
console.log(arrayIsEqual(array1, array1)); //true

TA貢獻1906條經驗 獲得超10個贊
首先1k個對象并不是一個大量的對象,但是回到問題:最簡單的方法是使用
JSON.stringify(object1)?===?JSON.stringify(object2);
但這并不是最有效的,當性能成為問題時,我能想到的最明智的事情是使用元屬性,例如,version
每當我們以任何方式更新對象時,我們也會增加版本。然后你所要做的就是根據 id + version 映射檢查兩個數組。
如果不需要第二個選項,您可以使用lodash.deepCompare
或創建自己的函數。

TA貢獻1836條經驗 獲得超13個贊
確實,useEffect
無法比較對象數組,因此讓useEffect
鉤子運行。
但你可以做的是添加一個if-statement
是否JSON.stringified notesToRender and JSON.stringified props.notes
相等。(或者你可以使用lodash/isEqual
)來阻止設置狀態方法運行。
useEffect
但是,如果您認為這仍然不是一個有效的解決方案,我們首先必須看看您為什么需要。
從您的代碼來看,我認為您正在useState
根據傳入的道具設置一個鉤子。
再想一想,為什么不考慮直接渲染道具呢。
來自官方 React 文檔頁面:
https://reactjs.org/docs/thinking-in-react.html#step-3-identify-the-minimal-but-complete-representation-of-ui-state
它是通過 props 從父級傳遞的嗎?如果是這樣,它可能不是狀態。
隨著時間的推移它會保持不變嗎?如果是這樣,它可能不是狀態。
您可以根據組件中的任何其他狀態或道具來計算它嗎?如果是這樣,那么它就不是狀態。
添加回答
舉報