๐Ÿ“’[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'};
  1. ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝ
player.score=2;
  1. ์›ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ์‚ฌ๋ณธ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ต์ฒด
var newPlayer = Object.assign({}, player, {score: 2});

๋ถˆ๋ณ€์„ฑ:2์˜ ์žฅ์ 

๋ณต์žกํ•œ ํŠน์ง•๋“ค์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ฆ.
๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์‰ฌ์›€.(์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์ด์ „ ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ์ง€ ํ™•์ธ)
๋ Œ๋”๋ง ์‹œ๊ธฐ๋ฅผ ์•Œ๋ ค์คŒ.

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