๐Ÿ“ ์˜ค๋Š˜ ํ•œ ๊ฒƒ

  1. react state

๐Ÿ“– ํ•™์Šต ์ž๋ฃŒ

  1. ์ปดํฌ๋„ŒํŠธ State

  2. setState()

  3. State and Lifecycle

  4. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ


๐Ÿ“š ๋ฐฐ์šด ๊ฒƒ

์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ์ด๊ฑฐ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„๋งŒ ์ •๋ฆฌ

1. state

1) setState()

setState()๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.
setState()๊ฐ€ ๊ฐ™์€ ์ฃผ๊ธฐ ๋™์•ˆ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

const handleClick = () => {
  this.setState({quantity: this.state.quantity + 1});
  this.setState({quantity: this.state.quantity + 1});
};

์ด๋Š” ๋‹ค์Œ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

// Object.assgin()์€ ๊ฐ์ฒด๋“ค์˜ ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์ž์ฒด ์†์„ฑ์„ ๋ณต์‚ฌํ•ด ๋Œ€์ƒ ๊ฐ์ฒด์— ๋ถ™์—ฌ๋„ฃ์€ ํ›„ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค
Object.assign(
  previousState, // ๋Œ€์ƒ ๊ฐ์ฒด
  {quantity: state.quantity + 1},
  {quantity: state.quantity + 1}, // ๊ณ„์† ๋ฎ์–ด์“ฐ๊ธฐํ•  ๋ฟ์ด๋‹ค
  ...
);

์›ํ•˜๋Š” ๋Œ€๋กœ ๋‹ค์Œ state ๊ฐ’์ด ์ด์ „ state ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” setState()์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

const handleClick = () => {
  this.setState((state) => {
    return {quantity: state.quantity + 1};
  });
};

2) State and Lifecycle

function Clock(props) {
  return (
    <div>
      <h1>Hello, world!</h1>
      <h2>It is {props.date.toLocaleTimeString()}.</h2>
    </div>
  );
}

function tick() {
  ReactDOM.render(
    <Clock date={new Date()} />,
    document.getElementById('root')
  );
}

setInterval(tick, 1000);

์œ„์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ class๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค. (React ์ปดํฌ๋„ŒํŠธ์™€ this ์ฐธ๊ณ )

cf. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š”, ํ•ด๋‹น ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ๋ฐ›์€ ํ•จ์ˆ˜(์•„๋ž˜ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ์—๋Š” setInterval)๊ฐ€ ์ •์˜ํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉฐ, ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = { date: new Date() };
    this.handleState = this.handleState.bind(this); // 3. this๋ฅผ ๋ฐ”์ธ๋“œํ•ด์คฌ๋‹ค
    
    console.log(this); // Clock {...}
  }

  componentDidMount() { // ๐Ÿ’ก ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋˜๋ฉด ํ˜ธ์ถœ๋จ
    this.timer = setInterval(this.handleState, 1000);
    // 4. this๋ฅผ ๋ฐ”์ธ๋“œํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์—ฌ๊ธฐ์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค
    // () => this.handleState()
  }
  
  handleState() {
    console.log(this); // 1. ์—ฌ๊ธฐ์„œ this๋Š” ์ „์—ญ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—
    
    this.setState((state) => { // 2. ์—ฌ๊ธฐ์„œ ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ์—†์ด ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด
      return { date: new Date() };
    });
  }
  
  UNSAFE_componentWillUnmount() { // ๐Ÿ’ก ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋œ DOM์ด ์‚ญ์ œ๋˜๋ฉด ํ˜ธ์ถœ๋จ
    clearInterval(this.timer);
    
    console.log(this); // cf. ๋‹ค๋ฅธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋“ค ๋‚ด๋ถ€์˜ this๋Š” Clock {...} ์ด๋‹ค
  }

  render() { // ๐Ÿ’ก ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•  ์œ ์ผํ•œ ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

ReactDOM.render(
  <Clock />,
  document.getElementById("root")
);

ํ˜น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

const Clock = () => {
  const [date, setDate] = useState(new Date());
  
  const updateDate = () => {
    setInterval(() => setDate(new Date()), 1000);
  };
  
  useEffect(updateDate, []); // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋˜๋ฉด ์‹คํ–‰๋จ
  
  return (
    <div>
      <h1>Hello, world!</h1>
      <h2>It is {date.toLocaleTimeString()}.</h2>
    </div>
  );
};

const App = () => {
  return (
    <div>
      <Clock />
    </div>
  );
};

ReactDOM.render(
  <App />,
  document.getElementById("root")
);

3) ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

ES6 class์˜ ๋ณธ๋ฌธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ strict mode์—์„œ ์‹คํ–‰๋œ๋‹ค.
์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ๋ฐ”์ธ๋”ฉ ํ•ด์ฃผ์ง€ ์•Š๋Š” ํ•œ undefined์˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};
    this.handleClick = this.handleClick.bind(this); // this๋ฅผ ๋ฐ”์ธ๋“œํ•ด์คฌ๋‹ค. ๋งŒ์•ฝ this๋ฅผ ๋ฐ”์ธ๋“œํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
  }

  handleClick() {
    console.log(this); // ์—ฌ๊ธฐ์„œ this๋Š” undefined๊ฐ€ ๋˜์–ด

    this.setState(prevState => ({ // ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒƒ์ด๋‹ค
      isToggleOn: !prevState.isToggleOn
    }));
  }

  add() {
    console.log(this);
  }
  
  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

โœจ ๋‚ด์ผ ํ•  ๊ฒƒ

  1. react controlled

  2. react ๊ฐ•์˜ ๋“ฃ๊ธฐ

profile
dev log

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN