【发布时间】:2020-10-08 04:39:42
【问题描述】:
我在 React 中遇到了 useMemo() 钩子的情况。
我有一个名为a 的数组对象。该对象包含多个对象。这个数组很大。当它包含b 和c 对象时,a 看起来像a = [b,c]。我正在对数组a 进行大量计算。这是我的代码 sn-p:
const computedValue = useMemo(() => {
return a.map(key,() => {
anotherHighComputationFunc(key);
});
},[a])
const anotherHighComputationFunc = useMemo((key) => {
// ..... do some expensive computation
return someValue;
},[key]);
如果a 的引用没有改变,我不会再次计算该值,我只是返回预先计算的值。如果a 的引用发生更改,那么我将查看数组a 以检查是否某个键已更改其在数组内的引用。如果某个键的引用没有改变,则返回该键的预计算值,否则对该键进行计算。
问题是钩子规则失败了,因为我在另一个钩子中使用了一个钩子。所以它给我一个错误。有没有其他方法可以在 2 个级别上进行记忆?
【问题讨论】:
-
钩子可以在其他钩子中使用,但我怀疑问题出在 some “条件”钩子调用上,尽管我没有从你的 sn-p 中看到钩子在另一个钩子中被调用。能否提供更完整的代码示例?
-
@DrewReese 我相信问题是在 map 函数中调用 useMemo ,这是一个循环,React 要求避免在循环中使用钩子。
-
也许,它被认为是在循环中调用(但您正在调用 memozied 回调)或嵌套函数(我认为是这个)。听起来您可以滚动自己的简单缓存。
标签: javascript arrays reactjs lodash