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

React函数组件中对象状态动态属性的合并更新问题

问题解决:React对象状态的批量更新合并

你的问题出在updateObj函数计算新值时,用的是闭包捕获的旧obj,而非状态更新时的最新prevState。连续调用updateObj时,两次更新都基于同一个初始状态计算,导致后一次覆盖前一次的修改。

修正方法很直接,把属性值的计算逻辑移到setObj的回调函数里,依赖prevState来计算新值,这样每次更新都会基于上一次的最新状态:

let newObj = {
    a: 1,
    b: 2,
    c: 3,
}

let [obj, setObj] = React.useState(newObj)

function updateObj(keys, values) {
    setObj(prevState => {
        const updatedValues = {};
        keys.forEach((key, index) => {
            // 用prevState获取当前最新的属性值,而非闭包里的旧obj
            updatedValues[key] = prevState[key] + values[index];
        });
        return {...prevState, ...updatedValues};
    });
}

function changeState() {
    updateObj(['a', 'c'], [1, 1])//给a和c各加1
    updateObj(['a', 'b', 'c'], [-1, 1, -1])//给a减1,b加1,c减1
    // 现在最终会得到 {a: 1, b: 3, c: 3}
}

React.useEffect(() => {console.log(obj)}, [obj])

return (
    <someComponent onMouseDown={()=>changeState()}/>//此处更新状态
)

关键说明:

  • React的setState是异步批量更新的,同一个事件循环里的多次setState会被合并处理。
  • 当需要基于前一次状态计算新状态时,必须使用函数式更新(给setObj传回调函数),确保每次拿到的prevState都是最新的状态值,避免闭包导致的旧值问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:58:36