[React] useState hook 복습하기

2025. 4. 8. 17:40·프레임워크 및 라이브러리/React

`useState` 란 React 훅(Hook) 중 하나로, 컴포넌트에서 상태 (State) 를 관리하기 위해 사용된다. 

 

상태는 컴포넌트에서 바뀔 수 있는 데이터를 의미한다, 

예를 들어, 사용자 입력값, 클릭 횟수, API 에서 받아온 데이터 등이 상태로 관리된다. 

 

useState 사용법은 먼저 

`import { useState } from 'react';` 로 import 해 준 다음, 

 

최상단에 

`const [ count, setCount ] = useState(초기값);` 으로 사용할 수 있다

 

예시코드 

import { useState } from 'react';

function App() {
  // useState 사용법
  const [count, setCount] = useState(초기값);
  
  return (
    <div>
      <p>현재 숫자: {count}</p>
      <button onClick={() => setCount(count + 1)}>숫자 증가</button> // 여기서 상태 변경시 자동으로 다시 렌더링 된다.
    </div>
  );
}

export default App;

 

여기서 `초기값` 엔 `count` 라는 상태가 처음엔 `초기값` 으로 시작하는 것을 의미한다. 

  •  `useState()` 함수는 두 가지 값을 가진 배열을 반환한다.
    • 1. `count` : 현재 상태 값!!!
    • 2. `setCount` : 현재 상태 값을 변경하기 위한 값 ( 보통 현재 상태 값 앞에 `set`이라는 단어를 추가해서 작명한다 )

 

 

 


useState를 사용하여 장바구니 counter 증가하는 간단한 기능 구현 및 코드 분석 해보기.

 

App.jsx

import { shopData } from "./shopData";
import { useState } from "react";
import ShopItemList from "./components/ShopItemList";

// App.jsx
function App() {
  
  const [shopList, setShopList] = useState(shopData); 
  // shopList: 현재 상태 값을 저장하는 변수
  // 초기값으로 shopData를 전달해서, 이 데이터를 shopList로 관리.
  // setShopList: 상태 값을 변경하기 위한 함수

  // onIncreaseCartCount 함수: 특정 상품의 장바구니 수량을 증가시키는 함수
  const onIncreaseCartCount = (shopId) => {
    // 매개변수로 shopId를 받음 (사용자가 클릭한 아이템의 고유 id)
    
    const newShopList = shopList.map((s) => {
      // shopList(shopData) 배열을 순회하며 각 요소를 확인 (map 함수는 새로운 배열을 반환)
      
      if (s.id === shopId) 
        // 조건: 클릭된 아이템의 id와 일치하는 경우
        return {
          ...s, // 기존 객체의 내용을 모두 복사 (스프레드 연산자 사용)
          count: s.count + 1, // count 값만 1 증가시키고 새로운 객체로 반환
        };
      else 
        // 조건: 클릭된 아이템이 아니면 기존 객체 그대로 반환
        return s;
    });

    setShopList(newShopList); // 상태 업데이트 (새로운 배열로 변경된 상태를 저장)
    // 리액트는 상태가 변경되면 자동으로 컴포넌트를 다시 렌더링함
  };

  return (
    <main>
      {/* 메인 콘텐츠 영역 */}
      <h3>Mandoo Shop</h3>

      <ul>
        {shopList.map((data) => (
          <ShopItemList
            key={data.id} // 고유한 키를 제공하여 React가 요소를 효율적으로 업데이트할 수 있도록 함
            data={data} // 각 상품 데이터 객체를 props로 전달
            onIncreaseCartCount={onIncreaseCartCount} // 증가 함수도 props로 전달
          />
        ))}
      </ul>
    </main>
  );
}

export default App;

 

  • `Props`란 컴포넌트 사이에서 데이터를 전달하기 위해 사용하는 객체
    • 부모 컴포넌트 ( App ) -> 자식 컴포넌트 (ShopItemList) 로 데이터를 넘겨줄 때 사용. 

