React

React | props์™€ state

3jun 2022. 1. 14. 09:29

๐Ÿฃ props

- Component ์†์„ฑ์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์š”์†Œ
- ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ

1๏ธโƒฃ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ pros ๊ฐ’ ์ง€์ •ํ•˜๊ธฐ

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ App ์ปดํฌ๋„ŒํŠธ์—์„œ MyComponent์˜ props ๊ฐ’์„ ์ง€์ •, MyComponenet์—์„œ props ์‚ฌ์šฉ

2๏ธโƒฃ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๋ฌธ๋ฒ•์„ ํ†ตํ•ด props ๋‚ด๋ถ€ ๊ฐ’ ์ถ”์ถœํ•˜๊ธฐ

๊ฐ์ฒด์—์„œ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋ฌธ๋ฒ• === ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น(destructuring assignment) === ๊ตฌ์กฐ ๋ถ„ํ•ด ๋ฌธ๋ฒ•
ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ์ฒด๋ผ๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ”๋กœ ๋น„๊ตฌ์กฐํ™”ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๊ฐ์ฒด์—์„œ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น
const MyComponent = (props) => {
  const { name, title } = props;
  return (
    <div>
      ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ {name} ์ด๊ณ , ์ด๊ฒƒ์€ {title}์ž…๋‹ˆ๋‹ค.
      <br />
    </div>
  );
};

# ๊ฐ์ฒด์ธ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น
const MyComponent = ({ name, title }) => {
  return (
    <div>
      ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ {name} ์ด๊ณ , ์ด๊ฒƒ์€ {title}์ž…๋‹ˆ๋‹ค.
      <br />
    </div>
  );
};

3๏ธโƒฃ propTypes๋ฅผ ํ†ตํ•œ props ๊ฒ€์ฆ

๋ฐฑ์—”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›์„ ๋•Œ type์„ ์ง€์ •ํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ propTypes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํ•„์ˆ˜ props๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ props์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  import ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ 'prop-types' ๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด type์„ ์ง€์ •ํ•œ ๋‹ค์Œ App.js ์—์„œ string์œผ๋กœ ์ง€์ •๋œ props์˜ ๊ฐ’์œผ๋กœ number๋ฅผ ์ „๋‹ฌํ•˜๋ฉด Console์— ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

4๏ธโƒฃ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ props ์‚ฌ์šฉํ•˜๊ธฐ

# MyComponent.js
class MyComponent extends Component {
  render() {
    const { name, favoriteNumber, children } = this.props; // ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น
    return (
      .
      .

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ defaultProps์™€ proTypes ์„ค์ •

class MyComponent extends Component {
  static defaultProps = {
    name: '๊ธฐ๋ณธ ์ด๋ฆ„'
  };
  static propTypes = {
    name: Protypes.string,
    favoriteNumber: PropTypes.number.isRequired
  };
render() {
  const { name, favoriteNumber, children } = this.props;
  return(...);
  }
}

๐Ÿ– state

state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๊ฐ’
props๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณผ์ •์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„ค์ •ํ•˜๋Š” ๊ฐ’์ด๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ์ž์‹ ์€ ํ•ด๋‹น props๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์•กํŠธ์˜ state 2๊ฐ€์ง€

  1. state์—๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” state.
  2. ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ useState๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” state.
# Counter.js
class Count extends Component {
  constructor(props) {
    super(props);

    this.state = {
      // state ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
      number: 0,
    };
  }
  render() {
    const { number } = this.state; // this.state๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state ์กฐํšŒ
    return (
      <div>
        <h1>{number}</h1>
        <button
          onClick={() => {
            this.setState({ number: number + 1 });
          }}
        >
          +1
        </button>
      </div>
    );
  }
}

์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” constructor ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์„ค์ •ํ•œ๋‹ค.

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ constructor๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ super(props)๋ฅผ ํ˜ธ์ถœํ•ด์ค˜์•ผ ํ•œ๋‹ค.
์ปดํฌ๋„ŒํŠธ์˜ state๋Š” ๊ฐ์ฒด ํ˜•์‹์ด์–ด์•ผ ํ•œ๋‹ค.

constructor ๋ฉ”์„œ๋“œ๋Š” rendering ๋  ๋•Œ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹น.

์ด๋ฒคํŠธ๋กœ ์„ค์ •ํ•  ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ์ค„๋•Œ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” this.setState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

constructor ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  state ์ดˆ๊นƒ๊ฐ’ ์„ค์ •

# Counter.js
class Counter extends Component {
  state = {
    number: 0,
    fixedNumber: 0
  };
render()...

๐Ÿฅฏ state๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ ์‚ฌํ•ญ

โญ๏ธ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•  ๋•Œ
=> ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด ์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ  ๊ทธ ์‚ฌ๋ณธ์— ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•œ ํ›„, ๊ทธ ์‚ฌ๋ณธ์˜ ์ƒํƒœ๋ฅผ setState ํ˜น์€ Setter ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

# i.e
//๊ฐ์ฒด ๋‹ค๋ฃจ๊ธฐ
const array = [
  { id: 1, value: true},
  { id: 2, value: true},
  { id: 3, value: false},
];
let nextArray = array.concat({id:4});    // ์ƒˆํ•ญ๋ชฉ ์ถ”๊ฐ€
nextArray.filter(item => item.id !== 2);    // id๊ฐ€ 2์ธ ํ•ญ๋ชฉ ์ œ๊ฑฐ
nextArray.map(item => item.id === 1 ? {...item, value: false} : item)); 
// id๊ฐ€ 1์ธ ํ•ญ๋ชฉ์˜ value๋ฅผ false๋กœ ์„ค์ •

โœจโœจโœจโœจโœจ
๊ฐ์ฒด์— ๋Œ€ํ•œ ์‚ฌ๋ณธ์„ ๋งŒ๋“ค๋•Œ๋Š” spread ์—ฐ์‚ฐ์ž ....
๋ฐฐ์—ด์— ๋Œ€ํ•œ ์‚ฌ๋ณธ์„ ๋งŒ๋“ค๋•Œ๋Š” ๋ฐฐ์—ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์‚ฌ์šฉ
โœจโœจโœจโœจโœจ

props, state ํ™œ์šฉ์˜ˆ์ œ

  1. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ App ์—์„œ this.state ๋กœ content๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ
  2. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์ธ TOC ์— this.state.content๋กœ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  3. TOC ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›์€ ๊ฐ์ฒด๋ฐ์ดํ„ฐ๋ฅผ while ๋ฐ˜๋ชฉ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ list์— DOM์„ ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