[React] 리액트 Props & State

yayaya_hojin·2023년 9월 1일
0

리엑트

목록 보기
2/6
post-thumbnail

🚀 React에서 Component의 데이터 관리 및 전달을 하기 위해 Props와 State를 사용한다.

1. Props

PropsProperties(속성)의 줄임말이다.

Parent(상위 or 부모) 컴포넌트에서 Child(하위 or 자식) 컴토넌트로 전달되는 데이터를 의미한다.

이때 전달은 단방향으로써 부모(상위) 컴포넌트에서 자식(하위) 컴포넌트로 값을 전달한다.

전달되는 데이터는 자식 컴포넌트에서 읽기 전용이며 수정 불가능하다.

값을 수정하기 위해서는 전달받은 해당 Props를 관리하는 곳에서 값을 변경하면 하위 컴포넌트에 영향을 줄 수 있다.

ParentComponent.js

import React from "react";

const ParentComponent = () => {
  return <ChildComponent work="Coding" />;
};

const ChildComponent = (props) => {
  return <div>{props.work}중입니다...</div>;
};

export default ParentComponent;

ParentComponent 함수에서 ChildComponent를 호출하고 propswork="Coding"을 전달

ChildComponent 함수에서 전달받은 props는 객체 형태로 work를 사용하기 위해 props.work로 조회한다.

만약 ParentComponent 함수에서 ChildComponentprops를 전달하지 않으면 defaultProps를 설정할 수 있다.

ParentDefualtComponent.js

import React from "react";

const ParentDefualtComponent = () => {
  return <ChildComponent />;
};

const ChildComponent = (props) => {
  return <div>{props.work}중입니다...</div>;
};

ChildComponent.defaultProps = {
  work: "Break"
};

export default ParentDefualtComponent;

ParentDefualtComponent 함수에서 ChildComponent를 호출하고 props를 전달하지 않으면

ChildComponent</span> 함수에서 defaultProps로 work의 초기 값을 Break로 설정해 해당 props.work를 전달 받지 못하면 defalutProps를 적용시킨다.

2. State

State는 상태를 의미하며 컴포넌트 내에서 관리되는 데이터이다.

State는 React Hooks useState를 이용해 읽기 및 쓰기 모두 가능하게 상태를 관리한다.

Counter.js

import React, { useState } from "react";

const Counter = () => {
  const [count, setCount] = useState(0); //count의 상태 값 선언 및 0 초기화

  const handleIncrease = () => { //count state 값을 +1 하는 함수
    setCount(count + 1);
  };

  const handleDecrease = () => { //count state 값을 -1 하는 함수
    setCount(count - 1);
  };

  return (
    <div>
      <div>{count}</div> {/*현재 count 값(읽기 전용)*/}
      <button onClick={handleIncrease}>+1</button> {/*버튼 클릭 시 handleIncrese 함수 호출*/}
      <button onClick={handleDecrease}>-1</button> {/*버튼 클릭 시 handleDecrese 함수 호출*/}
    </div>
  );
};

export default Counter;

useState hook을 사용해 count라는 이름의 state 선언 및 초기 값 0 설정

count 증감 함수를 각각 만들고 setCount를 이용한 count의 상태 값을 +1 또는 -1

현재 count 상태 값을 보여주고

버튼을 누르면 각 버튼 마다 증가 또는 감소 함수를 호출한다.

그럼 여기서 의문이 생길 수 있다!

Q: 왜 State 값을 직접 바꾸지 않고 setState(useState)를 사용하는가?

👉 React는 컴포넌트의 State 변화를 감지하고 이에 따라 re-rendering을 효율적으로 관리한다.

👉 setState 또는 useState를 사용하면 React가 상태 변경을 감지해 자동으로 필요한 re-rendering을 발생시킨다.

👉 하지만 직접적으로 State를 바꾸게 되면 이를 감지하지 못해 정상적인 업데이트가 이루어지지 않을 수 있기 때문이다.

React에서 State 변화가 감지 시 처리 과정

✍️ setState 또는 useState를 통해 State를 변경하면 React는 새로운 상태 저장

✍️ React는 업데이트된 State를 가지고 컴포넌트를 re-rendering, render() 메소드 실행

✍️ 업데이트된 UI가 사용자에게 반영

결론

👍 Props는 단방향 트리 형태를 계층 구조를 가지고 있어 추적이 용이하고 데이터 흐름을 이해하는 것은 쉽다.

👎 하지만, 트리가 점점 커지면 전달 과정도 많아져 성능 저하 문제가 발생하고 모든 데이터가 의존성을 나타내 유지보수가 어렵다.

👍 State에 경우 컴포넌트 내에서 관리하게 됨으로써 수정이 용이하고 의존성 나타내지 않는다

👎 하지만 모든 데이터를 state로 만들게 되면 그만큼의 Resource를 사용하기 때문에 비효율적이다.

0개의 댓글