const handleClick = useCallback((params) => {
setParam(params);
},[]);
...
return (
...
<SomeComponent
onClick={handleClick('parameter')}
{...others}
/>
);
в приведенном выше коде во время первого рендеринга, в этом операторе "onClick={handleClick('parameter')}"
функция handleClick вызывается со строкой с именем «parameter». так как handleClick имеет setParam («параметр»), он обновит состояние. Обновление состояния вызовет повторную визуализацию, которая снова примет тот же оператор "onClick={handleClick('parameter')}"
, что вызовет infinte l oop.
следующий код, который вы добавили позже, работает, потому что вы не обновляете состояние, а вместо этого возвращаете функцию, которая действует в качестве обработчика onclick время рендеринга дочерних компонентов внутри функции возврата внутри вашего Compoenent. допустим, у вас есть другое onclickHanldier с именем 'anotherHandleClick' внутри вашего приложения. тогда ваш компонент будет выглядеть следующим образом
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 , см. это