๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Front/React

[React] ๋ฆฌ์•กํŠธ๋กœ ๊ตฌ๊ตฌ๋‹จ ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ

by ์—ฅ?์€ 2023. 8. 21.
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ๋ฆฌ์•กํŠธ๋กœ ๊ตฌ๊ตฌ๋‹จ ๋งŒ๋“ค๊ธฐ

โœ” this.state 

:  ํ™”๋ฉด์—์„œ ํด๋ฆญ ์‹œ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ ๋ฐ”๋€Œ๋Š” ๊ฒƒ๋“ค

์ž…๋ ฅ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ธฐ ์ „
์ž…๋ ฅ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ๋ฐ”๋€Œ๋Š” ์š”์†Œ๋“ค์„ this.state ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๋ฐ˜์‘ํ˜•

1. first

2. second

3. value

4. result

 

 

constructor(props) {
  super(props);
  // this.state ์— ๋ฐ”๋€Œ๋Š” ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ์ ์œผ๋ฉด ๋œ๋‹ค.
  // ํ™”๋ฉด์—์„œ ํด๋ฆญ ์‹œ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ ๋ฐ”๋€Œ๋Š” ๊ฒƒ๋“ค (boolean ์š”์†Œ๋“ค๊ณผ ๊ฐ™์€)
  this.state = {
    first: Math.ceil(Math.random() * 9), // ์ฒซ๋ฒˆ ์งธ ์ˆซ์ž : ์ž„์˜์˜ ์•„๋ฌด ์ˆซ์ž๋‚˜ ๋งŒ๋“ค๊ธฐ
    second: Math.ceil(Math.random() * 9), // ๋‘๋ฒˆ ์งธ ์ˆซ์ž : ์ž„์˜์˜ ์•„๋ฌด ์ˆซ์ž๋‚˜ ๋งŒ๋“ค๊ธฐ
    value: '', // ์ž…๋ ฅ์ฐฝ์— ๋“ค์–ด๊ฐˆ ๊ฐ’ (์ฒ˜์Œ์—๋Š” ์•„๋ฌด ๊ฐ’๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ''๋กœ ์ ์–ด์ค€๋‹ค.)
    result: '', // ๊ฒฐ๊ณผ ๊ฐ’ (์ฒ˜์Œ์—๋Š” ์•„๋ฌด ๊ฐ’๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ''๋กœ ์ ์–ด์ค€๋‹ค.)
  };
}
// ์—ฌ๊ธฐ์„œ {} ์•ˆ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
render() {
  return (
      <div>
        <div>{this.state.first} ๊ณฑํ•˜๊ธฐ {this.state.second} ๋Š”?</div>
        <form onSubmit={(e) => {
          e.preventDefault();
          if (parseInt(value) === this.state.first * this.state.second) {

            this.setState({
              result: '์ •๋‹ต',
              first: Math.ceil(Math.random() * 9),
              second: Math.ceil(Math.random() * 9),
              value: '',
            });
          } else {
            this.setState({
              result: '๋•ก',
              value: '',
            });
          }
        }}>
          <input type="number" value={this.state.value} onChange={(e) => this.setState({ value: e.target.value })} />
          <button>์ž…๋ ฅ!</button>
        </form>
        <div>{this.state.result}</div>
      </div>

  );
}

๊ทผ๋ฐ jsx ์™€ javascript ๋ฅผ ์„ž์–ด์„œ ์“ฐ๋ฉด ์•ˆ ๋œ๋‹ค.

 

onSubmit = (e) => {
  e.preventDefault();
  if (parseInt(value) === this.state.first * this.state.second) {

    this.setState({
      result: '์ •๋‹ต',
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: '',
    });
  } else {
    this.setState({
      result: '๋•ก',
      value: '',
    });
  }
}

onSubmit ์„ ์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋กœ ๋นผ์ฃผ๊ณ  

<form onSubmit={this.onSubmit}>

return ์•ˆ์—๋Š” ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

 

<input type="number" value={this.state.value}
                     onChange={(e) => this.setState({value: e.target.value})}/>

input ํƒœ๊ทธ์— ๋“ค์–ด์žˆ๋Š” onChange ๋„ ํ•จ์ˆ˜๋กœ ๋นผ์ค€๋‹ค.

 

 

โœ” ์ฝ”๋“œ ์ •๋ฆฌ

