假设我们有这样的组件
const Example = () => {
const [counter, setCounter] = useState(0);
const increment = () => setCounter(counter => counter + 1);
return (
<div>
<Button onClick={increment} />
<div>{counter}</div>
</div>
);
}
当我将onClick
处理程序作为箭头函数传递时,我eslint
会抛出警告:
error JSX props should not use arrow functions react/jsx-no-bind
简短的回答是因为每次都重新创建箭头函数,这会损害性能。这篇文章提出的一个解决方案是用一个空数组包裹在一个useCallback钩子中。当我改成这个时, eslint 警告真的消失了。
const Example = () => {
const [counter, setCounter] = useState(0);
const increment = useCallback(() => setCounter(counter => counter + 1), []);
return (
<div>
<Button onClick={increment} />
<div>{counter}</div>
</div>
);
}
但是,也有另一种观点认为,由于 useCallback 的开销,过度使用useCallback 最终会降低性能。一个例子在这里:https ://kentcdodds.com/blog/usememo-and-usecallback
这让我真的很困惑?所以对于功能组件,在处理内联函数处理程序时,我应该只编写箭头函数(忽略 eslint)还是总是将它包装在 useCallback 中?