[TIL] React : State, Props

AcidΒ·2021λ…„ 9μ›” 19일
0

πŸ“˜ React

λͺ©λ‘ 보기
2/2
post-thumbnail

λ¦¬μ•‘νŠΈμ˜ State 와 Props 에 λŒ€ν•œ λ‚΄μš©κ³Ό Event λ₯Ό 톡해 이λ₯Ό ν™œμš©ν•˜λŠ” λ‚΄μš© 등을 ν¬ν•¨ν•©λ‹ˆλ‹€. 😊

λ¦¬μ•‘νŠΈ State πŸ“‹

λ¦¬μ•‘νŠΈλ₯Ό 톡해 동적 웹을 κ΅¬ν˜„ν•˜κ³ μž ν•  λ•Œ, 빼놓을 수 μ—†λŠ” μ—†λŠ” κ°œλ… 쀑 ν•˜λ‚˜κ°€ State λ‹€. State λŠ” 말 κ·ΈλŒ€λ‘œ μƒνƒœλ₯Ό μ˜λ―Έν•˜λ©°, κ·Έ μƒνƒœμ˜ λŒ€μƒμ€ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό ν–₯ν•œλ‹€.

λ˜ν•œ, State λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ UI 정보λ₯Ό μ§€λ‹Œ 객체이기도 ν•˜λ‹€. 이게 무슨 μ˜λ―ΈμΈμ§€ ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ State λ₯Ό μ–΄λ–»κ²Œ μ •μ˜ν•˜λŠ” 지에 λŒ€ν•œ λ‚΄μš©κ³Ό ν•¨κ»˜ μ•Œμ•„λ³΄μž.

import React, { Component } from 'react';

class State extends Component {
  constructor() {
    super();
    this.state = {
      color: 'red',
    };
  }

  handleColor = () => {
    this.setState({
      color: 'blue'
    })
  }

  render() {
    return (
      <div>
        <h1 style={{ color: this.state.color }}>Class Component | State</h1>
        <button onClick={this.handleColor}>Click</button>
      </div>
    );
  }
}

export default State;


State λ₯Ό μœ„ μ˜ˆμ‹œλ₯Ό ν™œμš©ν•˜μ—¬ μ„€λͺ…ν•΄λ³΄μž. 일단 constructor λ₯Ό 톡해 state 의 초기 값을 μ„€μ •ν•΄μ€€λ‹€. 이 κ³Όμ •μ—μ„œ ν•΄λ‹Ή super() λ₯Ό κΌ­ λ„£μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€. ν•΄λ‹Ή super() λ₯Ό μ™œ ν•„μˆ˜λ‘œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” λͺ…ν™•νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆκΈ° λ•Œλ¬Έμ—, λ³„λ„λ‘œ κΈ°μž¬ν•œλ‹€.

πŸ’‘ super() 에 λŒ€ν•˜μ—¬

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ class μ—μ„œ super λž€ λΆ€λͺ¨ 클래슀의 μƒμ„±μž 내지 λ©”μ„œλ“œλ₯Ό λΆˆλŸ¬μ˜΄μ„ μ˜λ―Έν•œλ‹€. extends λ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀λ₯Ό 톡해 클래슀λ₯Ό μƒμ„±ν•˜λ©΄ super() λ₯Ό μ‚¬μš©ν•  수 있게 λœλ‹€. κ·Έλ ‡κ²Œ 되면 λ‹€μŒκ³Ό 같은 상황을 λ§Œλ“€ 수 μžˆλ‹€.

class Person{
    constructor(name, first, second){
        this.name = name;
        this.first = first;
        this.second = second;
    }
    sum(){
        return this.first+this.second;
    }
}
class PersonPlus extends Person{
    constructor(name, first, second, third){
        super(name, first, second);
        this.third = third;
    }
    sum(){
        return super.sum()+this.third;
    }
}


μœ„μ™€ 같이 Person μ΄λΌλŠ” class μ—μ„œ νŒŒμƒλœ PersonPlus μ—μ„œ super() λ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό κ³΅μœ ν•˜κ³ , super λ₯Ό 톡해 λΆ€λͺ¨μ˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

