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

React中动态更新嵌套对象时保留原有键的问题

解决React嵌套对象状态更新时丢失原有属性的问题

你的问题出在更新嵌套对象时,没有保留原嵌套对象的已有属性——当前代码里直接用{[name]: value}替换了整个form[object]对象,自然会删掉task、other这些原有键。要保留嵌套对象的其他属性,你需要展开原嵌套对象的所有属性,再覆盖需要更新的键。

修改后的handleForm函数如下:

const handleForm = (name, value, type, object) => {
  if (object) {
    // 先展开外层form,再展开目标嵌套对象的原有属性,最后覆盖指定键
    setForm({
      ...form,
      [object]: {
        ...form[object], // 展开原嵌套对象,保留原有键值
        [name]: value
      }
    });
  } else {
    setForm({ ...form, [name]: value });
  }
};

关键说明:

  • 当需要更新嵌套对象时,...form[object]会把原嵌套对象(比如form.info)的所有属性都复制过来,再用[name]: value覆盖需要更新的键,这样就不会丢失task、other这些原有属性了。
  • 你之前的思路方向是对的,但不是用...object(因为object是字符串类型的键名,比如'info'),而是要用...form[object]来获取并展开对应的嵌套对象。

完整可运行示例:

import { useState, useEffect } from 'react';

const YourComponent = () => {
  const [form, setForm] = useState({});

  useEffect(() => {
    const obj = {
      id: 1,
      info: { information: 1, task: 2, other: 3 }
    };
    setForm(obj);
  }, []);

  const handleForm = (name, value, type, object) => {
    if (object) {
      setForm({
        ...form,
        [object]: {
          ...form[object],
          [name]: value
        }
      });
    } else {
      setForm({ ...form, [name]: value });
    }
  };

  return (
    <input
      value={form.info?.information} // 用可选链避免初始空状态下的报错
      onChange={(e) => handleForm('information', e.target.value, false, 'info')}
    />
  );
};

export default YourComponent;

额外提醒:初始状态form是空对象,直接访问form.info.information会触发报错,建议用可选链form.info?.information做安全访问。

内容的提问来源于stack exchange,提问作者Jack The Baker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:35:17