[โReact] ๐ถ ์ด๋ชจ์ง๋ฅผ ์ด์ฉํ ๋น๊ณ ๊ฒ์ ๋ง๋ค๊ธฐ
๐ถ ๋ฆฌ์กํธ(React)๋ฅผ ์ด์ฉํด ์ด๋ชจ์ง ๋น๊ณ ๊ฒ์ ๋ง๋ค๊ธฐ ๐ถ
๋ ธ๋ง๋ ์ฝ๋ ์ฌ๋์ ๋๋ฌ๋ณด๋ ์ค, ๋น๊ณ ๊ฒ์์ ๊ณผ์ ๋ก ๋ง๋์๋ ๋ถ์ด ๋น๊ณ ๊ฒ์ฆ์ ๋ํ ๊ตฌํ์ ์ง๋ฌธํ์ จ๋ค. ์ฒ์์๋ Codesandbox์ ๋์๊ฐ๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ ๋ณด์ฌ๋๋ฆฌ๋ฉด ์ด๋จ๊น ์๊ฐํ๋ค๊ฐ, "๋ด ์ฌ์ด๋ ํ๋ก์ ํธ๋ก ์ข์ ๊ฒ ๊ฐ์๋ฐ?"๋ผ๋ ์๊ฐ์ ๋ฐ๋ก ๋น์ผ ๋น๊ณ ๊ฒ์ ์ฌ์ด๋ ํ๋ก์ ํธ ์์ ์ ์์ํ๋ค.
์ปดํฌํดํธ(Component)ํ
์์ํ๊ธฐ์ ์์ ์๊ฐ๋ฌ๋ ํ๋ก์ ํธ๊ฐ ๋ฐ๋ก ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์์ ์ ๊ณตํ๋ ํํ ๋ฆฌ์ผ์ธ ํฑํํ ๊ฒ์์ด์๋ค. Board์ Squrare๋ก ์ปดํฌ๋ํธํ ๋์ด์๋๊ฒ ๋น๊ณ ์ ์ ์ฉํ๊ธฐ ๋ฑ์ด์๊ณ , ๋๊ฐ์ด Board์ Square๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์งํํ๋ค.
ํจ์๊ตฌํ
๋น๊ณ ์์ ๊ตฌํํด์ผํ ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. ํน์ ์นธ ํด๋ฆญ์ ํด๋น ์นธ์ ์ํ๊ฐ ๋ณํ๋ ํจ์
2. ์ ์ฒด ํ์ ํ์ธํ์ฌ ๋น๊ณ ์ ๊ฐฏ์๋ฅผ ์ฒดํฌํ๋ ํจ์
๊ทธ๋ฆฌ๊ณ ๋๋ ๋งค ์ํ๋ง๋ค ํ์ ๊ตฌ์ฑ์ด ๋ณํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ํ์ ๋ค์ด๊ฐ๋ ์์๋ค์ ์๋ ์ ํ ํจ์๊น์ง ๊ตฌํํ๋ค.
1. ํน์ ์นธ ํด๋ฆญ์ ํด๋น ์นธ์ ์ํ ๋ณํ ํจ์ / handleOnClickSquare
handleOnClickSquare = (row: number, col: number) => {
// ํ์ฌ matrix์ ๋ฐ์ดํฐ ๊ฐ๊ณตํ๊ธฐ
const prevMatrix = this.state.matrix;
prevMatrix[row].splice(col, 1, {
...prevMatrix[row][col],
check: !prevMatrix[row][col].check
});
this.setState({ matrix: prevMatrix });
};
์์ธ๋ก ์ด๋ฐ๋ถํฐ ์ ๋ฅผ ๋จน์๋ ๋ถ๋ถ์ด๋ค. prevMatrix[row][col].check = !prevMatrix[row][col].check
์ด๋ฐ์์ผ๋ก ๋ ์ค ์์์ง๋ง, ์ ํ ์๋์๋ค. ๋ฐฐ์ด ์์์์ ๋ฐ์ดํฐ ์กฐ์์ ๋ฐ๋์ splice๋ฅผ ์ด์ฉํด์ผํ๋ค. splice์ ๋งค๊ฐ๋ณ์๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝ์ ์์ํ๋ ์ธ๋ฑ์ค์ธ start, ์ ๊ฑฐํ ์์์ ์๋ฅผ ๊ฒฐ์ ์ง๋ deleteCount, ๋์ฒดํ ์์์ ํด๋น๋๋ item์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
2. ์ ์ฒด ํ์ ํ์ธํ์ฌ ๋น๊ณ ์ ๊ฐฏ์๋ฅผ ์ฒดํฌํ๋ ํจ์ / checkBingo
checkBingo = () => {
const { size } = this.props;
const { matrix } = this.state;
let totalBingo = 0;
// row
for (let i = 0; i < size; i++) {
if (matrix[i].reduce((bingo, square) => bingo && square.check, true)) totalBingo++;
}
// column
for (let i = 0; i < size; i++) {
let bingo = true;
for (let j = 0; j < size; j++) {
bingo = bingo && matrix[j][i].check;
}
if (bingo) totalBingo++;
}
// diagnal
let diagnalBingoOne = true;
let diagnalBingoTwo = true;
for (let i = 0; i < size; i++) {
diagnalBingoOne = diagnalBingoOne && matrix[i][size - i - 1].check;
diagnalBingoTwo = diagnalBingoTwo && matrix[i][i].check;
}
if (diagnalBingoOne) totalBingo++;
if (diagnalBingoTwo) totalBingo++;
return totalBingo;
};
๋น๊ณ ๋ 3๊ฐ์ง ๋ฐฉํฅ์ผ๋ก ์๊ธธ ์ ์๋ค. ๊ฐ๋ก, ์ธ๋ก, ๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ . ํด๋น ํจ์์์๋ ๊ฐ๊ฐ์ ํ์ธํ์ฌ ๊ฐฏ์๋ฅผ ํ์
ํ๋ค. ๊ฐ๋ก ๋ฐ์ดํฐ์ ๋น๊ณ ์ฌ๋ถ์ ํ์ธ์ ์ํด์๋ ๋ฐฐ์ด์ ๋ฉ์๋์ธ reduce
๋ฅผ ์ฌ์ฉํ๋ค. reduce๋ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ผ๋ฉด์ ๊ฐ ๋ฐ์ดํฐ๋ค์ ์ด์ฉํด ์ ์ง์ ์ฐ์ฐ์ ํ๋ ๋ฉ์๋์ด๋ค. ์ฌ๊ธฐ์์ ๊ฐ๋ก ํ ์ค์์ ์นธ๋ง๋ค์ check ๊ฐ์ and ์ฐ์ฐํด๊ฐ๋ฉด์, ์ต์ข
๊ฐ์ด true์ผ ์ ๋น๊ณ ๊ฐฏ์๋ฅผ ๋๋ฆฌ๋ ๋ฐฉํฅ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํํ๋ค. ์ธ๋ก ๋ฐ์ดํฐ์ ๋น๊ณ ์ฌ๋ถ๋, ์ข ๋ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ for-loop๋ฅผ ๋ ๋ฒ ์จ์ ๊ตฌํํ๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ํด๋น ํ๋ ฌ์ 90๋ ํ์ ํ ํ๋ ฌ์ ๊ตฌํด์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง, ์๊ฐ๋ ๋ ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ๊ทธ๋ค์ง ๋ง์์ ๋ค์ง ์๋ ๋ฐฉ๋ฒ์ด๋ผ ๊ธฐ์กด ๋ฐฉ์๋๋ก ์งฐ๋ค. ๋๊ฐ์ ์ ๋น๊ณ ํ์์ 2๊ฐ์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ทธ์ ๋ํ ํจ์๋ ๊ตฌํํ๋ค.
3. ์ ํ ํจ์ / shuffle
์ ํ ํจ์๋ ๊ณผ๊ฑฐ <๋ ๋ง์ด ๋ ์ ๊ฒ>์ ํค์๋๋ฅผ ์ ํํ๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
shuffle = (a: any) => {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() \* (i + 1));
\[a\[i\], a\[j\]\] = \[a\[j\], a\[i\]\];
}
return a;
};
๊ทธ๋ค์ง ์ด๋ ต์ง ์๊ฒ, ๊ต์ฅํ ์งง๊ฒ ๊ตฌํํ ์ ์๋ค.
์ถ์ฒ: https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array
๊ทธ๋ฆฌ๊ณ ... ์ด๋ชจ์ง๐
์ซ์๋ ๋๋ฌด ์์ํ๊ณ , ์นธ ๋ด๋ถ ๋ด์ฉ์ ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ์์ฑ ํ ์ ์๊ฒ ํ๋ คํ๋๋ฐ ๊ตฌํ ์๊ฐ์ด ๋๋ฌด ๊ธธ๊ธฐ๋ ํ๊ณ ์์ฑ๋ฌผ์ด ์ด์์ง๋ ์์ ๊ฒ ๊ฐ์์ ๊ฐ๋จํ๊ณ ์ด์ ๊ฒ ๋ญ๊ฐ ์์๊น ์๊ฐํ๋ค๊ฐ ์ด๋ชจ์ง๋ฅผ ๋ฃ์ด๋ดค๋ค! ๊ฒฐ๊ณผ๋ ๋๋ง์กฑ, ๋ฐฉ๋ฒ์ ์ข ๋ฌด์ํ๋ค. ์ด๋ชจ์ง ์ฌ์ดํธ์์ ๋ง์์ ๋๋ ์ด๋ชจ์ง๋ค์ ํ ๋ฐฐ์ด์ ์ ์ฅํ์ฌ, ์ ํ ํ ๋ฟ๋ ค์ฃผ๋ ๋ฐฉ์์ด๋ค. ํ์ง๋ง ์ ๋์๊ฐ๋ ์๊ด์๋ค ๐คฃ
cf. ์ด๋ชจ์ง์ ๊ฒฝ์ฐ OS ๋ณ๋ก OS๊ฐ ๊ฐ์๋ ๋ฒ์ ๋ณ๋ก ๋ณด์ด๋ ๋ฐฉ์์ด ์ฒ์ฐจ๋ง๋ณ์ด๋ค. ์ด๋์ ๋ณด์ด๋๊ฒ ์ด๋์ ์ ๋ณด์ด๊ณ , PC์์ ์ด๋ปค๋ ๋ฐ, ๋ชจ๋ฐ์ผ๋ก ๋ณด๋ ์ด์ํด์ง๊ณ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ชจ์ง๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ํ ๊ฒฝ์ฐ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด๋ค.
๊ทธ๋์ ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฐ๋ก ์ด๋ชจ์ง ๋น๊ณ (Emoji Bingo)์ด๋ค. ์ฌ์ด์ฆ๋ฅผ ๋ณ์๋ก ๋ฌ์ ์ด๋ชจ์ง์ ์ต๋ ๊ฐฏ์์ ๋ง์ถฐ 12X12 ํฌ๊ธฐ๊น์ง ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์๋ค. ์ถ๊ฐ์ ์ผ๋ก ๊ตฌํ์ ์ฝ๊ฐ์ ๊ผผ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๋ชจ๋ ๋ฐ์ดํฐ ๋ฐฐ์ด ๊ณผ์ ์ด Board์ constructor์์ ํ๊ฒ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ์ฌ์ด์ฆ๋ง ๋ณํํ๊ฒ๋๋ฉด, ์ฌ์ด์ฆ๋ ๋ฐ๋์ง๋ง ๊ทธ ์์ ๋ฐ์ดํฐ๋ ๋ณํ์ง ์๊ฒ ๋๋ค. ์ด๋ฅผ ํํํ๊ธฐ ์ํด Board์ key = size + hash
์ผ๋ก ํด์ size๊ฐ ๋ณํ ๋๋ง๋ค, ๊ทธ๋ฆฌ๊ณ ์
ํ์ ๋๋ฅด๋ฉด ์๋ก์ด ํด์ฌ๋ฅผ ๋ฐํํ๊ฒ ํ์ฌ ์
ํํ์ ๋์๋ ์๋ก์ด key ๊ฐ์ ์ํด constructor๊ฐ ๋ค์ ์คํํ๊ฒ ๋ง๋ค์๋ค.
'Web > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ง์ ์ ์ํ ๋ฆฌ์กํธ-ํ์ ์คํฌ๋ฆฝํธ-๋ณด์ผ๋ฌํ๋ ์ดํธ ์๊ฐ (0) | 2020.03.15 |
---|---|
๋ฆฌ์กํธ์์ ์๋ก๊ณ ์นจ์ ํด์ผ ํจ์๊ฐ ์๋ํ๋ ๊ฒฝ์ฐ (1) | 2020.03.02 |
[โReact] React Element, React Component ๊ทธ๋ฆฌ๊ณ JSX (0) | 2020.01.19 |
[โReact] ๐ถ ์ด๋ชจ์ง๋ฅผ ์ด์ฉํ ๋น๊ณ ๊ฒ์ ๋ง๋ค๊ธฐ (1) | 2019.01.31 |
[โReact] React ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2018.12.26 |
React๋ก WYSIWYG ์๋ํฐ ๋ญ๋ก ์์ํ์ง? (4) | 2018.12.20 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
๋ฆฌ์กํธ์์ ์๋ก๊ณ ์นจ์ ํด์ผ ํจ์๊ฐ ์๋ํ๋ ๊ฒฝ์ฐ
๋ฆฌ์กํธ์์ ์๋ก๊ณ ์นจ์ ํด์ผ ํจ์๊ฐ ์๋ํ๋ ๊ฒฝ์ฐ
2020.03.02 -
[โReact] React Element, React Component ๊ทธ๋ฆฌ๊ณ JSX
[โReact] React Element, React Component ๊ทธ๋ฆฌ๊ณ JSX
2020.01.19 -
[โReact] React ๊ธฐ๋ณธ ๊ฐ๋
[โReact] React ๊ธฐ๋ณธ ๊ฐ๋
2018.12.26 -
React๋ก WYSIWYG ์๋ํฐ ๋ญ๋ก ์์ํ์ง?
React๋ก WYSIWYG ์๋ํฐ ๋ญ๋ก ์์ํ์ง?
2018.12.20
๋น๋ฐ๋๊ธ์ ๋๋ค