【发布时间】:2020-01-24 10:33:53
【问题描述】:
在传递回调函数时,尤其是传递参数化函数时,我知道我应该使用useCallback钩子,因为使用匿名函数会对性能产生不利影响。
我说的匿名函数的例子是这样的。
import React, { useState } from 'react';
const Component = () => {
const [param, setParam] = useState('');
...
return (
...
<SomeComponent
onClick={() => setParam('parameter')}
{...others}
/>
);
}
在将匿名函数转换为使用此钩子的过程中,我遇到了“渲染过多”或无法正常工作的错误。 但具体是什么情况,什么情况我不知道。
我使用了useCallback,如下所示。
import React, { useState, useCallback } from 'react';
const Component = () => {
const [param, setParam] = useState('');
const handleClick = useCallback((params) => {
setParam(params);
},[]);
...
return (
...
<SomeComponent
onClick={handleClick('parameter')}
{...others}
/>
);
}
但是,当使用匿名函数在useCallback 内返回时,它也可以工作。
这意味着像这里的代码。 (仅与上面的代码相比有区别。)
const handleClick = useCallback((params) => {
return () => setParam(params);
},[]);
在这种情况下,我想知道如果我只是使用匿名函数而不是使用这个钩子,是否比在useCallback 中使用匿名函数更糟糕。
【问题讨论】:
-
如果你的函数这么小,我怀疑即使使用
useCallback.. 你也会获得任何性能。但是你会失去很多可读性,当 ->onClick={(params) => setParam(params)}会做一样的。 -
@Keith 感谢您的评论。但该代码只是一个示例。也许这是一个不恰当的例子。我的问题的重点是,“仅使用匿名函数在`useCallback`中返回匿名函数时是否会造成相同的性能损失?”换句话说,人们推荐使用
useCallback,因为匿名函数对性能有负面影响,而我想知道当我在`useCallback`中返回一个匿名函数时,如果它们正常工作,我是否可以使用它们。 -
当你需要通过传递函数的相同引用来优化子重新渲染并且子组件是
PureComponent/用React.memo包装时,使用useCallback,尽管它会记住之前的函数每次重新渲染时都会创建一个新函数,但会被垃圾收集。 -
好的。感谢您的评论。帮了大忙!
标签: javascript reactjs react-hooks anonymous-function usecallback