const handleClick = useCallback((params) => {
setParam(params);
},[]);
...
return (
...
<SomeComponent
onClick={handleClick('parameter')}
{...others}
/>
);
在第一次渲染期间的上述代码中,在此语句"onClick={handleClick('parameter')}"
中,使用名为“参数”的字符串调用了 handleClick 函数。由于 handleClick 具有 setParam("parameter"),它将更新状态。更新状态将导致重新渲染,这将再次出现 "onClick={handleClick('parameter')}"
导致无限循环的相同语句。
您稍后添加的以下代码有效,因为您没有更新状态,而是返回一个函数,该函数充当 onclick 处理程序。
const handleClick = useCallback((params) => {
return () => setParam(params);
},[]);
更好的方法应该如下,
import React, { useState, useCallback } from 'react';
const Component = () => {
const [param, setParam] = useState('');
const handleClick = useCallback((params) => {
setParam(params);
},[]);
...
return (
...
<SomeComponent
onClick={handleClick}
{...others}
/>
);
}
回到您的问题,比较性能取决于您的组件内的返回函数内的其他函数定义和子组件的渲染时间。假设您的应用程序中有另一个名为“anotherHandleClick”的 onclickHanldier。那么你的组件看起来像这样
const Component = () => {
const [param, setParam] = useState('');
const [anotherParam, setAnotherParam] = useState('');
const handleClick = (params) => {
setParam(params);
};
const anotherHandleClick =(params) => {
setAnotherParam(params);
};
...
return (
...
<SomeComponent
onClick={handleClick('parameter')}
{...others}
/>
<SomeComponent
onClick={antherHandleClick('parameter')}
{...others}
/>
);
}
在上述组件中,当“SomeCompoenent”中的任何一个单击整个“组件”时重新渲染,因此处理函数是新定义的。当两者都对 onclick 处理函数进行引用相等检查时,他们认为这是新的处理函数使他们同时渲染两者。在这种情况下,最好使用 useCallBack 钩子,如下所示,
const Component = () => {
const [param, setParam] = useState('');
const [anotherParam, setAnotherParam] = useState('');
const handleClick = useCallback((params) => {
setParam(params);
},[]);
const anotherHandleClick = useCallback((params) => {
setAnotherParam(params);
},[]);
...
return (
...
<SomeComponent
onClick={handleClick('parameter')}
{...others}
/>
<SomeComponent
onClick={antherHandleClick('parameter')}
{...others}
/>
);
}
在上面的代码中,当任何一个被点击时,状态都会发生变化。然后在渲染时, useCallback 确保 onclick 处理程序引用没有改变。因此不会重新呈现对 onclick 处理程序的依赖。
所以最后的想法是它在两种情况下都在每个渲染上创建一个函数。第二个(因为它包含在 useCallback 中)将返回在初始渲染上创建的记忆函数
何时使用 useMemo 或 useCallback参考这个