02. 컴포넌트 (5) useState

2022. 6. 9.·🎨 프론트엔드 공부/React & Next

출처 - 리액트를 다루는 기술(김민준 지음)


리액트 16.8 이후 부터는 useState 함수를 통해 함수형 컴포넌트에서도 state를 사용할 수 있게 됐다

이 과정에서 Hooks를 사용하게 된다

 

state의 값을 업데이트 할 때는, state 값에 직접 접근하면 안됨.

setState 또는 세터 함수로 값을 변경해야 한다 (그렇지 않으면 바뀐 값이 렌더링 X)

(1) useState 사용하기

Say.js 파일을 생성한다

useState로 state 값을 바꿀 때는 useState를 통해 전달받은 세터 함수를 사용한다

// Say.js
import React, { useState } from 'react';

const Say = () => {
  const [message, setMessage] = useState(''); // useState() 안에는 초기값을 준다
  const onClickEnter = () => setMessage('안녕하세요!');
  const onClickLeave = () => setMessage('안녕히 가세요!');

  return (
    <div>
      <button onClick={onClickEnter}>입장</button>
      <button onClick={onClickLeave}>퇴장</button>
      <h1>{message}</h1>
    </div>
  );
};

export default Say;

 

(2) 한 컴포넌트에서 useState 여러번 사용하기

useState는 한 컴포넌트에서 여러번 사용해도 상관없다

 

// Say.js
import React, { useState } from 'react';

const Say = () => {
  const [message, setMessage] = useState('');
  const onClickEnter = () => setMessage('안녕하세요!');
  const onClickLeave = () => setMessage('안녕히 가세요!');

  const [color, setColor] = useState('black');

  return (
    <div>
      <button onClick={onClickEnter}>입장</button>
      <button onClick={onClickLeave}>퇴장</button>
      <h1 style={{ color }}>{message}</h1>
      <button style={{ color: 'red' }} onClick={() => setColor('red')}>
        빨간색
      </button>
      <button style={{ color: 'blue' }} onClick={() => setColor('blue')}>
        파란색
      </button>
      <button style={{ color: 'green' }} onClick={() => setColor('green')}>
        초록색
      </button>
    </div>
  );
};

export default Say;

 

배열이나 객체를 업데이트할 때는 사본을 만들고, 그 사본에 값을 업데이트한 후에

그 사본의 상태를 세터 함수를 통해 업데이트 한다

 

// 객체 다루기
const object = { a: 1, b: 2, c: 3 };
const nextObject = { ...object, b: 2 }; // 사본을 만들고 b값을 2로 덮어 쓰기

// 배열 다루기
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인 항목 제거
netxArray.map(item => (item.id === 1 ? { ...item, value: false } : item));
// id가 2인 항목의 value를 false로 변경

 

객체에 대한 사본을 만들 때는 spread 연산자를 사용하고

배열에 대한 사본을 만들 때는 배열의 내장함수(concat 등)를 사용한다

 

객체를 갖는 state 예시

 

import React, { useState } from 'react';

function App() {
  // useState 초기값을 객체로 설정한다
  const [person, setPerson] = useState({
    name: "guest",
    count: 0
  });
  
  return (
    <div className="App">
      <button onClick={() => {
      	// current는 초기값을 의미
        setPerson((current) => {
          const newPerson = { ...current };
          newPerson.count = newPerson.count + 1;
          return newPerson;
        })
      }}>여기를 클릭</button>
      <span>{person.name}님이 버튼을 {person.count}회 클릭하였습니다.</span>
    </div>
  );
}

export default App;

 

'🎨 프론트엔드 공부/React & Next' 카테고리의 다른 글
  • 03. 이벤트 핸들링 (1) Intro
  • 02. 컴포넌트 (6) state를 전달받는 컴포넌트
  • 02. 컴포넌트 (4) state
  • 02. 컴포넌트 (3) propTypes
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (516) N
      • 🎨 프론트엔드 공부 (253) N
        • JS & TS (92) N
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
02. 컴포넌트 (5) useState
상단으로

티스토리툴바