我有一个昂贵的计算函数,useMemo非常适合它。问题是,我知道这个计算函数的参数永远不会改变。据我所知,useMemo强制您将第二个参数的参数包含在数组中,以检查它们是否发生了更改,从而可以重新计算存储的值。ex(
useMemo( ()=> expensiveFunction(arg1, arg1, arg3), [arg1, arg2, arg3])
但这对我来说是非常混乱和不必要的,因为我知道arg1、2和3永远不会改变我的情况。有没有办法把这一点告诉useMemo函数,这样我就可以完全跳过第二个参数了?如果我有很多论点,当我从一开始就知道它们都不会改变时,在数组中再次重写它们是很麻烦的。这完全是为了代码的整洁,如果这不可能的话,那就不是世界末日,但我很好奇是否存在这样的东西。
react hook的模式等效于基于类的componentDidMount
,它使用一个空的依赖数组。
useMemo( ()=> expensiveFunction(arg1, arg1, arg3), []);
但是根据这个关于记忆值的常见问题解答主题,特别是这个简介:
您可能将useMemo作为性能优化,而不是语义保证在未来,React可能会选择"忘记"一些以前记忆的东西值,并在下次渲染时重新计算,例如为屏幕外组件。编写代码,使其在没有使用Memo,然后添加它以优化性能。(对于极少数情况当绝对不能重新计算值时,可以延迟初始化参考(
懒散地初始化一个值
使用状态初始化功能
// expensiveFunction() is only called once
const [value] = useState(() => expensiveFunction(arg1, arg1, arg3));
useRef
const ref = useRef(null);
// expensiveFunction value is created lazily once
function getExpensiveValue() {
if (ref.current === null) {
ref.current = expensiveFunction(arg1, arg1, arg3);
}
return ref.current;
}
// When you need it, call getExpensiveValue()
// ...
在这两者之间,第一个更简单,更容易阅读和推理,也是我推荐的一个。