λ¦¬μ•‘νŠΈμ—μ„œλŠ” ν•΄λ‹Ή super() λ₯Ό this μ‚¬μš©μ˜ 쑰건으둜 κ°•μ œν•œλ‹€λŠ” 뢀뢄이 μžˆλŠ”λ° ν•΄λ‹Ή λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” 심화 ν•™μŠ΅μ΄ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ—, 이번 λ¦¬μ•‘νŠΈ state μ—μ„œλŠ” μƒλž΅ν•˜κ² λ‹€.


setState() πŸ”§

λ³€μˆ˜κ°€ μ•„λ‹Œ state λ₯Ό μ‚¬μš©ν•˜λŠ” μž₯점은 값을 λ™μ μœΌλ‘œ λ³€κ²½ν•  수 μžˆμ„ λ•Œ 진가λ₯Ό λ°œνœ˜ν•  것이닀. setState() λŠ” μ΄λŸ¬ν•œ state 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법이닀. μœ„ μ˜ˆμ‹œμ—μ„œλŠ” setState() λ₯Ό 톡해 μš”μ†Œμ˜ 색을 λ³€κ²½ν•˜κ³ μž ν•˜μ˜€λ‹€.

  handleColor = () => {
    this.setState({
      color: 'blue'
    })
  }

  render() {
    return (
      <div>
        <h1 style={{ color: this.state.color }}>Class Component | State</h1>
        <button onClick={this.handleColor}>Click</button>
      </div>
    );
  }
}


ν•΄λ‹Ή μ˜ˆμ‹œμ—μ„œ setState() λ₯Ό 톡해 color 값을 blue 둜 λ°”κΎΌλ‹€λŠ” 것을 handelColor λΌλŠ” arrow function 을 톡해 μ •μ˜ν•΄μ€€λ‹€. 그리고 h1 νƒœκ·Έμ— style μ†μ„±μ—μ„œ color 에 ν•΄λ‹Ήν•˜λŠ” κ°’μœΌλ‘œ ν•΄λ‹Ή state 값을 λŒ€μž…ν•˜κ³ , ν•΄λ‹Ή state 값을 λ³€κ²½ν•˜κΈ° μœ„ν•΄ 미리 μ •μ˜ν•΄λ‘μ—ˆλ˜ ν•¨μˆ˜λ₯Ό button νƒœκ·Έμ˜ onClick μ΄λ²€νŠΈμ— μ—°λ™ν•˜μ—¬ λŒ€μž…ν•΄μ€€λ‹€. κ·Έλ ‡λ‹€λ©΄ λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ, h1 νƒœκ·Έμ˜ ν…μŠ€νŠΈ 색이 λ³€ν™”ν•˜λŠ” 것을 확인할 수 μžˆμ„ 것이닀.

μœ„μ™€ 같이 state 값을 λ³€ν™”μ‹œμΌœ 동적인 μ›Ή ꡬ좕에 ν™œμš©ν•  수 μžˆλ‹€. μΆ”κ°€μ μœΌλ‘œ, ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ 경우 useState λΌλŠ” 것을 ν™œμš©ν•˜μ—¬ state κ°’κ³Ό λ³€κ²½ ν•¨μˆ˜μ— λŒ€ν•΄ μΌκ΄„μ μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€.

props πŸ—ƒοΈ

state 에 λŒ€ν•΄ μ΄ν•΄ν–ˆλ‹€λ©΄ 이제 props 에 λŒ€ν•΄ μ΄ν•΄ν•˜λ©΄μ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό 닀루기 μœ„ν•œ μ€€λΉ„λ₯Ό ν™•μ‹€ν•˜κ²Œ ν•΄λ³΄μž. props λŠ” 말 κ·ΈλŒ€λ‘œ μ»΄ν¬λ„ŒνŠΈ 속성 값을 μ˜λ―Έν•˜λ©°, μžμ„Ένžˆ λ§ν•˜μžλ©΄ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈλ‘œ λΆ€ν„° 전달 받은 데이터 객체λ₯Ό μ˜λ―Έν•œλ‹€.

