useEffect props 回调函数导致无限循环

2024-04-03

我有一个与此非常相似的问题 -如何修复 React Hook useEffect 中缺少的依赖项 https://stackoverflow.com/questions/55840294/how-do-i-fix-missing-dependency-in-react-hook-useeffect.

有一个关键的区别 - 我将 fetch 函数传递给要从中调用的子组件使用效果 https://reactjs.org/docs/hooks-effect.html,所以我不能简单地将函数移动到效果主体中。每次渲染都会重新创建 fetch 函数并导致无限循环。我有其他本地组件状态,我想触发该效果。

我基本上有一个容器组件和一个演示组件。 MyPage 是 MyGrid 的父级并设置所有 redux 状态:

const MyPage = () => {

  const dispatch = useDispatch();
  const items= useSelector(selectors.getItems);
  const fetching = useSelector(selectors.getFetching);
  const fetchItems = opts => dispatch(actions.fetchItems(opts));

  return (
    <>
      {fetching && <div>Loading...</div>}
      <h1>Items</h1>
      <MyGrid
        items={items}
        fetchItems={fetchItems}
        fetching={fetching}
      />
    </>
  );

}

const MyGrid = ({ fetchItems, items, fetching }) => {

  const [skip, setSkip] = useState(0);
  const take = 100;
  const [sorts, setSorts] = useState([]);

  // when query opts change, get data
  useEffect(() => {

    const options = { skip, take };
    const sortString = getSortString(sorts);
    if (sortString) options['sort'] = sortString;
    fetchItems(options);

  }, [fetchItems, skip, sorts]);

在“MyGrid”中,“跳过”和“排序”可以更改,并且应该使效果生效。

“fetchItems”每次都会重新创建并导致无限循环。这 是我的问题。

现在,eslint react-hooks/exhaustive-deps 规则让我将 fetchItems 放入依赖项列表中。我有更漂亮的设置来在保存时自动修复,这使得情况变得更糟。

我知道容器/演示模式已经过时了,但它适合我的情况 - 我可能允许动态地将 MyGrid 替换为 MyList,并且不想在每个子组件中重复所有 redux 内容。

我尝试过了使用回调 https://reactjs.org/docs/hooks-reference.html#usecallback and useMemo https://reactjs.org/docs/hooks-reference.html#usememo,但 eslint 只是让我将所有相同的依赖项放入其依赖项数组参数中。

除了禁用 eslint 规则之外还有其他方法吗

// eslint-disable-next-line react-hooks/exhaustive-deps

使这项工作有效?


有两种方法可以让它发挥作用。

Firstly, using useCallback对于 fetchItem 之类的

const fetchItems = useCallback(opts => dispatch(actions.fetchItems(opts)), [dispatch, actions]);

Secondly using dispatch直接在子组件中

const dispatch = useDispatch();
 useEffect(() => {

    const options = { skip, take };
    const sortString = getSortString(sorts);
    if (sortString) options['sort'] = sortString;
    dispatch(actions.fetchItems(options));

  }, [dispatch, actions, skip, sorts]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

useEffect props 回调函数导致无限循环 的相关文章

随机推荐

  • TCP recvfrom() 不存储“from”

    我正在使用 TCP 制作一个服务器程序 我想获取我刚刚收到的消息发送者的 IP 地址 这是我的代码 case FD READ Incoming data get ready to receive char buffer DEFAULT BU
  • 如何让 jquery 拖动在移动设备上工作?

    我有一个应用程序 允许用户拖动一些图像 它使用jquery 我试图让它在移动设备上工作 在iPhone上 如果我拖动图像 那么它会拖动整个页面 我想使用 jquery 移动 这是正确的方法吗 如果是这样 从常规 jquery 过渡到 jqu
  • 使用查询结果作为表名

    如果我们有如下表 A Table 如何执行涉及以下值的查询A table作为表名 我的意思是这样的 SELECT Table as tbl FROM A SELECT FROM tbl 但在一份声明中 SQLite没有内置的动态构造SQL语
  • Gephi 中的平行边是什么?导入边列表时如何处理它们?

    当我导入 gexf 文件时 它会标记一堆平行边 我不知道什么是平行边以及为什么我的图表存在问题 我正在尝试创建一个动态 gephi 图 如果一对两个节点之间有多条边 这些边彼此平行 因此它们是平行边 Gephi 中无法表示平行边 因此 Ge
  • Github 错误:找不到存储库(是的,还有另一个)

    我在这里搜索并阅读了大多数类似的问题 但似乎没有一个与我的相同 我在 Github 上有一个私人仓库 一个小时前我可以很好地推送 现在 我收到错误 未找到存储库消息 我的 ssh config 中有以下内容 Host github Host
  • GitHub:我为什么要分叉?

    我知道分叉是在服务器端克隆存储库 但我不明白为什么我要这么做 为什么不将原始存储库克隆到我的计算机 添加我的代码 而不是将新分支推送到 GitHub 并发出拉取请求 我知道分叉是在服务器端克隆存储库 差不多是这样吧 在 GitHub 上 分
  • JQuery 将变量从 href 传递到 load()

    我试图在 JQuery 中将 href id 传递给 load 我可以从警报中看到返回的 id 960 所以我知道 id 值已经过去了 我只是不知道如何附加加载 url refreshme add id 是重要的部分 我用它来刷新数据库拉取
  • 检查具有关联的对象

    我有两个模型 其中 A has many B 如果我加载 A 包括关联的 B a A find first include bs a inspect只显示a的属性 gt a 我能怎么做a inspect这样它就会显示所有关联的a bs 默认
  • Android 旋转位图而不进行复制

    有没有办法旋转位图而不复制它 或者也许是保存位图的图像视图 现在我有类似的东西 Bitmap bm BitmapFactory decodeFile get the orientation Matrix m new Matrix m pos
  • Linux 内核的静态调用图生成

    我正在寻找一个工具来静态生成 Linux 内核的调用图 对于给定的内核配置 生成的调用图应该是 完整的 即包含所有调用 包括潜在的间接调用 我们可以假设在 Linux 内核的情况下只能通过使用函数指针来完成调用 例如 这可以通过分析函数指针
  • pytest。使用堆叠参数化装饰器时定义预期结果的最佳方法?

    我有两个类似的测试用例 每个都有超过 100 行代码 这些代码为测试创建辅助对象 这些行非常相似 事实上 测试设置之间只有 2 行不同 我不想删除这些代码重复 我认为多个参数化可能会帮助我完成这项任务 使用多个参数化 我可以将设置组合起来
  • PHP会话文件权限

    我有文件index php
  • WebLogic 和 OSGi

    有没有办法在 Weblogic 应用程序服务器中运行 OSGi 容器 我知道它可以与 JBoss Glassfish 配合使用 并且可以将 Equinox servlet 桥添加到您的 OSGi 项目中 桥的实现太旧了 但我想要类似 JBo
  • npm install packagename --save-dev 不更新 package.json

    有没有简单或微妙的原因package json运行 save dev 后不会更新吗 这是我的命令 npm install modulename save dev 从项目的根目录运行 命令成功 新模块按预期显示在 node modules 目
  • 如何增加TabLayout中选项卡的图标大小

    我正在尝试增加应用程序中选项卡的图标大小 图标大小是固定的 尝试了很多方法 但没有任何效果 最后尝试了以下方法 但大小没有改变 如果有人能告诉我正确的方法 我会很高兴 提前致谢 这是我的代码 Toolbar toolbar Toolbar
  • @TransactionalEventListener 不起作用,因为 @EventListener 对于相同上下文就像魅力一样工作

    我正在从事 Spring Boot 应用程序的事件驱动设计 该代码由以下文件组成 Spring boot ApplicationEvent 文件 即 MyBusinessEvent java Data AllArgsConstructor
  • 有谁知道如何在 Rails 2.3 中正确处理用户时区?

    我们正在构建一个 Rails 应用程序 需要在多个时区显示日期 更重要的是计算日期 谁能告诉我如何在 Rails 2 3 5 或 8 中使用用户时区 我见过的最具包容性的文章详细介绍了用户时区的工作原理 如下 http wiki rubyo
  • 是否可以编辑 JWT 令牌的过期时间?

    我是智威汤逊世界的新手 很高兴在这里获得一些帮助 我有一个应用程序可以与这个出色的解决方案完美配合 但在用户登录我的应用程序时发现延长令牌过期的一个小问题 换句话说 我想在用户每次使用他以前的 JWT 访问我的应用程序时更新过期时间 有没有
  • 通过xmpp在android中传输文件?

    我只是想通过 xmpp 传输文件 我正在使用 asmack lib 我在下面遇到异常 E AndroidRuntime 332 FATAL EXCEPTION main E AndroidRuntime 332 java lang Null
  • useEffect props 回调函数导致无限循环

    我有一个与此非常相似的问题 如何修复 React Hook useEffect 中缺少的依赖项 https stackoverflow com questions 55840294 how do i fix missing dependen