useImperativeHandle 的第三个可选参数,依赖项数组主要有三种用法

1. 空数组: []

只在子组件首次被渲染的时候,执行 useImperativeHandle 的第二个回调函数,从而把 return 的对象作为父组件接收到的 ref,而不会因为子组件的更新渲染再次执行( 类比 useEffect )例如:

useImperativeHandle(ref, () => {
    console.log("child useImperativeHandle");
    
    return {
				count,
        reset: () => setCount(0)
    }
}, []);

子组件渲染后,回调函数的 console.log 只会打印一次

其中,count 的值基于闭包原理,始终都只会是子组件初始化时的赋值

2. 传递一个依赖项数组

参考 useEffect,每当这个依赖项数组内的值发生变化,都会触发 useImperativeHandle 回调函数的重新执行

useImperativeHandle(ref, () => {
    console.log("child useImperativeHandle");
    
    return {
				count,
        reset: () => setCount(0)
    }
}, [count]);

3. 省略依赖项数组

如果省略,组件内任何 state 的变化都会导致 useImperativeHandle 回调的重新执行。

即,其会跟随组件的更新渲染而执行

useImperativeHandle(ref, () => {
    console.log("child useImperativeHandle");
    
    return {
        count,
        reset: () => setCount(0)
    }
});

在实际开发中,应该始终传递依赖项数组来优化性能,如果回调函数不涉及任何状态,则传递空数组