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

React中为何[e.target.name]能动态更新对象属性而e.target.name不行?

为什么React中用[e.target.name]才能动态更新对象类型的state?

问题描述

我有一个包含四个输入字段的HTML表单,通过onChangeHandler事件处理器提取它们的name属性(用e.target.name获取)。现在需要复制initialState对象来更新state,同时确保触发onChange事件的输入字段值被更新。但发现直接用e.target.name作为属性名无效,而用[e.target.name]就能生效,这是为什么?

示例代码

const initialState = {
    displayName: '',
    email: '',
    password: '',
    password_confirmation: ''
}

function SignUpForm(){

    const [fieldState , setFieldState] = useState(initialState);
    const {displayName , email , password , password_confirmation} = fieldState;

    const onChangeHandler = (e) => {
        setFieldState({
            ...fieldState, // 复制现有state的所有属性
            [e.target.name]: e.target.value // 更新当前触发事件的字段值
        })
    }

    return(
        <form>
            <input type="text" name="displayName" onChange={onChangeHandler} value={displayName}/>
            <input type="email" name="email" onChange={onChangeHandler} value={email}/>
            <input type="password" name="password" onChange={onChangeHandler} value={password}/>
            <input type="password" name="password_confirmation" onChange={onChangeHandler} value={password_confirmation}/>
        </form>
    );
}

export default SignUpForm

原因解释

这是JavaScript对象字面量的语法规则导致的:

  • 普通字面量属性名:如果直接写e.target.name: e.target.value,JavaScript会把e.target.name当作一个固定的字符串属性名,而不是去计算这个表达式的值。也就是说,你实际是给对象新增了一个名为"e.target.name"的属性,而不是更新state里对应的displayName、email等属性,所以无法达到预期效果。
  • 计算属性名(方括号语法):[e.target.name]是ES6新增的计算属性名语法,它会先执行括号内的表达式e.target.name,得到当前输入框的name属性值(比如"displayName"),再把这个值作为对象的属性名。这样就能精准对应到state里的目标属性,结合展开运算符...fieldState保留其他未修改的属性,最终实现只更新当前触发事件的字段值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:41:33