Javascript 反应-计数复选框
我的React组件中的一些复选框出现问题: 我遇到的问题是,当检查两个正确答案时,分数没有正确反映。我正在尝试设置它,以便在检查正确答案时,分数增加一分。如果未选中正确答案,则应删除该增加。如果检查了错误答案,则不应增加或减少任何分数。然而,在这里的第一个问题上,当我检查一个正确答案时,分数会增加,但当我检查第二个正确答案时,分数会降低Javascript 反应-计数复选框,javascript,reactjs,Javascript,Reactjs,我的React组件中的一些复选框出现问题: 我遇到的问题是,当检查两个正确答案时,分数没有正确反映。我正在尝试设置它,以便在检查正确答案时,分数增加一分。如果未选中正确答案,则应删除该增加。如果检查了错误答案,则不应增加或减少任何分数。然而,在这里的第一个问题上,当我检查一个正确答案时,分数会增加,但当我检查第二个正确答案时,分数会降低 如果有任何意见,将不胜感激 我认为你可能处理错了国家。您要做的是设置静态项并单击检查它们是否正确,但如果不正确则不检查。这样一来,问题就出现了: 你没有跟踪什么
如果有任何意见,将不胜感激 我认为你可能处理错了国家。您要做的是设置静态项并单击检查它们是否正确,但如果不正确则不检查。这样一来,问题就出现了:
应答选项:[
{回答文字:“纽约”,isCorrect:false,checked:false},
{回答文字:“伦敦”,isCorrect:false,checked:false},
{回答文字:“巴黎”,isCorrect:true,checked:false},
{回答文字:“都柏林”,isCorrect:true,checked:false}
]
然后,在handleChange中,传递该项并将选中的值更改为true
之后,您只需更新分数:
setScore(score.filter(a => a.isCorrect && a.checked).length)
请注意,这不会删除错误答案的分数,但您也可以通过这种方式获得该分数
setScore(answers.filter(a => a.isCorrect && a.checked).length - answers.filter(a => !a.isCorrect && a.checked).length)
并为当前问题的答案设置答案
编辑
忘记提到最后一部分的答案。您应该在整个测验过程中使用
useState
跟踪选中的答案。
为了做到这一点,我将所有问题移动到useState
中,并为每个checked:false
添加了一个新属性
const [questions, setQuestions] = useState(initialQuestions);
要管理用户单击,您有一个功能handleAnswerOptionClick
。此函数的主要优点是,只有单击的答案才应选中它的状态(选中:!previousCheckedValue
)。对于类型为的问题,当用户单击一个问题时,将自动取消选中所有其他问题
const handleAnswerOptionClick = (e, questionId) => {
const answerTextValue = e.target.value;
const updatedQuestions = questions.map((question) => {
if (question.id === questionId) {
const updatedAnswersOptions = question.answerOptions.map((answer) => {
if (answer.answerText === answerTextValue) {
return { ...answer, checked: !answer.checked };
} else {
return question.questionType === "select"
? { ...answer, checked: false }
: answer;
}
});
return { ...question, answerOptions: updatedAnswersOptions };
} else {
return question;
}
});
setQuestions(updatedQuestions);
};
除了管理checked
状态外,您还可以包括usemo
钩子来计算所有问题中正确答案的数量。请注意,如果答案为某个问题选择了多个正确答案,则分数将增加多个正确答案
const score = useMemo(() => {
return questions.reduce((acc, q) => {
const correctAnswerSelected = q.answerOptions.reduce((acc, answer) => {
if (answer.checked && answer.isCorrect) {
acc = acc + 1;
}
return acc;
}, 0);
acc = acc + correctAnswerSelected;
return acc;
}, 0);
}, [questions]);
这是工作代码沙盒:谢谢Alex,这真的很有帮助。您能再解释一下如何更新handleChange吗?首先,您的checked值应该设置为您answerOption的checked属性。第二,在你的handleChange中,你应该更新状态,以反映答案现在已被检查。第三,你现在更新分数,这也是我不真正使用挂钩的原因,因为你的问题不能更新,因为它们是道具,因此是不变的。你也应该考虑让他们在州,所以他们可以被更新,谢谢你的帮助。唯一的问题是,在问题1中,如果选择了两个正确答案,则分数只显示“1”,您希望它计为2?是的,我希望它计为2。我编辑了一个答案,更改在usemo
中。祝你好运:)我看到了更新后的沙盒,它现在可以工作了。非常感谢你!