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;
添加回答
举报