export default function Quiz() {
const [userAnswers, setUserAnswers] = useState([]);
const activeQuestionIndex = userAnswers.length;
const quizIsComplete = activeQuestionIndex === QUESTIONS.length;
function handleSelectAnswer(selectedAnswer) {
setUserAnswers((prevUserAnswers) => {
return [...prevUserAnswers, selectedAnswer];
});
}
const handleSkipAnswer = useCallback(() => handleSelectAnswer(null), [handleSelectAnswer]);
if (quizIsComplete) {
return (
<div id="summary">
<img src={quizCompleteImg} alt="Trophy icon" />
<h2>Quiz Completed!</h2>
</div>
);
}
const shuffledAnswers = [...QUESTIONS[activeQuestionIndex].answers];
shuffledAnswers.sort(() => Math.random() - 0.5);
return (
<div id="quiz">
<div id="question">
<QuestionTimer
key={activeQuestionIndex}
timeout={10000}
onTimeout={() => handleSelectAnswer(null)}
/>
<h2>{QUESTIONS[activeQuestionIndex].text}</h2>
<ul id="answers">
{shuffledAnswers.map((answer) => (
<li key={answer} className="answer">
<button onClick={() => handleSelectAnswer(answer)}>
{answer}
</button>
</li>
))}
</ul>
</div>
</div>
);
}
here is my Quiz component, and in the return block, i have a
<QuestionTimer
key={activeQuestionIndex}
timeout={10000}
onTimeout={() => handleSelectAnswer(null)}
/>
the key here is used to update the QuestionTimer component when the state userAnswers changes, What i think is the new-coming QuestionTimer component will generated when the userAnswers change, and the old QuestionTimer is gone. Next is the detail of QuestionTimer.
export default function QuestionTimer({ timeout, onTimeout }) {
const [remainingTime, setRemainingTime] = useState(timeout);
useEffect(() => {
console.log('SETTING TIMEOUT');
const timer = setTimeout(onTimeout, timeout);
return () => {
clearTimeout(timer);
};
}, []);
useEffect(() => {
//console.log('SETTING INTERVAL');
const interval = setInterval(() => {
setRemainingTime((prevRemainingTime) => prevRemainingTime - 100);
}, 100);
return () => {
clearInterval(interval);
};
}, []);
return <progress id="question-time" max={timeout} value={remainingTime} />;
}
the problem is why i need the clearTimeout(timer); and clearInterval(interval);,
In my view, whether to clean up or not doesn't make a difference, as a new QuestionTimer is generated.
i have tried the scenario without two line code,but i cannot run the application properly.