Props 는 읽기 전용이라 자식 컴포넌트는 받은 Props를 수정할 수 없다. 함수의 매개변수 처럼 사용 가능 `props.name` 

 

ShopItemList.jsx

import "./ShopItemList.css";

// 부모 컴포넌트(App)에서 전달된 props를 구조 분해 할당으로 받아 사용함.
// props: 'data'와 'onIncreaseCartCount'
const ShopItemList = ({ data, onIncreaseCartCount }) => {
  // 여기서 data는 각 상품의 정보 객체(ShopData) (ex. { id: , productName: , productPrice: , count:  })
  // onIncreaseCartCount는 부모 컴포넌트에서 전달된 함수 (장바구니 수량을 증가시키는 함수)
  
  return (
    <li>
      {/* 상품 이름 출력 */}
      <p>{data.productName}</p>  {/* data 객체에서 productName 값을 화면에 출력 */}
      
      {/* 상품 가격 출력 */}
      <p>{data.productPrice}</p>  {/* data 객체에서 productPrice 값을 화면에 출력 */}

      {/* 현재 장바구니 수량 표시 */}
      <span>장바구니 수량 : {data.count}</span>  {/* data 객체에서 count 값을 화면에 출력 */}

      {/* 장바구니 수량 증가 버튼 */}
      {/* 클릭 이벤트 발생 시 onIncreaseCartCount 함수를 호출하면서 현재 상품의 id 값을 인수로 전달 */}
      <button onClick={() => onIncreaseCartCount(data.id)}>
        장바구니 + 1
      </button>
    </li>
  );
};

export default ShopItemList;

'프레임워크 및 라이브러리 > React' 카테고리의 다른 글

[React] useEffect  (0) 2025.04.09
[React] Life Cycle 라이프 사이클  (0) 2025.04.09
[React] 배포 준비하기 (vercel을 통해 간단하게 ok)  (0) 2025.02.18
[React] 웹 스토리지 이용하기  (0) 2025.02.18
[React] npm install (npm i) 발생하는 오류,,,,  (0) 2025.01.28
'프레임워크 및 라이브러리/React' 카테고리의 다른 글
  • [React] useEffect
  • [React] Life Cycle 라이프 사이클
  • [React] 배포 준비하기 (vercel을 통해 간단하게 ok)
  • [React] 웹 스토리지 이용하기
“하루하루가 새로운 인생이다.”
“하루하루가 새로운 인생이다.”
제가 배운 지식을 정리하고 오래 기억하고 싶어서 만든 블로그입니다.
  • “하루하루가 새로운 인생이다.”
    땅콩
    “하루하루가 새로운 인생이다.”
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • 일상 (2)
      • 에러처리 (0)
      • 프로그래밍 언어 (34)
        • TypeScript (21)
        • JavaScript (6)
        • 퍼블리싱 ( HTML, CSS ) (7)
        • 코테 (0)
      • 프레임워크 및 라이브러리 (10)
        • React (10)
        • Next.js (0)
        • Vue.js (0)
        • Spring Boot (0)
      • 데이터베이스 (0)
        • Oracle (0)
      • 디자인 (0)
        • Figma (0)
      • 개발 도구 (5)
        • Git (4)
        • Docker (0)
        • IDE (1)
      • 프로젝트 (0)
        • 개인 프로젝트 (0)
        • 팀 프로젝트 (0)
        • 프로젝트 회고 (0)
      • 정보처리기사 (12)
        • 1과목 (4)
        • 2과목 (2)
        • 3과목 (2)
        • 4과목 (2)
        • 5과목 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    타입 별칭
    한 입 크기로 잘라먹는 타입스크립트
    js
    벼락치기
    리액트
    css
    이정환
    웹
    타입스크립트
    정처기
    인터페이스
    javascript
    타입 스크립트
    GIT
    HTML
    React
    자바스크립트
    정보처리기사
    Hook
    TypeScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
“하루하루가 새로운 인생이다.”
[React] useState hook 복습하기
상단으로

티스토리툴바