【问题标题】:Updating state arrays with React Hooks使用 React Hooks 更新状态数组
【发布时间】:2019-11-03 00:16:30
【问题描述】:

我有一个带有无线电输入的表单。每次用户选择选项时,如果与用户回答的问题相同,我必须更新包含覆盖旧答案的问题答案的数组。所以我有这个useState 在我看来,这将映射答案的旧值,如果问题的答案已经存在,则映射 Object.assign() 它,否则如果它是对新问题的新答案,则只需返回答案。但它只返回默认数组。如果它像 [{}] 一样初始化,则返回 Array[{}]。如果是[],则返回Array[]

状态是 const [answers, setAnswers] = setState([])

  const handleCheckbox = (e, question) => {
    const newAnswer = { choice: e.target.id, question: question.uuid };

    setAnswers(
      [...answers],
      answers.map(
        answer =>
          answer.question === newAnswer.question ?
          Object.assign(answer, newAnswer): 
          newAnswer
      )
    );
  };

预期:answers: [{id: 1}, {id: 2},...] 无需重复已经存在的内容。

实际:Array[]

【问题讨论】:

  • 您无法创建具有此形状的数组 [answerQuestion1: {}, answerQuestion2:{},...]。也许更多的代码会帮助我们更好地理解这个问题。非常感谢您提供代码框

标签: javascript reactjs


【解决方案1】:

不确定您要做什么,您正在使用 2 个参数调用更新程序 setAnswers,而它只需要一个参数。您的预期结果 [answerQuestion1: {}, answerQuestion2:{},...] 不是有效的 JSON 格式,并且您使用了 setState 而不是 useState

我认为你应该重构你的模型,为什么不使用状态变量answers的对象,它会是这样的:

const [answers, setAnswers] = useState({});

const handleCheckbox = (e, question) => {
  const id = question.uuid;
  const value = e.target.id; // Maybe you could use e.target.value or e.target.name

  setAnswers(prevAnswers => ({
     ...prevAnswers,
     [id]: value
  }));
};

【讨论】:

  • 是的。我打错了 setState() 而不是 useState()。原代码是对的。
  • 有效!但是还是有一点小问题。当事件第一次触发时,对象保持为空,只有在第一次触发后它才用实际值更新对象。
  • 我真的不明白是什么问题?你的意思是第一个事件不更新状态变量?你是怎么检查的?也许问题来自产生渲染的代码?
  • 我使用 id 是因为我的选择对象的结构。选择是独一无二的。 e.target.value 重复其他问题,但我可以使用 e.target.name。使用 value 或 name 代替 id 是否有特定原因?
  • 请注意setAnswers 是异步的。如果您在setAnswers 之后添加console.log,您将看不到更新的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2020-06-19
  • 2019-08-08
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2021-03-16
相关资源
最近更新 更多