簡體   English   中英

如果問題ID相同,如何在setState中更新對象,否則添加到setState

[英]How to update the object in setState if the questionID same otherwise add to setState

有一個反應調查表組件,它向this.state = { answer: []}添加選定的答案,效果很好。 用戶更新答案的同時,它又添加為另一個對象。 questionID相同時,是否有任何選項可以更新setState的對象?

 onChange(event) { const field = event.target.name; let question = event.target.dataset.questionId; let result = event.target.value; let answer = { 'questionID': question, 'answerValues': result }; this.setState({ answer: [ ...this.state.answer, answer, ] }); console.log(this.state.answer); } 

目前同樣添加的問題是這樣的

[ 
  {
    "questionID": 1,
    "answerValues": 2
  },
  {
    "questionID": 2,
    "answerValues": 5
  }
  {
    "questionID": 1,
    "answerValues": 1
  }
]

如果已經存在相同的questionID那么任何更新對象的解決方案都是this.state.answer嗎?

您需要使用對象分配,在此代碼中,如果ID已經存在該問題,您將能夠更新該問題,否則它將添加一個新問題

  const field = event.target.name;
  let question = event.target.dataset.questionId;
  let result = event.target.value;
  let newAnswer = {
    'questionID': question,
    'answerValues': result
  };
   this.setState(prevState => {
            const user = prevState.answer.find(d => d.questionID === newAnswer.questionID);
            if (!!user) {
                Object.assign(user, newAnswer);
                const data = prevState.answer.map(d => d.questionID === user.questionID ? user : d);
                return { answer: data }
            } else {
                return { answer: prevState.answer.concat(newAnswer)};
            }
        })

就像馬丁說的那樣

let questionExistsInState = (this.state.answer.some((ans) => (ans.questionId === answer.questionId)));
let newState = []
if(questionExistsInState) {
  newState = this.state.answer.map((ans) => (ans.questionId === answer.questionId ? answer : ans))
} else {
  newState = [answer, ...this.state.answer]
}
this.setState({
    answer: newState ,
  });

我也看到您在onChange事件中使用setState。 請注意,setState不是同步操作,如果在setState()調用后立即進行控制台日志記錄,則無法保證將看到新狀態。 您可以控制台登錄setState函數的回調(第二個參數)。

我建議將答案存儲為對象,其中鍵是問題ID,值是答案。 在您的構造函數中:

this.state = { answer: {}}

然后在onChange()

this.setState({
    answer: Object.assign({}, this.state.answer, {
        [question]: result,
    });
});

您可以這樣減少:

this.setState({
  answer: this.state.answer.reduce((acc,ans)=>{
    return ans.questionID === answer.questionID
      ? [...acc,answer]
      : [...acc,ans]
  },[])
})

您可以像使用數組映射一樣

this.setState({
    answer: this.state.answer.map(
     (existingAnswer) => (existingAnswer.questionID === answer.questionID 
        ? answer : existingAnswer)),
  });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM