别担心
不要担心在每个渲染上创建新函数。只有在边缘情况下才会妨碍您的表现。设置onClick
处理程序不是其中之一,所以只需在每个渲染上创建一个新函数。
但是,当您需要确保每次都使用相同的函数时,可以使用useCallback
为什么不useCallback
用于onClick
这是您不应该useCallback
为onClick
处理程序(和大多数其他事件处理程序)烦恼的原因。
考虑以下代码片段,其中一个没有 useCallback:
function Comp(props) {
return <button onClick={() => console.log("clicked", props.foo)}>Text</Button>
}
和 useCallback 之一:
function Comp(props) {
const onClick = useCallback(() => {
console.log("clicked", props.foo)
}, [props.foo])
return <button onClick={onClick}>Text</Button>
}
后者的唯一区别是 React 必须更改onClick
按钮上的props.foo
保持不变。
更改回调是一个非常便宜的操作,为了理论上的性能改进,它根本不值得让您的代码复杂化。
此外,值得注意的是,
即使您使用,每次渲染时仍会创建一个新函数useCallback
,但useCallback
只要作为第二个参数传递的依赖项不变,就会返回旧函数。
为什么一直用 useCallback
使用的要点useCallback
是,如果将两个函数与引用相等进行比较,fn === fn2
则仅当fn
和fn2
指向内存中的同一函数时才为真。功能是否相同并不重要。
因此,如果您有记忆或仅在函数更改时运行代码,useCallback
再次使用相同的函数会很有用。
例如,React 钩子比较旧的和新的依赖项,可能使用Object.is。
另一个例子是React.PureComponent,它只会在 props 或 state 改变时重新渲染。这对于使用大量资源进行渲染的组件很有用。例如onClick
,在每次渲染时将new 传递给 PureComponent 将导致它每次重新渲染。