이게 μ‚¬λžŒ 말인가 μ‹Άλ‹€λ©΄ 그게 정상이닀. 😊 μžκ΄΄κ°μ— 빠지지 말고 μ’€ 더 μ‰½κ²Œ μ•Œμ•„λ³΄μž.

props λ₯Ό ν†΅ν•œ 데이터 전달 πŸ“©

// Parent.js

import React from 'react';
import Child from '../pages/Child/Child';

class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: 'red'
    };
  }

  render() {
    return (
      <div>
        <h1>Parent Component</h1>
	<Child titleColor={this.state.color}/>
      </div>
    );
  }
}

export default State;
// Child.js
import React from 'react';

class Child extends React.Component {
  render() {
		// console.log(this.props);

    return (
      <div>
        <h1 style={{color : this.props.titleColor}}>Child Component</h1>
      </div>
    );
  }
}

export default State;


μœ„μ™€ 같이 두 가지 μ»΄ν¬λ„ŒνŠΈκ°€ μ •μ˜λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž. Parent μ»΄ν¬λ„ŒνŠΈλŠ” μ•„λž˜ μž‘μ„±λœ Child μ»΄ν¬λ„ŒνŠΈλ₯Ό λΆˆλŸ¬μ™€ μ‚¬μš©ν•˜κ³  μ΄λ¦„λŒ€λ‘œ λΆ€λͺ¨ μžμ‹μ˜ 관계λ₯Ό κ°–λŠ”λ‹€. ν•΄λ‹Ή μƒν™©μ—μ„œ Child λŠ” Parent μ»΄ν¬λ„ŒνŠΈμ˜ 값에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

μš°μ„  μœ„ μ˜ˆμ‹œμ˜ Parent μ»΄ν¬λ„ŒνŠΈμ—μ„œ Child μ»΄ν¬λ„ŒνŠΈλ₯Ό λΆˆλŸ¬μ™€ μ‚¬μš©ν•˜λŠ” κ³Όμ •μ—μ„œ props λ₯Ό λ„˜κΈ°κΈ° μœ„ν•΄ Parent 의 state 값인 blue λ₯Ό this.state.color λ₯Ό 톡해 전달해쀀닀. 그리고 ν•΄λ‹Ή props λ₯Ό titleColor 라고 μ •μ˜ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ 이제 Child μ»΄ν¬λ„ŒνŠΈλŠ” titleColor λΌλŠ” 값에 props 객체λ₯Ό 톡해 μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€. κ·Έλ ‡κ²Œ Child μ»΄ν¬λ„ŒνŠΈμ—μ„œ this.props.titleColor λ₯Ό 톡해 λ„˜κ²¨ 받은 props 값에 μ ‘κ·Όν•˜κ³  이λ₯Ό ν™œμš©ν•  수 μžˆλŠ” 것이닀.

λ˜ν•œ props λ₯Ό 톡해 state κ°’ 뿐만 μ•„λ‹ˆλΌ setState λ₯Ό ν™œμš©ν•˜λŠ” event handler λ˜ν•œ 전달할 수 μžˆλ‹€.

props λ₯Ό ν†΅ν•œ ν•¨μˆ˜ 전달 πŸ“¬


// Parent.js

import React from 'react';
import Child from '../pages/Children/Children';

class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: 'red'
    };
  }

  handleColor = () => {
    this.setState({
      color: 'blue'
    })
  }

  render() {
    return (
      <div>
        <h1>Parent Component</h1>
	<Child titleColor={this.state.color} changeColor={this.handleColor}/>
      </div>
    );
  }
}

export default State;
// Child.js

import React from 'react';

class Child extends React.Component {
  render() {
		// console.log(this.props);

    return (
      <div>
        <h1 style={{color : this.props.titleColor}}>Child Component</h1>
	<button onClick={this.props.changeColor}>Click</button>
      </div>
    );
  }
}

export default State;


