- Published on
๐ ์ปฌ๋ฌ๋ฆฌ์คํธ ํ๋ก์ ํธ #14 ๋ฌด์์ ๋๋ค ๋ฒํผ ๋ง๋ค๊ธฐ
- ๊ธ์ด์ด
๐ ๋ชฉ์ฐจ
๐๐ป
- ๋ฌธ์ ๋ฅผ ๋ฌด์์๋ก ๋ณผ ์ ์๋ ๋๋ค ๋ฒํผ ๋ง๋ค๊ธฐ
1-1.
qList.json
์ index ๋ฌ๊ธฐ 1-2. ์ฃผ์์path variable(params)
์ ๋ฐ๋ผ์ ํ์ด์ง ๋ ๋๋ง 1-3. ๋๋ค ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฌด์์id
๋ก ์ด๋
qList.json
์ index ๋ฌ๊ธฐ
1-1. ์ค๋์ ๋๋ค ๋ฒํผ์ ๋๋ฌ
๋ฌด์์๋ก ๋ค์ํ ๋ฌธ์ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก
๋ฒํผ์ ๋ง๋ค๊ณ ๋ผ์ฐํ
์ ์กฐ์ ํฉ๋๋ค.
๋ฒํผ์ ๋๋ฅผ ๋ ๋ง๋ค ๋ค๋ฅธ ๋ฌธ์ ํ์ด์ง๋ก ์ด๋ํด์ผํ๋ฏ๋ก
์ฃผ์๋ฅผ ์ด๋ํด์ผํ๊ธฐ ๋๋ฌธ์ ์ผ๋จ ๋ฌธ์ ๋ง๋ค id
๋ฒํธ๋ฅผ ๋ถ์ฌ์ค๋๋ค.
json์ id ๋ฌ๊ธฐ
const qlist = {
quiz: [
// ...
],
}
// quiz์ ๋ด์ฉ์?
qlist.quiz
//(26)ย [{โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}]
// quiz์ ์ฒซ ๋ฒ์งธ ๊ฐ์?
qlist.quiz[0]
// {class: '2022๋
๋ 2ํ์ฐจ ๊ธฐ์ถ', type: '1', quizContent: '๋ฐ๋ปํ๊ณ ํ์๋ก์ด ์ด๋ฏธ์ง์ ์ฐจ๊ฐ๊ณ ์ธ์ธํ ์ด๋ฏธ์ง ๋๊ฐ์ง๋ฅผ ์ฐ์ถํด ๋ณด์ธ์.', condition: '(3์์ ์ด์ 10์นธ ์ด์)'}
// ๊ทธ๋๋ก ๋ณต์ฌ
qlist.quiz.map((q) => ({ ...q }))
//(26)ย [{โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}, {โฆ}]
// ๋ณต์ฌํ ๊ฐ์ index๋ฅผ id๋ก ์ถ๊ฐ
qlist.quiz.map((q, index) => ({ ...q, id: index + 1 }))
// {
// class: "2022๋
๋ 2ํ์ฐจ ๊ธฐ์ถ"
// condition: "(3์์ ์ด์ 10์นธ ์ด์)"
// id: 1
// quizContent: "๋ฐ๋ปํ๊ณ ํ์๋ก์ด ์ด๋ฏธ์ง์ ์ฐจ๊ฐ๊ณ ์ธ์ธํ ์ด๋ฏธ์ง ๋๊ฐ์ง๋ฅผ ์ฐ์ถํด ๋ณด์ธ์."
// type: "1"
// }
// id๊ฐ ์ถ๊ฐ๋ quiz๋ฅผ JSON ๋ฌธ์์ด๋ก ์ง๋ ฌํ
JSON.stringify(qlist.quiz.map((q, index) => ({ ...q, id: index + 1 })))
path variable(params)
์ ๋ฐ๋ผ์ ํ์ด์ง ๋ ๋๋ง
1-2. ์ฃผ์์ index.tsx
์์ params
๋ฅผ ์ด์ฉํด id
๋ก ๋ผ์ฐํ
ํ๋๋ก ํด์ฃผ์๋ค.
//use params ๋ฌธ์ ๋ณด๊ธฐ (react router dom๋ฌธ์์์)
//index.tsx
;<Route path="/quiz/:quizId" element={<TestForm />} />
{
/* /problem/:problemId */
}
{
/* /problem/1 */
}
{
/* /problem/2 */
}
๊ทธ๋ค์ Testform.tsx
์์ ๋ฌธ์ ๋ณ id
๋ฅผ ์ฐพ์ ์ ์๋๋ก ๋ณ์๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ค.
//Testform.tsx
const params = useParams() // url์ ์๋ ํ๋ผ๋ฏธํฐ(path variable, dynamic routes)๋ฅผ ๊ฐ์ ธ์ด!
// ?? ๋ ๋ณํฉ ์ฐ์ฐ์. ์ผ์ชฝ์ด null์ด๋ undefined๋ฉด ์ค๋ฅธ์ชฝ์ ๊ฐ์ fallback์ผ๋ก ์จ๋ผ
const quizId = parseInt((params['quizId'] as string | undefined) ?? '1') // ex 1
const quiz = QuizList.quiz[quizId - 1] // index๋ 0๋ถํฐ ์
์ผ๋ก...
id
๋ก ์ด๋
1-3. ๋๋ค ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฌด์์ ๋ค์์ผ๋ก ๋ฌด์์๋ก ์ซ์๋ฅผ ๋ฃ์ด ๋ฌธ์ ์ ์์์ ๋๋ค์ผ๋ก ํ์ด์ง๋ฅผ ์ด๋ํ ์ ์๋ link
๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
<Link to={`/quiz/${Math.min(Math.floor(Math.random() * 26 + 1), 26)}`}>๋ฌด์์ ๋ฌธ์ ๋ณด๊ธฐ</Link>
์์ ์์ ์๋์ ๊ฐ์ ์์๋ก ๋ง๋ค์ด์ก๋ค.
// 0๋ถํฐ 1์ฌ์ด์ ๊ฐ
Math.random()
// 0๋ถํฐ 26์ฌ์ด์ ๊ฐ
Math.random() * 26
// 1๋ถํฐ 27 ์ฌ์ด์ ๊ฐ (์์ ํฌํจ)
Math.random() * 26 + 1
// 1๋ถํฐ 27์ฌ์ด์ ์ ์ (27์ด ๋์ฌ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ๋งค์ฐ ์ ์)
Math.floor(Math.random() * 26 + 1)
// 1๋ถํฐ 26์ฌ์ด์ ๊ฐ
Math.min(Math.floor(Math.random() * 26 + 1), 26)
๊ทธ ๋ค์ ํด๋น ๋ฌธ์ ์ ๋ง๋ ๋ด์ฉ๊ณผ ์กฐ๊ฑด์ ๋ณด์ฌ์ค ์ ์๊ฒ ๋ฆฌํด ๊ฐ์ ์กฐ์ ํ๋ค.
<div className="quiz-paragraph">
<a className="category" href="">
{quiz.class}
</a>
<h1 className="text-2xl mb-2">Q. {quiz.quizContent}</h1>
<h2 id="condition" className="text-lg">
{quiz.condition}
</h2>
</div>