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

为什么修改React state对象属性时,改第二个属性第一个就重置?

问题原因
  • 你将状态更新方法changeCalculation直接存放在了state的初始对象中,该方法在初始化时就闭包捕获了第一次渲染的初始calcInfo值。后续所有调用这个方法更新状态时,都是基于初始值展开修改,之前修改的其他属性自然会被覆盖回默认值。
  • state本质上应该只存储业务相关的纯数据字段,更新方法不需要存放在state内部,属于不合理的设计问题。
修复方案

将更新方法从state中抽离,同时使用setState的函数式更新写法避免闭包捕获旧值问题,修复后的代码如下:

1. 修复CalculatorProvider逻辑

const CalculatorContext = React.createContext();
const CalculatorProvider = (props) => {
  // state仅存放纯数据字段
  const [calcInfo, setCalcInfo] = useState({
    initial_investment: 10000,
    monthly_contribution: 1000,
    length_of_time_years: 40,
    interest_rate_per_year: 7,
    result: 2636200,
  });

  // 更新方法抽离到Provider内部,不存入state
  const changeCalculation = (value, property) => {
    // 函数式更新保证每次基于最新的状态修改,彻底规避闭包旧值问题
    setCalcInfo(prevState => ({...prevState, [property]: value}));
  }

  // 组装context的值,包含数据和更新方法
  const contextValue = {
    ...calcInfo,
    changeCalculation
  }

  return (
    <CalculatorContext.Provider value={contextValue}>
      {props.children}
    </CalculatorContext.Provider>
  )
}

2. 滑块控件代码无需修改

原有滑块的调用逻辑可以直接复用,不需要改动。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:48:02