You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中对象字段作为useMemo依赖触发exhaustive-deps报错是否合法

问题解答

将对象的单个字段作为useMemo的依赖本身逻辑是合法的,ESLint 抛出错误并不是这个用法本身有问题,而是react-hooks/exhaustive-deps属于静态代码检查规则,它没办法动态判断你在依赖里写的badges["activity"]和回调中用到的属性是对应关系,只会识别到回调内部引用了badges这个顶层变量,因此会要求你把整个badges加入依赖数组。

你可以用以下方案解决报错,同时保证只在badges.activity变化时才重新计算iconMap:

  • 提前把需要用到的属性提取为单独的顶层变量,再把这个变量加入依赖数组:
const activityBadge = badges["activity"];
const iconMap = useMemo(() => ({
  HomeStacks: {
    iconName: "home",
    iconType: "material-community",
  },
  ActivityStacks: {
    iconName: "bell",
    iconType: "material-community",
    badgeCount: activityBadge,
  },
}), [activityBadge]);

调整后ESLint就能正确识别依赖匹配,不会再抛出错误。

  • 如果确认当前逻辑没有遗漏依赖,也可以临时禁用该行的规则检查,只需要在依赖数组行上方加注释// eslint-disable-next-line react-hooks/exhaustive-deps即可,不过该方案容易漏掉真正需要的依赖,非特殊情况不推荐使用。
  • 不推荐直接把整个badges加入依赖数组:如果badges是每次渲染都会生成的新对象,就算activity字段的值没有变化,也会触发useMemo不必要的重新计算,反而带来额外的性能开销。

内容的提问来源于stack exchange,提问作者Victor Molina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:06:09