๐[React ์์ต์] 4. ์ฝ๋์ถ๊ฐ2
Square ์ปดํฌ๋ํธ๋ฅผ ํจ์ ์ปดํฌ๋ํธ๋ก ๋ฐ๊พธ๋ฉด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง. ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ props ๊ฐ์ฒด๋ก ๋ฐ์์ ์ฌ์ฉํ์.
function Square(props){
return(
<button className="square" onClick={props.onclick}>
{props.value}
</button>
);
}
O, X๋ฅผ ํ์ํ๋๋ก ํ์ (boolean ๊ฐ ์ด์ฉ)
class Board extends React.Component {
constructor(props) {
super(props);
this.state = {
squares: Array(9).fill(null),
xIsNext:true, ........(1)
};
}
handleClick(i){
const squares=this.state.squares.slice();
if (squares[i]){return;} .......(*)
squares[i]=this.state.xIsNext ? 'X':'O';
this.setState({
squares:squares,
xIsNext: !this.state.xIsNext, ........(2)
});
}
...
(์ค๋ต)
...
render() { ........(3)
const status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');
(1) xIsNext๋ฅผ state์ ์ถ๊ฐํ์ฌ ์ฒซ๋ฒ์งธ user์ ํด(O)์ธ์ง ๋๋ฒ์งธ user์ ํด(X)์ธ์ง ํ์ธ
(2) ํ์ฌ ํด์ธ user๊ฐ ์ ํํ ์์ญ์ ํ๋ฉด์ ํ์ํจ.
(3) ๋ค์ ํด์ user์ ํ๋ฉด์ ํ์.
(*) ๋๊ตฐ๊ฐ ํด๋ฆญํ๋ค๋ฉด return (ํด๋ฆญ๋์ง ์์.)
๊ฐ๋ก ์ธ๋ก ๋๊ฐ์ ํ ์ค์ ํ user๊ฐ ๋ค ์ ํํ๋ฉด ์ด๊น
- ์น์ ๊ฒฐ์ ํจ์
function calculateWinner(squares) {
const lines = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6],
];
for (let i = 0; i < lines.length; i++) {
const [a, b, c] = lines[i];
if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
return squares[a];
}
}
return null;
}
- ์น์ ๊ฒฐ์ ํจ์์ ์ฌ์ฉ
//Board์ renderํจ์
render() {
const winner = calculateWinner(this.state.squares);
let status;
if (winner) {
status = 'Winner: ' + winner;
} else {
status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');
}
๋์์ ๋ํ ๊ธฐ๋ก ์ ์ฅํ๊ธฐ-(๋ฐ์ )->๋ค๋ก ๋๋์๊ฐ๊ธฐ
์ด์ ๋์์ ๋ํ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ค๋ฉด ์ต์์ ๋จ๊ณ์ Game ์ปดํฌ๋ํธ๊ฐ ํ์ํฉ๋๋ค. history๋ฅผ ์ด์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ ์ต์์ ๋จ๊ณ Game ์ปดํฌ๋ํธ์ history state๋ฅผ ๋๊ฒ ์ต๋๋ค.
history state๋ฅผ Game ์ปดํฌ๋ํธ์ ๋์๊ธฐ ๋๋ฌธ์ ์์ Board ์ปดํฌ๋ํธ์์ squares state๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค.
slice()๋ฅผ ์ฌ์ฉํด์ ๋งค ๋์ ์ดํ์ squares ๋ฐฐ์ด์ ์๋ก์ด ๋ณต์ฌ๋ณธ์ ๋ง๋ค์๊ธฐ์, ๊ณผ๊ฑฐ์ squares ๋ฐฐ์ด์ ๋ชจ๋ ๋ฒ์ ์ ์ ์ฅํ๊ณ ์ด๋ฏธ ์ง๋๊ฐ ์ฐจ๋ก๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๊ณผ๊ฑฐ์ squares ๋ฐฐ์ด๋ค์ history๋ผ๋ ๋ค๋ฅธ ๋ฐฐ์ด์ ์ ์ฅํ ๊ฒ์ ๋๋ค. history ๋ฐฐ์ด์ ์ฒซ ๋์๋ถํฐ ๋ง์ง๋ง ๋์๊น์ง ๋ชจ๋ ๊ฒ์ํ์ ์ํ๋ฅผ ํํํ๋ค.
Game์ history์ ์ฅ.
(1) Board์ ์๋ state๋ฅผ Game์ผ๋ก ๊ฐ์ ธ์ด
(1.1) Game์์ ์ ์ ์ฅ๋์ด ์๋ history
(1.2) ๋ฐ๋ก ์ง์ ์ history
(1.3) ํ์ฌ user๊ฐ ์ ํํ๋ฉด ๋ฐ๋ ๊ฒฐ๊ณผ squares๋ฅผ Game ์์ ์ history์ concat.
Board๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ Game์๊ฒ props์ ํตํด ํ์ฌ squares๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
Board๋ Game์๊ฒ์ ์ ๋ฌ ๋ฐ์ props๊ฐ์ฒด์ squares[i](squares์ ํด๋น ์นธ์ ๊ฐ)๋ฅผ ์์ ์ปดํฌ๋ํธ Square์๊ฒ ์ ๋ฌํ๋ค.
์ด๋ก์จ ์นธ ํ๋๊ฐ ํ๋ฉด์ ํ์๋๋ค.
ํน์ ๊ณผ๊ฑฐ๋ก์ ์ด๋
์์ ๊ฐ์ด ์ฐ๋ฉด,,,, ์๋ฌ๊ฐ ๋๋ค.
๊ฒฝ๊ณ ๋ฐฐ์ด์ด๋ ์ดํฐ๋ ์ดํฐ์ ์์๋ค์ ๊ณ ์ ์ โkeyโ prop์ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค.
๋ฆฌ์คํธ ์์ดํ
์ key prop์ ์ง์ ํ์ฌ ๊ฐ ์์ดํ
์ด ๋ค๋ฅธ ์์ดํ
๋ค๊ณผ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๋ ค์ฃผ์ด์ผ ํฉ๋๋ค.
์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก..!
<li key={user.id}>{user.name}: {user.taskCount} tasks left</li>
๊ทธ๋์ ์๋์ ๊ฐ์ด key๋ฅผ ์ถ๊ฐํด ์ค์ผ ํ๋ค.
1. Game ์ปดํฌ๋ํธ์ state์ stepNumber๋ฅผ ์ถ๊ฐ.
ํ์ฌ ์งํ ์ค์ธ ๋จ๊ณ ํ์.
2. Game ์ปดํฌ๋ํธ์ jumpToํจ์ ์ถ๊ฐ.
xIsNext๋ x,o,x,o...์์์ด๋ฏ๋ก
3. ๊ณผ๊ฑฐ๋ก ๊ฐ ํ ์๋ก์ด ์ด๋์ ํ๋ค๋ฉด ๋ฏธ๋์ ๊ธฐ๋ก์ ์์ค๋ค.
4. render
๋ฐ๋ก ์ง์ ์ ๊ฐ์์ history.length-1 this.state.stepNumber ๋ก ๋ฐ๊ฟ.
์ต์ข ๊ฒฐ๊ณผ
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐[React ์์ต์] 4. ์ฝ๋์ถ๊ฐ2), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@eundms/React-์์ต์-4.-์ฝ๋์ถ๊ฐ2์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค