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

为什么我的React组件中的变量i未按照预期实现递增更新功能?

问题原因解答

你代码里的变量i存在的核心问题是它是函数组件内部的普通局部变量,会在组件每次重新渲染时被重置为初始值0,具体逻辑如下:

  • 组件首次渲染时,i被赋值为0,状态number初始值也为0,页面展示数值0
  • 点击+号触发increment:i自增为1,调用setNumber(1)触发组件重新渲染
  • 组件重新渲染时,整段Compteur函数代码重新执行,let i = 0 会再次运行,i被重置回0
  • 后续每次点击触发状态更新后,i都会被重置为0,所以每次自增/自减后都只会得到1或-1,无法完成连续的数值累加/累减

而你改为setNumber(number + 1)后功能正常,是因为number是通过useState声明的响应式状态:React会在内部持久化存储这个状态值,不会随着组件重新渲染被重置,每次渲染时拿到的都是上一次更新后的最新值,所以可以正确完成连续计数。

如果你确实需要在组件内声明跨渲染保留值的变量,可以使用useRef Hook,示例如下:

import React, { useState, useRef } from "react";

const Compteur = () => {
  // useRef的current值会跨渲染持久化,不会被重置
  const i = useRef(0);
  const [number, setNumber] = useState(0);

  const increment = () => {
    i.current++;
    setNumber(i.current);
  };

  const decrement = () => {
    i.current--;
    setNumber(i.current);
  };

  return (
    <div>
      <button type="button" onClick={increment}>
        +
      </button>
      <button type="button" onClick={decrement}>
        -
      </button>
      <p>Number : {number}</p>
    </div>
  );
};

export default Compteur;

不过这个计数场景直接使用useState状态更新就足够,不需要额外定义变量存储计数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:54:04