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

React中useState计数器每次增减2而非1的问题排查

问题解决方案

1. 计数器点击一次增减2的问题

原因

  • React 18开发环境的严格模式会执行两次状态更新函数,用于检测副作用,这会导致开发时看到计数器变化两次(生产环境不会出现此问题)。
  • 当前状态更新时直接修改了数组内对象的属性,虽展开了数组,但对象仍是原引用,可能引发不必要的重渲染或状态异常。

修复方案

遵循React不可变更新原则,创建新对象来更新count,避免直接修改原对象:

const decrementCount = (index) => {
  setProduct((prevState) => {
    return prevState.map((item, i) => {
      if (i === index) {
        return {
          ...item,
          count: Math.max(0, item.count - 1)
        };
      }
      return item;
    });
  });
};

const incrementCount = (index) => {
  setProduct((prevState) => {
    return prevState.map((item, i) => {
      if (i === index) {
        return {
          ...item,
          count: Math.min(10, item.count + 1)
        };
      }
      return item;
    });
  });
};

若需验证是否为严格模式导致,可暂时移除index.js中的<React.StrictMode>包裹,生产环境无需额外处理。

2. products.map is not a function错误

原因

你曾尝试在状态更新函数中返回updatedProducts[index].count(单个数字),这会将product状态从数组类型覆盖为数字类型,后续调用product.map自然报错。

修复方案

  • 确保setProduct始终接收数组类型的值,状态更新函数的返回值必须是完整数组,不能是单个元素的属性。
  • 为避免API请求失败或初始状态异常导致的非数组情况,渲染时增加数组类型判断:
{Array.isArray(product) && product.map((item, index) => {
  // 原渲染逻辑
})}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:24:54