1 回答

TA貢獻1796條經驗 獲得超10個贊
這里幾乎沒有什么事情做得不好。
對于初學者來說,當你將數組作為第二個參數傳遞給 時useMemo
,React 將比較它的值是否嚴格相等,即===
. 每次比較都會失敗,因為merged
每次運行掛鉤時都會重新分配變量。
如果您想比較數組包含的先前值和新值,我可以想到兩種方法:
直接
merged
作為第二個參數傳遞而不是將其放入數組中,這樣 React 將直接比較其中的值。我不確定這是否可行,因為值可能不會總是以相同的順序排列。您可以在每次掛鉤運行時存儲數組的“舊”值(
useState
例如使用掛鉤)并自己將這個舊值與新值進行比較,然后相應地設置一個布爾值。這樣,這個布爾值可以作為數組中的第二個參數傳遞給您的useMemo
.
此外,正如文檔所述,useMemo“返回一個昂貴的計算值”。因此,為了了解它的工作原理,您應該以這種方式獲得“結果”值:
const result = React.useMemo(() => {
if (merged.length) {
return [...new Map(merged.map((item: any) => [key(item), item])).values()]
}
return []
}, merged); // will or won't work, I'd say go with the comparison yourself as stated before
最后,如果您只想從鉤子中返回一個值,則無需將其包裝在數組中,您可以這樣做:
return result;
添加回答
舉報