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

React中如何通过表单输入修改对象数组内的对象值?

解决React健身追踪器表单修改数组内对象的问题

你的核心问题在于updateForm只能处理顶层的扁平字段(比如title、date),而exercises是嵌套的数组对象,需要针对性处理。下面是具体的解决步骤:

1. 给表单元素添加索引和字段标识

渲染exercises数组时,每个输入框需要明确告诉函数:要修改的是第几个exercise的哪个属性。直接通过回调函数传递索引和字段名即可:

{formData.exercises.map((exercise, index) => (
  <div key={index}>
    <input
      type="text"
      value={exercise.Exercise}
      onChange={(e) => updateExercise(e, index, "Exercise")}
      placeholder="训练项目"
    />
    <input
      type="text"
      value={exercise.Reps}
      onChange={(e) => updateExercise(e, index, "Reps")}
      placeholder="次数"
    />
    <input
      type="text"
      value={exercise.Sets}
      onChange={(e) => updateExercise(e, index, "Sets")}
      placeholder="组数"
    />
  </div>
))}

2. 编写专门处理exercise的更新函数

单独写一个updateExercise函数,处理嵌套数组对象的更新,严格遵循React状态不可变原则:

const updateExercise = (e, index, field) => {
  setFormData(prev => {
    // 复制原数组,避免直接修改原状态
    const newExercises = [...prev.exercises];
    // 复制目标exercise对象,更新指定字段
    newExercises[index] = {
      ...newExercises[index],
      [field]: e.target.value
    };
    // 返回全新的formData对象
    return {
      ...prev,
      exercises: newExercises
    };
  });
};

3. 保留原函数处理顶层字段

原updateForm继续负责title、date这类顶层字段的更新:

const updateForm = (e) => {
  setFormData((currentFormData) => ({
    ...currentFormData,
    [e.target.name]: e.target.value,
  }));
};

扩展:添加新训练项的逻辑

如果需要动态添加训练项,可以基于同样的不可变原则扩展:

const addNewExercise = () => {
  setFormData(prev => ({
    ...prev,
    exercises: [...prev.exercises, { Exercise: "", Reps: "", Sets: "" }]
  }));
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:00:24