【发布时间】:2021-01-15 22:44:54
【问题描述】:
假设我们有这样的组件
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)还是 always 将其包装在 useCallback ???
【问题讨论】:
-
eslint 错误
react/jsx-no-bind,在我看来,最有可能是 React 组件类,而不是功能组件。不过,我可能错了。 IMO 它给你一个错误,因为它无法区分有状态和功能组件之间的区别 -
就我个人而言,我会从 eslint 设置中删除
react/jsx-no-bind并记住在我所有的有状态类中使用自动绑定器 like this one。我很容易记住,因为我的 IDE 允许我拥有模板,所以每当我创建一个新的 React 类时,我只使用包含自动绑定器的模板。
标签: javascript reactjs typescript arrow-functions usecallback