首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React Hook useEffect缺少deps

React Hook useEffect缺少deps
EN

Stack Overflow用户
提问于 2020-11-04 04:57:32
回答 2查看 112关注 0票数 0

我正在使用一个useEffect钩子,并且收到一个编译器错误,显示为React Hook useEffect has missing dependencies. Either include them or remove the dependency array react-hooks/exhaustive-deps

这两个函数都是这样写的。我想知道在这个实例中如何使用useCallBack钩子。我还没找到合适的东西。任何摆脱这些编译器警告的帮助都会得到重视!

EN

回答 2

Stack Overflow用户

发布于 2020-11-04 05:12:58

我认为你发布的所有代码都在你的React组件中。不确定如何处理方法的返回值。从示例代码中看不清楚。

在添加了依赖关系数组之后,第一个关于第二个错误-这两个函数在每次渲染时都会重新声明。因此,React认为它们改变了,并将重新运行钩子。您必须将creditsgpa方法都包装在useCallback中,以避免将data作为依赖项。

就我个人而言,我会将这两种方法重构为纯函数。这意味着它们将把数据作为函数的参数,而不是从较高的作用域中获取数据。然后,如果你把它们都包装在useCallback中,它们就永远不会改变,因为它们之间没有依赖关系。然后,您可以将这两个方法与数据一起添加到useEffect钩子依赖项中,一旦数据发生更改,就会计算这两个函数。结果将与oyu只是将方法包装在useCallback中是一样的。但我认为对于纯函数,代码更容易理解。你有两个方法,这两个方法需要一些参数,一旦数据发生变化,你就运行这些方法来重新计算一些变化。

这就是我重构代码的方式:

代码语言:javascript
复制
const credits = useCallback((courses) => {
  let credits = 0
  courses.forEach((c) => (
    credits += parseInt(c.courseCredits)
  ))
  if(isNaN(credits)) credits = 0
  return credits
}, []);   // <- you have no dependencies, so it will be always same function for entire component lifecycle
  
  const gpa = useCallback((courses) => {
    let honorPoints = 0
    let credits = 0
    let cumulativeGpa = 0
    courses.forEach(c => {
      credits += parseInt(c.courseCredits)
      honorPoints += parseFloat(getGradeNumber(c.numericGrade) * c.courseCredits)
      cumulativeGpa = honorPoints / credits
    })
    if(isNaN(cumulativeGpa)) cumulativeGpa = 0
    return cumulativeGpa.toFixed(2)
  }, []);   // <- you have no dependencies, so it will be always same function for entire component lifecycle

  useEffect(() => {
    credits(data)
    gpa(data)
  }, [credits, gpa, data]); // <- credits and gpa will never change so the useEffect will run only when data change
票数 1
EN

Stack Overflow用户

发布于 2020-11-04 05:50:40

@TomášPustelník是对的,但我有另一个解决方案给你。您可以禁用eslint,例如:

代码语言:javascript
复制
  useEffect(() => {
    credits()
    gpa()
    // eslint-disable-line react-hooks/exhaustive-deps
  }, [data]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64670562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档