reactjs - 如何正确地将参数传递给 useCallback() 钩子?
问题描述
控制台警告“<strong>React Hook useEffect 缺少依赖项:'animate'。包括它或删除依赖数组。"
如果 animate 函数设置在括号中
return () => {cancelAnimationFrame (refAnimation.current)}}, [animate])
它给出了另一个警告“ 'animate' 函数使 useEffect Hook 的依赖关系在每次渲染时都会发生变化。要解决此问题,请将 'animate' 的定义包装在它自己的 useCallback () Hook 中。 ”
我尝试将函数包装在useCacllback 钩子中,但显然我做错了,我得到了一个错误:
React Hook useCallback 在只用一个参数调用时什么都不做。您是否忘记传递一系列依赖项?
const animate = useCallback(() => {
refAnimation.current = requestAnimationFrame(() =>
animate(cur, rez, speed)
);
cur = cur + speed;
ref.current.style.marginLeft = cur.toFixed(2) + "px";
if (Math.round(cur) === rez) {
cancelAnimationFrame(refAnimation.current);
}
});
我不知道如何正确地将参数传递给useCallback()以将它们进一步传递给animate()?
完整版代码 https://codesandbox.io/s/old-frog-6nwfq?file=/src/scroll.js
let ref = useRef();
let refAnimation = useRef();
...
const animate = (cur, rez, speed) => {
refAnimation.current = requestAnimationFrame(() =>
animate(cur, rez, speed)
);
cur = cur + speed;
ref.current.style.marginLeft = cur.toFixed(2) + "px";
if (Math.round(cur) === rez) {
cancelAnimationFrame(refAnimation.current);
}
};
useEffect(() => {
if (ref.current === true) {
refAnimation.current = requestAnimationFrame(() => animate(0, 0, 0));
}
return () => {
cancelAnimationFrame(refAnimation.current);
};
}, [animate]);
解决方案
当您使用时,useCallback
您正在根据一些参数记住该回调。这里你没有指定任何参数。如果不是这种情况,它应该只创建一次(而不是根据其他一些值/状态的变化重新创建),你必须将一个空数组作为第二个参数传递给useCallback
. 当组件挂载时,它会导致此回调仅创建一次。
看看文档:https ://reactjs.org/docs/hooks-reference.html#usecallback
推荐阅读
- javascript - Javascript:纱线构建中的 javascript 文件导入问题
- kubernetes - 服务如何连接到 Pod?在yaml中,service和pod之间需要匹配哪些字段?
- reactjs - Material-UI:限制 TextField 中的特定特殊字符
- javascript - 带有 JavaScript 文件的 HTML 在 WPF 应用程序内的 WebView2 上不起作用
- python-3.x - Pythonw, pyw, & arg, /B 不会让 python 的 http-server 在后台运行
- julia - 二项式实验
- json - 如何转换 AWS CloudTrail JSON 输出时间
- java - 多线程矩阵加法比java中的单线程版本花费更长的时间
- java - Java:如何使用线程和用户输入显示奇数和偶数
- blazor - Blazor WebAssembly 托管 API URL