const test1 = useCallback(
_.debounce(async (val) => {
console.log("call test");
console.log(value);
console.log(val);
}, 200),[]);
// const test2 = useCallback(
// _.debounce(async () => {
// console.log("call test");
// console.log(value);
// }, 200),
// []
// );
useEffect(() => {
test1(value);
// test2();
}, [value]);
value
是一个状态变量,每当它发生变化时,就会调用useEffect,它会调用testX
。如果value
在函数中作为参数传递,一切看起来都很好,但如果value
直接在函数中用作"全局"变量,console.log似乎不会记录value
的当前值,即使状态已经更改,应该由useEffect((检测
当在常规速度中键入"12"时,test1
中的示例console.log
call test
from State: ""
from Parameter: 12
我是不是遗漏了什么?我是React的新手,也许你可以推荐一些资源来了解这种行为
代码示例
const test1 = useCallback(
// ...
,[]);
空数组表示该函数应该只创建一次,然后再也不创建。由于它是在第一次渲染时创建的,因此它会关闭第一次渲染中的变量,当时value
就是""
。
如果您希望在value
更改时创建一个新函数,则可以将useCallback的依赖数组更改为包含value
:
const test1 = useCallback(
// ...
,[value]);
或者将功能的创建转移到您的使用效果中:
useEffect(() => {
const test1 = _.debounce(async (val) => {
console.log("call test");
console.log(value);
console.log(val);
})
test1(value);
}, [value]);
然而,这两种解决闭包变量的方法都会破坏去抖动行为,因此它们可能对您没有用处。既然你可以传递这个值,也许就坚持这个。