每 5 秒就会有一些来自长轮询的数据,我希望我的组件在每次数组的一项(或数组长度本身)发生变化时调度一个操作。 在将数组作为依赖项传递给 useEffect 时,如何防止 useEffect 进入无限循环,但如果任何值发生变化,仍然设法调度一些操作?
useEffect(() => { console.log(outcomes) }, [outcomes])
其中outcomes
是一个 ID 数组,例如[123, 234, 3212]
。数组中的项目可能会被替换或删除,因此数组的总长度可能(但不一定)保持不变,因此传递outcomes.length
作为依赖项并非如此。
outcomes
来自 reselect 的自定义选择器:
const getOutcomes = createSelector( someData, data => data.map(({ outcomeId }) => outcomeId) )
使用 JSON.stringify() 或任何深度比较方法可能效率较低,如果您提前知道对象的形状,您可以编写自己的效果钩子来根据结果触发回调您的自定义相等函数。
useEffect
的工作原理是检查依赖项数组中的每个值是否与前一渲染中的值相同,如果其中一个不是,则执行回调。因此,我们只需要使用useRef
保留我们感兴趣的数据实例,并且仅在自定义相等性检查返回false
时分配一个新实例来触发效果。用法
更进一步,我们还可以通过创建一个接受自定义相等函数的效果钩子来重用该钩子。
用法
现场演示
您可以传递
JSON.stringify(outcomes)
作为依赖项列表:了解更多信息此处