这个测验不会阻止已回答的问题。

13 浏览
0 Comments

这个测验不会阻止已回答的问题。

这个测验大体上运行良好,但当我在同一个答案上点击两次时,得分会计算两次,就好像我点击了100次一样。我不知道怎么修复它...请帮帮我...

QuestionBox:

const QuestionBox = ({ question, options, selected }) => {
    const [answer, setAnswer] = useState(options);
    return (
            {question}
            {(answer || []).map((text, index) => (
                
            ))}
    )
}

computeAnswer:

computeAnswer = (answer, correctAnswer) => {
        if (answer === correctAnswer) {
            this.setState({
                score: this.state.score + 1,
            })

render:

{this.state.qBank.map(
                            ({ question, answers, correct, id }) => (
                                 this.computeAnswer(Answers, correct)} />
                            )
                        )}

0
0 Comments

问题出现的原因是,当用户点击问题的答案按钮时,无论是否已经回答过该问题,都会触发计分逻辑。这可能导致用户多次回答同一问题,并且得分计算不正确。

要解决这个问题,可以在QuestionBox组件的状态中添加一个布尔型标志,初始值为false,在第一次点击时将其切换为true。然后,如果该标志为true,则绕过得分计算:

const QuestionBox = ({ question, options, selected }) => {
    const [answer, setAnswer] = useState(options);
    const [alreadyAnswered, setAlreadyAnswered] = useState(false);
    return (
        <div className="questionBox">
            <div className="question">{question}</div>
            {(answer || []).map((text, index) => (
                <button disabled={alreadyAnswered} key={index} className="answerBtn" onClick={() => {
                    if(!alreadyAnswered) {
                        setAnswer([text]);
                        selected(text);
                        setAlreadyAnswered(true);
                    }
                }}>{text}</button>
            ))}
        </div>
    )
}

我还添加了disabled属性,如果问题已经回答过,则让用户知道这是一次性的。此外,将onClick逻辑放在一个函数中可以提高性能。

顺便提一下,最好避免用props来初始化状态,可以参考这个问题中的回答:

React component initialize state from props

避免用props来初始化状态 如果你指的是那个顶部的答案,问题似乎是设置了一个从props永远不会改变的状态,但是在这里,状态是通过setAnswer进行更改的,对吧?还是你指的其他问题?

确实,在这种情况下应该没有问题,但我认为提及一般情况下不好的做法是一个好主意,不应该形成习惯。

如果用props来初始化状态是一个不好的做法,那么有什么替代方案吗?你是指父组件应该处理所有子组件的状态吗?

通常的做法是,父组件将值和setter传递给子组件,并在子组件中使用props来显示数据,并将setter作为事件处理程序来修改props的值,可以参考这里的描述:

reactjs.org/tutorial/tutorial.html#lifting-state-up。但在某些情况下,这种方法不适用,但在这里,我认为这是一个有效的方法。

谢谢,明白了。感谢你的帮助!

0
0 Comments

问题的出现原因是因为在点击按钮后,即使已经选择了答案,仍然可以继续点击按钮来增加分数。解决方法是只有在数组answer的长度大于1时,才给按钮添加点击监听器。这样,一旦用户选择了答案,后续对按钮的点击将不会有任何效果,分数也只会在第一次点击按钮时(可能)被增加。

另外,answer这个变量名对于一个包含答案字符串的集合来说有点奇怪,可以考虑将其改为answerOptions或者possibleAnswers等更易读的名称。

0