javascript - 为什么在渲染之间没有记住箭头函数?
问题描述
你能解释一下为什么 handleClick 函数总是新的吗?
function Foo() {
const handleClick = () => {
console.log('Click happened');
}
return <Button onClick={handleClick}>Click Me</Button>;
}
解决方案
请记住,这Foo()
也是一个 JavaScript 函数,在每次渲染时都会重新运行。
在该函数内部有一个语句是:
const handleClick = () => {...};
含义:创建一个函数并将其分配给我最近创建的局部变量handleClick
。因此,它将在每次渲染时重新创建。
这对性能的影响通常接近于零。但是,如果您需要,您可以为此进行优化。
const handleClick = useCallback(()=>{...},[dependencyArray]);
如果该函数依赖于可能更改的变量,您可以将它们添加到 中dependencyArray
,如果其中一个发生更改,React 将重新创建该函数。否则它将保持与上次创建时相同的功能。
由于在渲染中创建函数,Hooks 会变慢吗?
不会。在现代浏览器中,闭包与类相比的原始性能没有显着差异,除非在极端情况下。
来自:https ://reactjs.org/docs/hooks-reference.html#usecallback
使用回调()
返回一个记忆化的回调。
传递一个内联回调和一组依赖项。useCallback 将返回回调的记忆版本,仅当其中一个依赖项发生更改时才会更改。这在将回调传递给优化的子组件时很有用,这些子组件依赖于引用相等来防止不必要的渲染(例如 shouldComponentUpdate)。
推荐阅读
- xml - 如何在sql中为保留的xml字符创建函数
- python - 熊猫为每一列选择不同的行
- typescript - 如何推断实例类型以用作字段类型(使用接口合并)?
- c - 访问 Beagle Bone Ram Registry
- sharepoint - 从列表发送链接到页面查看器 (SharePoint)
- c - 如何计算斐波那契单词的第 n 个字符?
- android - Android Emulator 实例不显示“允许 USB 调试”确认进行身份验证
- database - 无法创建数据库“opensips”;数据库存在
- css - "
- 不允许作为元素的子元素
- 在这种情况下"
- .net-core - EF 迁移忽略数据更改