不用担心
不要担心在每次渲染时创建新的函数。只有在极端情况下,这才会影响性能。
设置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>
}
在后一种情况下,唯一的区别是如果
props.foo
保持不变,React不必更改您按钮上的
onClick
。更改回调非常便宜,完全没有值得为了理论上的性能提升而使代码复杂化。
另外,值得注意的是,即使使用
useCallback
,每次呈现仍然会创建一个新函数,但只要作为第二个参数传递的依赖项保持不变,
useCallback
将返回旧函数。
为什么要使用
useCallback
使用
useCallback
的目的在于,如果使用引用相等比较两个函数,则
fn === fn2
仅在
fn
和
fn2
指向内存中的同一函数时才为真。无论这些函数是否执行相同的操作都没有关系。
因此,如果您有记忆化或仅在函数更改时运行代码的其他方式,则使用
useCallback
重用相同的函数可能很有用。
例如,React钩子比较旧的和新的依赖关系,
probably使用
Object.is。
另一个例子是React.PureComponent,它只会在props或state发生更改时重新渲染。这对于使用大量资源进行渲染的组件非常有用。每次渲染都向PureComponent传递一个新的onClick
将导致它每次重新渲染。
useCallback
- Arman CharanuseCallback
将(大致)不执行任何操作。 - Dave Newton