React State & Props

jung_ho9 개발일지·2022년 11월 29일
0

React

목록 보기
3/28
post-thumbnail
post-custom-banner

https://ko.reactjs.org/

State

  • 변할 수 있는 값

Props vs State

  • props는 외부로부터 전달받은 값
  • state는 내부에서 변화하는 값

Props특징

  • 외부로부터 전달받은 값으로, 웹 애플리케이션에서 해당 컴포넌트가 가진 속성에 해당한다.
  • 컴포넌트가 최초 렌더링 될 때 화면에 출력하고자 하는 데이터를 담은 초깃값으로도 사용할 수 있다.
  • 객체 형태이다. props로 어떤 타입의 값도 넣어 전달할 수 있도록 props는 객체의 형태를 가진다.

Props 기본 사용법

  1. 하위 컴포넌트에 전달하고자 하는 값과 속성을 정의한다.
  2. props를 이용하여 정의된 값과 속성을 전달한다.
  3. 전달받은 props를 렌더링 한다.
function Parent() {
 return (
   <div class="parent"> 
   		<h1>parent</h1>
   			<Child text={"child"}/>
   	</div>
   );
};

function Child(props) {
  return (
    <div className="child">
    	<p>{props.text}</p>
    </div>
  );
};

Props,비구조화 할당사용 가능

Props는 객체 형태이기 때문에 props.를 통해 접근하는데 이를 비구조화 할당(구조 분해) 문법을 사용하면 코드를 더 간결하게 작성 할 수 있다.

function Parent() {
 return (
   <div class="parent"> 
   		<h1>parent</h1>
   			<Child text={"child"}/>
   	</div>
   );
};

function Child({text}) {  // 구조 분해 문법 
  return (
    <div className="child">
    	<p>{text}</p>
    </div>
  );
};

defaultProps, 기본값 설정 가능

컴포넌트에 props를 지정하지 않았을 때 기본값을 설정하고 싶다면 defaultProps 값을 설정하면 된다.

fcuntion Hello({name}) {
	return <div>{name}</div> //이름을 적어주세요
}

Hello.defaultProps = {
	name : '이름을 적어주세요' 
}

props.childeren, 사용법

컴포넌트 태그 사이에 넣은 값을 조회하고 싶을 땐, props.chidren을 조회하면 된다.

function Parent() {
 return (
   <div class="parent"> 
   		<h1>parent</h1>
   			<Child>자식 컴포넌트 입니다.</Child>
   	</div>
   );
};

function Child(props) {  
  return (
    <div className="child">
    	<p>{props.children}</p> //자식 컴포넌트 입니다.
    </div>
  );
};

조건부 렌더링

조건부 렌더링이란, 특정 조건에 따라 결과물을 렌더링 하는 것을 의미한다.

예를 들어 Hello 컴포넌트에서 App.js에서 전달하는 isSpecial 값이 true이냐 false이냐에 따라서 컴포넌트의 좌측에 * 표시를 준다면 삼항연산자를 사용할 수도 있지만, 단순히 특정 조건이 true면 보여주고 그렇지 않다면 아무 변화가 없어도 될 때는 단축 평가 논리 계산법&&연산자를 사용해서 처리하는 것도 좋은 방법이다.

App.js
function App() {
  return (
    <Wrapper>
      <Hello name="react" color="red" isSpecial={true}/>
      <Hello color="pink" />
    </Wrapper>
  )
}


Hello.js ====> 삼항연산자 사용
function Hello({ color, name, isSpecial }) {
  return (
    <div style={{ color }}>
      { isSpecial ? <b>*</b> : null }
      안녕하세요 {name}
    </div>
  );
}

Hello.defaultProps = {
  name: '이름없음'
}

Hello.js =====> && 연산자 사용 
function Hello({ color, name, isSpecial }) {
  return (
    <div style={{ color }}>
      { isSpecial && <b>*</b> }
      안녕하세요 {name}
    </div>
  );
}

Hello.defaultProps = {
  name: '이름없음'
}

props 값 설정을 생략하면 ={true}

props 값을 설정하게 될 때 만약 props 이름만 작성하고 값 설정을 생략한다면, 이를 true 로 설정한 것으로 간주합니다.

function App() {
  return (
    <Wrapper>
      <Hello name="react" color="red" isSpecial /> 
      <Hello color="pink"/>
    </Wrapper>
  );
}

isSpecial 이름 넣어주면 isSpecial={true}와 동일

useState

리액트 16.8 이전 버전에서는 함수형 컴포넌트에서는 상태를 관리할 수 없었지만, 리액트 16.8 에서 Hooks 라는 기능이 도입되면서 함수형 컴포넌트에서도 상태를 관리할 수 있게 되었다. useState 라는 함수가 바로 리액트의 Hooks 중 하나다.

버튼을 누르면 숫자가 바뀌는 counter 컴포넌트를 만든 예로 useState에 대해 알아보자 !
onIncreaseonDecrease의 이벤트가 이해가 잘 안되면 리액트 핸들링 포스트다시 보기

//////////////////////////////////  Counter.js
mport React, { useState } from 'react';

function Counter() {
  const [number, setNumber] = useState(0);

  const onIncrease = () => {
    setNumber(number + 1);
  }

  const onDecrease = () => {
    setNumber(number - 1);
  }

  return (
    <div>
      <h1>{number}</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );
}

export default Counter;

////////////////////////////////////  /App.js
import React from 'react';
import Counter from './Counter';

function App() {
  return (
    <Counter />
  );
}

export default App;

위의 코드에서 number 와 같이 동적인 값을 상태(state)라고 부르는데, 리액트의 useState라는 함수를 사용하면 컴포넌트에서 상태를 관리할 수 있다.

꼭 ! 아래 코드와 같이 리액트 패키지에서 useState 라는 함수를 불러와야지 사용 가능하다.

import React, { useState } from 'react';

useState 사용법

const [number, setNumber] = useState(0);

useState를 사용할 때는 상태의 기본값을 파라미터로 넣어서 호출하며 현재 기본값은 0이다. 그리고 이 함수를 호출하면 배열이 반환되는데 첫번째 원소는 현재 상태, 두번째 원소는 Setter 함수이다.
원래는 아래와 같은 코드이지만, 배열 비구조화 할당을 통해 각 원소를 추출한 것이다.

const numberState = useState(0);
const number = numberState[0];
const setNumber = numberState[1];

여기서 const를 사용하는 이유는? React는 상태를 변경했을 때 리렌더링 되는데 배열의 경우 주소값을 공유하면 변하지 않은 값으로 인식하기 때문에, const를 사용해서 동일한 범위 내에서 같은 참조 값을 재할당하지 않도록 보호해야 한다.

profile
꾸준하게 기록하기
post-custom-banner

0개의 댓글