【发布时间】:2020-12-02 03:07:41
【问题描述】:
我的测验组件包含两种类型的问题(一种正确答案和免费答案的问题)。我需要以以下格式将答案发送到后端:
[
{
questionId: 'test-id',
answers: ['answerId']// send answer id if this is question with one correct answer
},
{
questionId: 'test-id',
answers: ['answerId']// send answer id if this is question with one correct answer
},
{
questionId: 'test-id-2',
freeAnswer: 'some text' // send freeAnswer if it is open ended question
}
...
]
我创建了两个处理程序:一个用于文本区域,一个用于单选按钮,
const handleOptionChange = ( question, answer) => {
onChangeQuestionAnswer(question, answer, 'oneCorrectAnswer')
}
const handleFreeAnswerChange = (value, question) => {
onChangeQuestionAnswer(question, value, 'freeAnswer')
}
父组件中的一个通用处理程序来处理所有答案:
const [chosenAnswers, setChosenAnswers] = useState([])
const handleChangeQuestionAnswer = (
questionId,
answerId,
type
) => {
const foundedId = chosenAnswers.find(item => item.id === questionId)
if (!foundedId) {
if (type === 'oneCorrectAnswer') {
setChosenAnswers([...chosenAnswers, { id: questionId, answers: [answerId] }])
} else {
setChosenAnswers([...chosenAnswers, { id: questionId, freeAnswer: answerId }])
}
} else {
const newResultArray = chosenAnswers.map(item => {
if (item.id !== questionId) {
return item
}
if (type === 'oneCorrectAnswer') {
return {
...item,
answers: [answerId]
}
} else {
return {
...item,
freeAnswer: answerId
}
}
})
setChosenAnswers(newResultArray)
}
}
然后我只是将chosenAnswers 发送到 API。这种方法有效,但对我来说它看起来很奇怪而且开销很大,我可以以某种方式简化这个逻辑吗?
【问题讨论】:
-
嘿,我提交了一个重构版本的代码,该版本删除了一些重复的逻辑并遵循最佳实践(在思考过程中有一些 cmets)。希望对您有所帮助。
-
switch/case和if/else一样,并不能解决问题。我建议你阅读这两本书:重构和清洁代码
-
@chonnychu 我会做的,谢谢
标签: javascript reactjs