useImperativeHandle 的第三个可选参数,依赖项数组主要有三种用法
只在子组件首次被渲染的时候,执行 useImperativeHandle 的第二个回调函数,从而把 return 的对象作为父组件接收到的 ref,而不会因为子组件的更新渲染再次执行( 类比 useEffect )例如:
useImperativeHandle(ref, () => {
console.log("child useImperativeHandle");
return {
count,
reset: () => setCount(0)
}
}, []);
子组件渲染后,回调函数的 console.log 只会打印一次
其中,count 的值基于闭包原理,始终都只会是子组件初始化时的赋值
参考 useEffect,每当这个依赖项数组内的值发生变化,都会触发 useImperativeHandle 回调函数的重新执行
useImperativeHandle(ref, () => {
console.log("child useImperativeHandle");
return {
count,
reset: () => setCount(0)
}
}, [count]);
如果省略,组件内任何 state 的变化都会导致 useImperativeHandle 回调的重新执行。
即,其会跟随组件的更新渲染而执行
useImperativeHandle(ref, () => {
console.log("child useImperativeHandle");
return {
count,
reset: () => setCount(0)
}
});
在实际开发中,应该始终传递依赖项数组来优化性能,如果回调函数不涉及任何状态,则传递空数组