【发布时间】:2020-06-10 13:06:51
【问题描述】:
我正在优化应用程序的性能,我想知道是否对不依赖任何变量的函数使用 useCallback 钩子。
考虑以下情况: 假设我们有一些功能:
const someFunc = () => {
let someVar = "someVal";
/**
* here some extra calculations and statements regarding 'someVar'.
* none of the statements depends on a variable outside this function scope.
*/
return someVar;
};
这个函数不依赖任何变量,所以我们可以用 useCallback 把它包装成一个空数组:
const someFunc = useCallback(() => {
let someVar = "someVal";
return someVar;
}, []);
现在我的问题是 - 是否:
- react 实际上声明了函数(包括内存分配和类似的东西):
const someFunc = () => {
let someVar = "someVal";
return someVar;
};
const someFuncCallback = React.useCallback(someFunc , [])
- OR react 是否首先检查依赖项数组,如果没有任何依赖项更改为用于内存中先前分配的函数?
如果第一条语句为真,那么我们不应该在不依赖任何其他 var 的函数上使用 useCallback,因为无论如何该函数都会被重新声明。
但是如果第二个语句为真,那么我们应该在任何更“昂贵”的函数上使用 useCallback 钩子来声明一个单独的 useCallback 调用语句,但我不知道调用它来响应 useCallback 有多昂贵(来自内存和 CPU 使用情况)。
我发现this very nice blog 说第一句话是真的。但是如果你检查react docs about useCallback hook,你会看到它写着react useCallback 使用记忆调用,这意味着
returning the cached result when the same inputs occur again,所以也许我没有得到一些东西,其中哪一个是正确的?
【问题讨论】:
-
如果函数不依赖于任何变量,你应该把它移出组件。
-
函数总是被分配的,但
useCallback将丢弃它并在依赖关系没有改变的情况下返回旧函数。当您将此函数进一步传递给记忆化组件时,这会影响性能。 -
at 依赖于其他 setState 钩子函数。
-
打电话给你请参考一些文档来验证你的回答?
标签: javascript reactjs performance