μ΄μ–΄μ§€λŠ” μ˜ˆμ‹œλŠ” setState λΆ€λΆ„μ—μ„œ button 을 톡해 h1 νƒœκ·Έμ˜ 색을 λ°”κΎΈλŠ” 것과 같은 μ˜ˆμ‹œμ΄λ‹€. λ‹€λ₯Έ 점이 μžˆλ‹€λ©΄, event handling 을 λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ μ•„λ‹Œ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ§„ν–‰ν•œλ‹€λŠ” 점이닀. 그러기 μœ„ν•΄μ„œ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ •μ˜ν•œ state λ₯Ό λ³€κ²½ν•  수 μžˆλŠ” setState κ°€ λ“€μ–΄κ°„ event handler ν•¨μˆ˜λ₯Ό μœ„μ™€ 같이 μ „λ‹¬ν•˜λŠ” 것이닀.

ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜λŠ” 방식은 μ•žμ˜ κ°’ 전달 방식과 λ™μΌν•˜λ‹€. changeColor={this.handleColor} λ₯Ό 톡해 μ „λ‹¬ν•˜κ³ μž ν•˜λŠ” props ν•¨μˆ˜λ₯Ό changeColor λΌλŠ” μ΄λ¦„μœΌλ‘œ μ „λ‹¬ν•œλ‹€. 그리고 μ „μžμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μžμ‹ μš”μ†Œμ—μ„œ props 객체λ₯Ό 톡해 ν•¨μˆ˜λ₯Ό 전달 λ°›μ•„ μ΄λ²€νŠΈμ— λ°”λ‘œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

μœ„μ™€ 같은 방식을 ν™œμš©ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈμ˜ μ»΄ν¬λ„ŒνŠΈν™”λ₯Ό μ§„ν–‰ν•˜λŠ” κ³Όμ •μ—μ„œ 자유둭게 λΆ€λͺ¨ μžμ‹μ˜ 데이터λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€.

마무리 🧾


사싀 ν•™μŠ΅ν•˜λ‹€ λ³΄λ‹ˆ, state 와 props λΌλŠ” 뢀뢄은 μ‹€μ œλ‘œ μ μš©ν•˜λ©΄μ„œ ν•™μŠ΅ν•˜λŠ” κ³Όμ •μ—μ„œ λ”μš± 이해가 κΉŠμ–΄μ§€λŠ” 것 κ°™λ‹€. 이λ₯Ό ν™œμš©ν•˜μ—¬ 진행 쀑인 ν”„λ‘œμ νŠΈμ˜ μ»΄ν¬λ„ŒνŠΈν™”λ₯Ό μ›ν™œνžˆ μ§„ν–‰ν•œ ν›„ ν•™μŠ΅ν–ˆλ˜ λ‚΄μš©μ„ λ˜μ§šμ–΄ λ³΄λŠ” 것도 쒋을 것 κ°™λ‹€.

  • state λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœμ΄λ©° μ»΄ν¬λ„ŒνŠΈκ°€ κ°–λŠ” 값을 μ˜λ―Έν•œλ‹€.
  • props λž€ μ»΄ν¬λ„ŒνŠΈ μ†μ„±μœΌλ‘œ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈλ‘œ λΆ€ν„° 상속 λ°›λŠ” 데이터λ₯Ό μ˜λ―Έν•œλ‹€.
  • setState λ₯Ό 톡해 state 값을 λ³€κ²½ν•  수 있으며, 이λ₯Ό 이벀트 핸듀링에 ν™œμš©ν•  수 μžˆλ‹€.
  • props λ₯Ό 톡해 λΆ€λͺ¨ μš”μ†Œμ˜ state λ₯Ό μžμ‹μ— λ°˜μ˜ν•  수 있고, 이λ₯Ό λ³€κ²½ν•  μˆ˜λ„ μžˆλ‹€.(State λŒμ–΄μ˜¬λ¦¬κΈ°)

그럼 20000 πŸ‘πŸ»

profile
μ΄μœ μ— μ§‘μ°©ν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œ 개발자 μ§€λ§μƒμž…λ‹ˆλ‹€ 🧐

0개의 λŒ“κΈ€