我們來想一想要如何記錄使用者答對幾題。首先,我們利用useRef()新增一個變數correctCounter,也可以使用useState(),只是,因為我們會將內容放在result(state變數),就不必使用useState(),因為使用useState()會用掉比較多的資源,盡量少用。
在English.js裡:
const correctCounter = useRef(0);
答對時,correctCounter就加一。
<aside> 📢 注意,我們把檢查答案的邏輯移到處理點選下一題的函數(onClickNext())中,避免答對同樣題目很多次。
</aside>
function onClickNext() {
if (answer === exams[currentQuestion.current].answer) {
**correctCounter.current++;**
setResult("正確,共答對" + correctCounter.current + "題");
} else {
setResult("錯誤,共答對" + correctCounter.current + "題");
}
setAnswer("");
if (currentQuestion.current + 1 < exams.length) {
currentQuestion.current++;
setQuestion(exams[currentQuestion.current].question);
} else {
props.next();//下個單元
}
}
function onChangeAnswer(event) {
setAnswer(event.target.value);
}
要記得,換單元時,correctCounter要歸0。
useEffect(() => {
async function fetchData() {
currentQuestion.current = 0; //reset currentQuestion
**correctCounter.current = 0; //reset correctCounter**
試試看,是不是能正常計算答對的題數。
怎麼把在換單元前將本單元的得分寫進firestore? 當我們會有多個單元要記錄時,要怎麼處理? 可以利用文件中的集合。
在firestore裡,要去抓文件中的集合中的文件,很簡單。例如,以下的語法可以取得「user」集合下下,文件id為auth.currentUser.uid,「English」集合下,文件id為props.unit的文件,因為文件id必須是字串,利用「""+props.unit」將內容轉為字串
在English.js裡:
const docRef = doc(
db,
"user",
auth.currentUser.uid,
"English",
"" + props.unit
);
另外,如果文件不存在就要利用setDoc()產生文件,如果已經存在就利用updateDoc()更新文件
<aside> 📢 記得要import使用到的函數!!
</aside>
看一下範例:
async function onClickNext() {
if (answer === exams[currentQuestion.current].answer) {
correctCounter.current++;
setResult("正確,共答對" + correctCounter.current + "題");
} else {
setResult("錯誤,共答對" + correctCounter.current + "題");
}
setAnswer("");
if (currentQuestion.current + 1 < exams.length) {
currentQuestion.current++;
setQuestion(exams[currentQuestion.current].question);
} else {
//跳下個單元
const auth = getAuth(app);
**const docRef = doc(
db,
"user",
auth.currentUser.uid,
"English",
"" + props.unit
);**
const docSnap = await getDoc(docRef);
if (docSnap.exists()) {
await updateDoc(docRef, {
correctCounter: correctCounter.current
});
} else {
await setDoc(docRef, {
correctCounter: correctCounter.current
});
}
props.next(); //下個單元
}
}