【问题标题】:React Hooks: Why does the exhaustive-deps linter rule want a local function used in useMemo in the dependency list?React Hooks:为什么穷举-deps linter 规则要在依赖列表中的 useMemo 中使用本地函数?
【发布时间】:2020-01-05 13:00:23
【问题描述】:

如果我在传递给useMemo(或其他挂钩)的函数中使用本地函数,则exhaustive-deps linter 规则需要useMemo 的依赖项列表中的本地函数。我知道每次渲染时,本地函数都是一个新实例。但由于它从来没有真正改变过,在我看来没有必要放入依赖列表中,特别是因为我需要为函数使用useCallback(这使得代码更复杂)。

这是一个工作示例:

const [inputNumber, setInputNumber] = useState(35);

function calculateFibonacciNumber(number) {
   return number < 1 ? 0 : number <= 2 ? 1 
      : calculateFibonacciNumber(number - 1) + calculateFibonacciNumber(number - 2);
};

const fibonacciNumber = useMemo(() => {
   return calculatedFibonacciNumber = calculateFibonacciNumber(inputNumber);
}, [inputNumber]); // Here the exhaustive-deps rule wants calculateFibonacciNumber in the dependency list

那么,calculateFibonacciNumber 应该放在依赖列表中(通过useCallback)有真正的原因吗?

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    我猜这背后的原因是您在useMemo 之外使用calculateFibonacciNumber

    也许您可以尝试将定义移到里面,就像这样:

    const fibonacciNumber = useMemo(() => {
       function calculateFibonacciNumber(number) {
          return number < 1 ? 0 : number <= 2 ? 1 
             : calculateFibonacciNumber(number - 1) + calculateFibonacciNumber(number - 2);
       };
    
       return calculatedFibonacciNumber = calculateFibonacciNumber(inputNumber);
    }, [inputNumber]);
    

    在这种情况下,您不会看到该警告消息。

    希望对你有帮助!

    【讨论】:

    • 这将修复警告,但如果 calculateFibonacciNumber () 也在外面使用呢?
    • @UtkarshPramodGupta 我猜如果它在代码中的其他地方使用而不是使用useCallback 的一个很好的理由,除了我会移动到useMemo 内部,这不会使代码进一步复杂化。
    • 我们可以通过添加注释来摆脱警告 // eslint-disable-next-line react-hooks/exhaustive-deps。我仍然不确定为什么首先会生成警告。也许穷举-deps 规则根本没有检测到将(本地)函数包含为依赖项没有意义!?
    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2020-06-18
    • 2021-01-05
    • 2021-10-21
    • 2020-06-09
    • 2021-10-31
    相关资源
    最近更新 更多