1. 여러 퀴즈를 렌더링 하기위해 각 순서에 따라 id 값을 주었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
const quizzes =
[
{
id:1,
question: "나는 몇 학년일까요?",
answers:
[
{text: "1학년", isCorrect: false},
{text: "2학년", isCorrect: false},
{text: "3학년", isCorrect: false},
{text: "4학년", isCorrect: true},
],
},
{
id:2,
question: "나는 몇 살일까요?",
answers:
[
{text: "21살", isCorrect:false },
{text: "22살", isCorrect:false },
{text: "23살", isCorrect:false },
{text: "24살", isCorrect:true },
],
},
...
|
2. currentNo 변수로 버튼을 클릭할 때마다 +1 되어 다음 문제로 넘어간다.
state 사용 - 컴포넌트 안에서 관리하는 변수
: state가 변경되면 state가 속한 컴포넌트가 다시 렌더링된다. state 사용하기 위해 useState 함수를 사용한다.
const [상태 값 저장 변수, 상태 값 갱신 함수] = useState(상태 초기 값);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
const [currentNo , setCurrentNo] = useState(0); // 페이지 넘기기 state
...
const handleClick = (isCorrect) => {
if(isCorrect){
alert("정답!");
setScore(score => score+1);
}
else{
alert("오답입니다.");
}
setCurrentNo((currentNo) => currentNo + 1);
};
...
<div className = "question-section">
<h1 className="question-header">
<span>{quizzes[currentNo].id}</span>/{quizzes.length}
</h1>
<div className="question-text">{quizzes[currentNo].question}</div>
</div>
<div className="answer-section">
{quizzes[currentNo].answers.map((answer)=>(
<button
value={answer.text}
onClick={() => handleClick(answer.isCorrect)}
>
{answer.text}
</button>
...
|
cs |
3. 최종 결과 - 점수 표시하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
function App(){
const [currentNo , setCurrentNo] = useState(0); // 페이지 넘기기 state
const [showResult, setShowResult] = useState(false); // 퀴즈 끝 페이지 State
const [score, setScore] = useState(0); // 퀴즈 점수 표시
const convertedScore = Math.floor((score/quizzes.length)*100); //점수 계산
const handleClick = (isCorrect) => {
if(isCorrect){
alert("정답!");
setScore(score => score+1);
}
else{
alert("오답입니다.");
}
// 마지막 퀴즈인지 체크
if(currentNo===quizzes.length - 1){
setShowResult(true); // setShowResult : false -> ture
}else{
setCurrentNo((currentNo) => currentNo + 1);
}
};
return<div className="container">
{showResult ? (
<div className="app">
<h1 className="result-header">총 점수는</h1>
<p className="result-score">{convertedScore}</p>
</div>
):(
....
|
cs |
최종 소스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
import React, { useState } from "react";
import "./App.css";
const quizzes =
[
{
id:1,
question: "나는 몇 학년일까요?",
answers:
[
{text: "1학년", isCorrect: false},
{text: "2학년", isCorrect: false},
{text: "3학년", isCorrect: false},
{text: "4학년", isCorrect: true},
],
},
{
id:2,
question: "나는 몇 살일까요?",
answers:
[
{text: "21살", isCorrect:false },
{text: "22살", isCorrect:false },
{text: "23살", isCorrect:false },
{text: "24살", isCorrect:true },
],
},
{
id:3,
question: "나는 어디에 살까요?",
answers:
[
{text: "수원", isCorrect:false },
{text: "대구", isCorrect:false },
{text: "서울", isCorrect:true },
{text: "부산", isCorrect:false },
],
}
]
function App(){
const [currentNo , setCurrentNo] = useState(0); // 페이지 넘기기 state
const [showResult, setShowResult] = useState(false); // 퀴즈 끝 페이지 State
const [score, setScore] = useState(0); // 퀴즈 점수 표시
const convertedScore = Math.floor((score/quizzes.length)*100); //점수 계산
const handleClick = (isCorrect) => {
if(isCorrect){
alert("정답!");
setScore(score => score+1);
}
else{
alert("오답입니다.");
}
// 마지막 퀴즈인지 체크
if(currentNo===quizzes.length - 1){
setShowResult(true); // setShowResult : false -> ture
}else{
setCurrentNo((currentNo) => currentNo + 1);
}
};
return<div className="container">
{showResult ? (
<div className="app">
<h1 className="result-header">총 점수는</h1>
<p className="result-score">{convertedScore}</p>
</div>
):(
<div className = "app">
<div className="black-nav">
<div>Quiz</div>
</div>
<div className = "question-section">
<h1 className="question-header">
<span>{quizzes[currentNo].id}</span>/{quizzes.length}
</h1>
<div className="question-text">{quizzes[currentNo].question}</div>
</div>
<div className="answer-section">
{quizzes[currentNo].answers.map((answer)=>(
<button
value={answer.text}
onClick={() => handleClick(answer.isCorrect)}
>
{answer.text}
</button>
))}
</div>
</div>
)}
</div>
}
export default App;
|
cs |
'공부이야기 > [React]' 카테고리의 다른 글
[React 오류] A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>. (0) | 2022.01.02 |
---|---|
React-Quiz 만들기 [6] : import export 이용 (0) | 2021.12.31 |
React-Quiz 만들기 [4] (0) | 2021.12.26 |
React-Quiz 만들기 [3] (0) | 2021.12.26 |
React-Quiz 만들기 [2] (0) | 2021.12.24 |
댓글