useEffect 只更新特定的键更新

useEffect to only update a specific key updates

我有一个场景,我们的应用程序有多个函数位于 componentDidUpdate 中。在每个函数中,他们检查特定数据是否已更新。例如:

componentDidUpdate(prevProps) {
 this.handleFoo(prevProps)
 this.handleMoreFoo(prevProps)
}

handleFoo(prevProps){
  if(this.props.foo != prevProps.foo){
    //Do Something
 }
}

handleMoreFoo(prevProps){
  if(this.props.moreFoo != prevProps.moreFoo){
    //Do Something
 }
}

我一直在查看 useEffect 挂钩,想知道我是否可以删除每个函数中的初始检查并利用 useEffect 中的 [] 并且只调用这些功能之一,如果他们的特定密钥更新如下:

useEffect(() => {
   if(fooKey){ handleFoo() }
   if(moreFoo) { handleMoreFoo() }
 }, [fooKey, moreFooKey])

这可能吗?这是可取的吗?

以下是您如何在功能组件中使用挂钩来完成您之前的工作。

我会根据对 :

的回答定义一个自定义挂钩来模仿 componentDidUpdate()
function useUpdate (effect, deps) {
  const firstUpdate = useRef(true);
  const update = useCallback(() => {
    if (firstUpdate.current) {
      firstUpdate.current = false;
    } else {
      return effect();
    }
  }, [firstUpdate, effect]);

  useLayoutEffect(update, deps);
}

...

useUpdate(handleFoo, [fooKey]);
useUpdate(handleMoreFoo, [moreFooKey]);

useLayoutEffect() 确保 handleX() 回调在每个渲染的相同阶段被调用,作为类似的 componentDidMount()componentDidUpdate() 生命周期方法。如果您不关心调用它们的确切阶段,您可以将 useLayoutEffect() 替换为 useEffect().

自定义挂钩的其余部分确保它在初始渲染后跳过调用 handleX() 回调。如果您的 handleX() 回调 可以 在初始渲染后调用,那么您可以直接在您的功能组件中调用 useEffect() 而不是这个 useUpdate() 自定义勾.