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

React中如何将状态变量值作为另一状态对象的新键?

问题:如何用变量值作为对象的动态键名?

场景说明

有三个状态变量:

  • newUser:初始为空字符串,通过表单输入框修改值
  • users:初始化为 {currentUser: false}
  • userInfo:初始化为 {id: "example", amount: "x", users}

点击按钮时调用以下handleAdd函数:

const handleAdd = e => {
    e.preventDefault();
    setUsers({...users, newUser: false})
    setUserInfo({
        id: "example",
        amount: "x",
        users
    })
    setNewUser("")
} 

当前问题

输入john后,期望users对象变为:

{
  currentUser: false,
  "john": false
}

但实际得到的是:

{
  currentUser: false,
  newUser: false
}

也就是变量名newUser被当成了键名,而非它的实际值。


解决方案

使用ES6的计算属性名,将变量newUser用方括号[]包裹,这样就会取变量的实际值作为对象的键名。同时为了避免React状态更新的异步问题,先创建更新后的users对象,再复用它更新两个状态:

const handleAdd = e => {
    e.preventDefault();
    // 用计算属性名生成新的users对象
    const updatedUsers = {...users, [newUser]: false};
    setUsers(updatedUsers);
    // 直接使用刚创建的updatedUsers,避免异步状态更新导致的旧值问题
    setUserInfo({
        id: "example",
        amount: "x",
        users: updatedUsers
    });
    setNewUser("");
}

原理说明

在对象字面量中,用方括号[]包裹表达式时,JavaScript会先计算表达式的值,再将这个值作为对象的键名。比如[newUser]会直接取newUser变量的当前值(如john),而非把字符串newUser作为键。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:26:14