【问题标题】:Best way to resolve react-hooks/exhaustive-deps warning解决 react-hooks/exhaustive-deps 警告的最佳方法
【发布时间】:2021-02-18 11:21:05
【问题描述】:

考虑一下这个人为的代码 sn-p。

const foo = () => {return 1;} 
const bar = useMemo(() => {return foo();}, [foo])

当我触发 react-hooks/exhaustive-deps 警告时,我会收到这样的消息。

The 'foo' function makes the dependencies of useMemo Hook (at line 2) change on every render. Move it inside the useMemo callback. Alternatively, wrap the definition of 'foo' in its own useCallback() Hook.

警告给了我 2 条建议:1) 将 foo 放在 bar 的 useMemo 回调中,或者 2) 将函数包装在 useCallback 中。

我当然也可以。我只是想知道:这两个选项中的任何一个是否比另一个更可取,如果是,那为什么?如果您的答案是“取决于”,那么它到底取决于什么?

【问题讨论】:

  • 这可能是与 useEffect 的例子吗?
  • @NtshemboHlongwane 你可以得到与 useEffect 相同的警告,所以我认为这个问题也适用于 useEffect。

标签: reactjs react-hooks eslint


【解决方案1】:

两种方式都可以正常工作。偏好基于代码以及您对它们所做的事情。

例如,如果您在不止一个位置使用foo,那么将其移动到useMemo 回调中是行不通的。

如果你只在 useMemo 回调中使用foo,那么在其中定义它是有意义的。

在这种情况下,它看起来像:

const bar = useMemo(() => {
  const foo = () => 1;
  return foo();
  // include foo's dependencies in the deps array
}, []);

或者你可以内联定义它:

const bar = useMemo(() => {
  return 1;
  // include foo's dependencies in the deps array
}, []);

【讨论】:

  • @ZacheryHaber 谢谢!
【解决方案2】:

使用 useEffect 我想如何解决这个问题是有一个清理功能

const [mounted, setMounted] = useState(true);


useEffect(()=>{

    if (mounted){
        buzz();

    }

    //Cleanup function
    return ()=>{
        setMounted(false);
    }
}, [mounted]) //hook dependency 

【讨论】:

  • 尝试使用useEffect,因为componentDidMount 是antipattern。这一切都是为了确保事情保持同步,而不是遵循生命周期。
  • 好的,我明白你和博客的实际意义,所以我在没有使用清理功能的情况下一直面临这个问题,看看当你使用类似pusher 的东西而不使用清理功能时,内容甚至不止一次出现那里给出了括号,所以你能解释一下如何解决这个问题吗?
  • 你肯定想使用清理功能。我知道我已经使用效果来订阅/取消订阅 socket-io 事件。我从来没有用过 pusher,所以我不知道那里的复杂性。简单看一下,我发现了这个 npmjs.com/package/@harelpls/use-pusher 模块,您可能会查看或使用它
猜你喜欢
  • 2020-05-01
  • 2021-04-15
  • 2020-01-18
  • 2021-09-03
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2020-06-22
  • 2020-03-11
相关资源
最近更新 更多