<div id="root"></div>
<script type="text/babel">

  class GuGuDan extends React.Component {
    constructor(props) {
      super(props);

      // this.state ์— ๋ฐ”๋€Œ๋Š” ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ์ ์œผ๋ฉด ๋œ๋‹ค.
      // ํ™”๋ฉด์—์„œ ํด๋ฆญ ์‹œ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ ๋ฐ”๋€Œ๋Š” ๊ฒƒ๋“ค (boolean ์š”์†Œ๋“ค๊ณผ ๊ฐ™์€)
      this.state = {
        first: Math.ceil(Math.random() * 9), // ์ฒซ๋ฒˆ ์งธ ์ˆซ์ž : ์ž„์˜์˜ ์•„๋ฌด ์ˆซ์ž๋‚˜ ๋งŒ๋“ค๊ธฐ
        second: Math.ceil(Math.random() * 9), // ๋‘๋ฒˆ ์งธ ์ˆซ์ž : ์ž„์˜์˜ ์•„๋ฌด ์ˆซ์ž๋‚˜ ๋งŒ๋“ค๊ธฐ
        value: '', // ์ž…๋ ฅ์ฐฝ์— ๋“ค์–ด๊ฐˆ ๊ฐ’ (์ฒ˜์Œ์—๋Š” ์•„๋ฌด ๊ฐ’๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ''๋กœ ์ ์–ด์ค€๋‹ค.)
        result: '', // ๊ฒฐ๊ณผ ๊ฐ’ (์ฒ˜์Œ์—๋Š” ์•„๋ฌด ๊ฐ’๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ''๋กœ ์ ์–ด์ค€๋‹ค.)
      };
    }

    onSubmit = (e) => {
      e.preventDefault();
      if (parseInt(this.state.value) === this.state.first * this.state.second) {
        // ์ž…๋ ฅํ•œ ๊ฐ’๊ณผ, ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ฐ’๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€”์ง€
        this.setState({
          result: '์ •๋‹ต',
          first: Math.ceil(Math.random() * 9),
          second: Math.ceil(Math.random() * 9),
          value: '',
        });
      } else {
        this.setState({
          result: '๋•ก!!!!!!!!!!!!!!!!!!!',
          value: '',
        });
      }
    }

    onChange = (e) => {
      this.setState({ value: e.target.value })
    }

    // ์—ฌ๊ธฐ์„œ {} ์•ˆ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
    render() {
      return (
          <div>
            <div>{this.state.first} ๊ณฑํ•˜๊ธฐ {this.state.second} ๋Š”?</div>
            <form onSubmit={this.onSubmit}>
              <input type="number" value={this.state.value}
                     onChange={this.onChange}/>
              <button>์ž…๋ ฅ!</button>
            </form>
            <div>{this.state.result}</div>
          </div>

      );
    }
  }
</script>
<script type="text/babel">
  ReactDOM.render(<GuGuDan/>, document.querySelector('#root'));
</script>

 

โœ” ๊ฒฐ๊ณผ

- ์ฒซ ํ™”๋ฉด

์ฒซ ํ™”๋ฉด

- ๋‹ต์„ ๋งž์ท„์„ ๋•Œ

์ •๋‹ต

์ •๋‹ต์ด๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๊ณ  ๋‹ค์Œ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

 

- ๋‹ต์„ ํ‹€๋ ธ์„ ๋•Œ

์˜ค๋‹ต

ํ‹€๋ ธ๋‹ค๊ณ  ์†Œ๋ฆฌ์ง€๋ฅด๊ณ  ๋‹ค์‹œ ๋ฌธ์ œ ํ’€ ๊ธฐํšŒ๋ฅผ ์ค€๋‹ค.

 

 

โž• input ํƒœ๊ทธ์— focus ์ฃผ๊ธฐ

: ref ์‚ฌ์šฉํ•˜๊ธฐ

<input ref={(c) => {this.input = c;}} type="number" value={this.state.value}
                     onChange={this.onChange}/>

input ํƒœ๊ทธ ์•ˆ์— ref={(c) => {this.input = c;}} ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

 

// input focus๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ
input;

// ์—ฌ๊ธฐ์„œ {} ์•ˆ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
render() {
  return (
      <div>
        <div>{this.state.first} ๊ณฑํ•˜๊ธฐ {this.state.second} ๋Š”?</div>
        <form onSubmit={this.onSubmit}>
          <input ref={(c) => {this.input = c;}} type="number" value={this.state.value}
                 onChange={this.onChange}/>
          <button>์ž…๋ ฅ!</button>
        </form>
        <div>{this.state.answer} {this.state.result}</div>
      </div>

  );
}
}

return ๋ฐ”๊นฅ์— input; ์ ์–ด์ฃผ๊ณ 

 

onSubmit = (e) => {
  e.preventDefault();
  if (parseInt(this.state.value) === this.state.first * this.state.second) {
    // ์ž…๋ ฅํ•œ ๊ฐ’๊ณผ, ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ฐ’๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€”์ง€
    this.setState({
      result: '์ •๋‹ต',
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: '',
      answer: this.state.first * this.state.second,
    });
    this.input.focus();
  } else {
    this.setState({
      result: '๋•ก!!!!!!!!!!!!!!!!!!!',
      value: '',
      answer:'',
    });
    this.input.focus();
  }
}

ํ™”๋ฉด์˜ state ๊ฐ€ ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค input ์— focus๊ฐ€ ๋˜๋„๋ก 

this.input.focus(); ๋ฅผ ์ ์–ด์ค€๋‹ค.

 

๊ทผ๋ฐ render ๋Š” ๋„ˆ๋ฌด ์ž์ฃผ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ref ๋‚ด์šฉ์„ ๋ฐ”๊นฅ์œผ๋กœ ๋นผ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

onRefInput = (c) => { this.input = c; };


<input ref={this.onRefInput} />

 

 

 

 

์ฐธ๊ณ  :  ์ธํ”„๋Ÿฐ - ์›น ๊ฒŒ์ž„์„ ๋งŒ๋“ค๋ฉฐ ๋ฐฐ์šฐ๋Š” React (์กฐํ˜„์˜)

๋ฐ˜์‘ํ˜•