๐[React ์์ต์] 3. ์ฝ๋ ์ถ๊ฐ
๋ถ๋ชจ Board ์ปดํฌ๋ํธ์์ ์์ Square ์ปดํฌ๋ํธ๋ก โprop ์ ๋ฌโ.
Square์ปดํฌ๋ํธ ํ๋ํ๋๊ฐ ํด๋ฆญ๋๋๋ก
1. button์ onClick ์ด๋ฒคํธ ํจ์ ์ถ๊ฐ
<button className="square" onClick={() => alert('click')}>
2. ํด๋ฆญ๋ ์ํ๋ฅผ ๊ธฐ์ตํ๋ state์ถ๊ฐ
๋ชจ๋ React ์ปดํฌ๋ํธ ํด๋์ค๋ ์์ฑ์๋ฅผ ๊ฐ์ง ๋, super(props) ํธ์ถ ๊ตฌ๋ฌธ๋ถํฐ ์์ฑํด์ผ ํ๋ค.
state๋ฅผ ๊ฐ๊ฐ์ Square ์ปดํฌ๋ํธ์์ ์ ์งํ๊ณ ์์ง๋ง,
์น์๋ฅผ ํ์ธํ๊ธฐ ์ํด 9๊ฐ ์ฌ๊ฐํ์ ๊ฐ์ ํ ๊ณณ์ ์ ์งํ์.
๊ฐ Square๊ฐ ์๋ ๋ถ๋ชจ Board ์ปดํฌ๋ํธ์ ๊ฒ์์ ์ํ๋ฅผ ์ ์ฅํ์.
๊ฐ Square์ ์ซ์๋ฅผ ๋๊ฒจ์ฃผ์์ ๋์ ๊ฐ์ด Board ์ปดํฌ๋ํธ๋ ๊ฐ Square์๊ฒ prop์ ์ ๋ฌํ๋ ๊ฒ์ผ๋ก ๋ฌด์์ ํ์ํ ์ง ์๋ ค์ค๋๋ค.
์ฌ๋ฌ๊ฐ์ ์์์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๊ฑฐ๋ ๋ ๊ฐ์ ์์ ์ปดํฌ๋ํธ๋ค์ด ์๋ก ํต์ ํ๊ฒ ํ๋ ค๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๊ณต์ state๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ props๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ปดํฌ๋ํธ์ state๋ฅผ ๋ค์ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์์ ์ปดํฌ๋ํธ๋ค์ด ์๋ก ๋๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋๊ธฐํ ํ๋๋ก ๋ง๋ญ๋๋ค.
๋ค์์ฝ๋
class Square extends React.Component {
render() {
return (
<button className="square"
onClick={()=>this.props.onClick()}>
{this.props.value}
</button>
);
}
}
class Board extends React.Component {
constructor(props) {
super(props);
this.state = {
squares: Array(9).fill(null), ........(2.1)
};
}
handleClick(i){ ........(2.4)
const squares=this.state.squares.slice(); .........(*)
squares[i]='X';
this.setState({squares:squares});
}
renderSquare(i) { .....(2.3)
return <Square value={this.state.squares[i]} onClick={() => this.handleClick(i)}/>;
}
render() {
const status = 'Next player: X';
return (
<div>
<div className="status">{status}</div>
<div className="board-row">
{this.renderSquare(0)}{this.renderSquare(1)}{this.renderSquare(2)} ...........(2.2)
</div>
<div className="board-row">
{this.renderSquare(3)}{this.renderSquare(4)}{this.renderSquare(5)}
</div>
<div className="board-row">
{this.renderSquare(6)}{this.renderSquare(7)}{this.renderSquare(8)}
</div>
</div>
);
}
}
class Game extends React.Component {
render() {
return (
<div className="game">
<div className="game-board">
<Board /> ....................(2)
</div>
<div className="game-info">
<div>{/* status */}</div>
<ol>{/* TODO */}</ol>
</div>
</div>
);
}
}
// ========================================
ReactDOM.render(
<Game />, ....................(1)
document.getElementById('root')
);
(1)->(2): Game->Board ์์๋๋ก ์ปดํฌ๋ํธ
(2.1): Square๊ฐ ์๋ Board์ ์ํ ์ ์ฅ
(2.2): ์์ ์(Board) renderSquare()ํจ์ ํธ์ถ
(2.3): Square์ปดํฌ๋ํธ์ Board์์ ์ ์ํ(ํด๋ฆญ์ฌ๋ถ)๋ฅผ value๊ฐ์ผ๋ก ์ ๋ฌํ๊ณ ์์ผ๋ฉฐ, onClick ์ด๋ฒคํธ ํจ์๋ ์์ ์ handleClick(i)ํจ์๋ฅผ ์ด์ฉํจ
(2.4): Square๊ฐ ํด๋ฆญ๋์์ ๋, Board์ ์ ์ฅ๋ Square์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
(*): ์..?
(*) 2๊ฐ์ง ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ฐฉ๋ฒ
var player={score:1,name:'Jeff'};
- ๋ฐ์ดํฐ ๊ฐ์ ์ง์ ๋ณ๊ฒฝ
player.score=2;
- ์ํ๋ ๊ฐ์ ๊ฐ์ง ์๋ก์ด ์ฌ๋ณธ์ผ๋ก ๋ฐ์ดํฐ ๊ต์ฒด
var newPlayer = Object.assign({}, player, {score: 2});
๋ถ๋ณ์ฑ:2์ ์ฅ์
๋ณต์กํ ํน์ง๋ค์ ๋จ์ํ๊ฒ ๋ง๋ฆ.
๋ณํ๋ฅผ ๊ฐ์งํ๊ธฐ ์ฌ์.(์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ์ด์ ๊ฐ์ฒด์ ๋ค๋ฅธ์ง ํ์ธ)
๋ ๋๋ง ์๊ธฐ๋ฅผ ์๋ ค์ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐[React ์์ต์] 3. ์ฝ๋ ์ถ๊ฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@eundms/React-์์ต์์์-3.-์ฝ๋-์ถ๊ฐ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค