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

如何使用setState更新子列表中对象实例的属性

问题:更新React状态中嵌套数组对象的属性

我有一个quiz对象,它包含questions列表,列表中的每个question对象都有对应属性。我想要更新questions列表中某个question对象里名为question的属性(已知命名规范不佳),且不想创建该选中question的独立实例。

我原本写了这段代码,但在选中待编辑question的方括号部分出现语法错误:

onChange={(e) => setQuiz({ ...quiz, questions[quiz.questions.indexOf(selectedQuestion)].question: e.target.value })} 

错误提示:

Unexpected token, expected ","

解决方案

直接通过map遍历questions数组,定位到目标索引的对象后更新对应属性,同时保留其他对象的原有状态,既满足不创建独立实例的需求,也符合React状态更新的不可变原则。

完整可运行代码

import { useState, useEffect } from 'react';

function App() {
  const [quiz, setQuiz] = useState({
    title: "",
    number: 6,
    questions: [
      { question: "item1", number: 3 },
      { question: "item2", number: 3 }
    ]
  });

  const [selectedQuestion, setSelectedQuestion] = useState(0);

  useEffect(() => {
    setSelectedQuestion(0);
  }, []);

  useEffect(() => {
    console.log("quiz", quiz);
    console.log("quiz question", quiz.questions[0]);
  }, [quiz]);

  useEffect(() => {
    console.log("selectedQuestion", selectedQuestion);
  }, [selectedQuestion]);

  return (
    <div className="App">
      <input
        type="text"
        value={quiz.questions[selectedQuestion].question}
        onChange={(e) =>
          setQuiz({
            ...quiz,
            questions: quiz.questions.map((child, index) =>
              index === selectedQuestion
                ? { ...child, question: e.target.value }
                : child
            )
          })
        }
      />
    </div>
  );
}

export default App;

错误原因说明

你原来的写法在对象字面量中直接使用questions[xxx].question作为键名,这不符合JavaScript语法规范。对于嵌套数组类型的React状态,不能直接通过路径修改属性,必须通过遍历数组、复制并更新目标元素的方式来完成状态更新,确保状态的不可变性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:24:26