자바 스프링/react & springboot

#3 React useState

2023. 2. 11. 15:11
목차
  1. useState
  2. 컴포넌트화를 통한 분리

강의 링크 :

https://www.youtube.com/watch?v=swGjcOWZ3d0&list=PL93mKxaRDidEfLM0I_FFb-98vfAQgXT82&index=6
해당 게시글은 위 링크의 강의를 보고 해당 내용을 정리한 게시글입니다!

 

 

useState

*참고

<button onClick={add}>더하기</button>

버튼에 함수를 이렇게 바인딩만 시켜야 한다.

 

<button onClick={add()}>더하기</button>

이렇게 작성해버리면 함수가 바로 실행된다.

 

App.js

실행결과 )

더하기 버튼을 누르면 number의 값이 올라가지만 화면에 나타나진 않는다.

현재 number가 '상태'가 아니기 때문에 UI가 자동으로 변경되지 않는 것이다.

 

※ 렌더링 시점은 상태값 변경이 일어날 때이다.

 

따라서 let number = 1; 을 수정해서 number를 상태로 변경해주자

이렇게 작성하면 변수를 변경하려면 setNumber로 변경해야 된다.

따라서 작성했었던 number++; 코드를 삭제하고 setNumber를 작성해준다.

여기서 setNumber(number++)를 해서는 안된다. number++는 자신한테 값을 다시 넣는 것이기 때문이다.

 

실행결과 )

이제 number가 변경되면 UI가 그것을 반영해준다.

 

 

 

컴포넌트화를 통한 분리

 

여기서 잠시, 코드를 살펴보자

setNumber가 호출될 때 마다 return 영역이 다시 그려진다는 문제점이 있다.

즉, 더하기 버튼도 계속 다시 그려진다는 것이다.

 

그러므로 분리해서 그려보자

이전 글에서 정리했듯이, 컴포넌트화를 통해 코드를 작성하면 된다.

 

우선 파일을 생성하고

 

이렇게 rcc를 작성하면 자동완성 기능이 있다.

 

그러면 이렇게 자동으로 해당 양식이 완성된다.

 

Sub.js

import React from 'react';

const Sub = () => {
  return (
    <div>
      <h1>Sub입니다.</h1>
    </div>
  );
};

export default Sub;

 

App.js

import { useState } from 'react';
import './App.css';
import Sub from './Sub';

function App() {
  const [number, setNumber] = useState(1); // React 안에 hooks 라이브러리

  const add = () => {
    setNumber(number + 1); // React한테 number 값 변경 요청하는 것이다.
    console.log('add', number);
  };
  return (
    <div>
      <h1>숫자: {number}</h1>
      <button onClick={add}>더하기</button>
      <Sub />
    </div>
  );
}
export default App;

여기서 Sub.js로 컴포넌트화 시켰기 때문에

해당 <Sub /> 영역이 다시 그려져야할지 아닐지 제어할 수가 있게 된다.

 

 

렌더링에 대해 알아보자

import { useState } from 'react';
import './App.css';

function App() {
  console.log('App 실행됨');

  let sample = [
    { id: 1, name: '다람쥐' },
    { id: 2, name: '핑크빈' },
    { id: 3, name: '라이츄' },
    { id: 4, name: '피카츄' },
  ];

  const [users, setUsers] = useState(sample); // 레퍼런스 변경되어야 동작한다.

  const download = () => {
    sample.push({ id: 5, name: '도토리' });
    setUsers(sample);
  };

  // 렌더링 시점 = 상태값 변경
  return (
    <div>
      <button onClick={download}>다운로드</button>
      {users.map((user) => (
        <h1>
          {user.id}, {user.name}
        </h1>
      ))}
    </div>
  );
}
export default App;

이렇게 코드를 작성했을 때,

다운로드 버튼을 누를 경우 return 영역이 렌더링이 될까?

만약 렌더링이 된다면 콘솔창에 "App 실행됨"이 찍힐 것이고

{ id: 5, name: '도토리' } 가 추가될 것이다.

 

실행해보면 렌더링 되지 않는 것을 확인할 수 있다.

왜냐하면 현재 작성된 코드의 sample 레퍼런스가 그대로이기 때문에 동작하지 않는 것이다.

 

그림을 다시 그리고 싶다면 이전 글에서 학습한 함수들에 대해 알아야 한다.

filter, map, concat, 정규 연산자, slice 이다.

여기선 concat을 사용하면 된다.

 

이렇게 레퍼런스를 변경하는 깊은 복사를 사용하였기 때문에 다시 그려진다.

concat 말고

setUsers([...sample, { id: 5, name: '도토리' }]);

이렇게 작성하는 편이 좀 더 간단하다.

 

 

 

import { useState } from 'react';
import './App.css';

function App() {
  console.log('App 실행됨');
  const [num, setNum] = useState(5);

  let sample = [
    { id: 1, name: '다람쥐' },
    { id: 2, name: '핑크빈' },
    { id: 3, name: '라이츄' },
    { id: 4, name: '피카츄' },
  ];

  const [users, setUsers] = useState(sample); // 레퍼런스 변경되어야 동작한다.

  const download = () => {
    // fetch().then().then();
    setUsers([...sample, { id: num, name: '도토리' }]);
    setNum(num + 1);
  };

  // 렌더링 시점 = 상태값 변경
  return (
    <div>
      <button onClick={download}>다운로드</button>
      {users.map((user) => (
        <h1>
          {user.id}, {user.name}
        </h1>
      ))}
    </div>
  );
}
export default App;

 

실행결과 )

 

1번 눌렀을 경우

 

5번 눌렀을 경우

 

왜냐하면 num은 항상 불변(const)이고 빨간 줄 영역만 변경되기 때문이다.

 

 

 

'자바 스프링 > react & springboot' 카테고리의 다른 글

#4 React useEffect, useMemo, useRef  (0) 2023.02.12
#2 React 배열, 배열 수정  (0) 2023.01.31
#1 React 실행흐름, 기본문법  (0) 2023.01.19
#0 React 설치 및 세팅  (0) 2023.01.18
  1. useState
  2. 컴포넌트화를 통한 분리
'자바 스프링/react & springboot' 카테고리의 다른 글
  • #4 React useEffect, useMemo, useRef
  • #2 React 배열, 배열 수정
  • #1 React 실행흐름, 기본문법
  • #0 React 설치 및 세팅
daramG
daramG
dotori Java
daramG
다람쥐의 개발 블로그
daramG
전체
오늘
어제
  • 분류 전체보기 (193)
    • Java 코딩테스트 공부 (67)
      • Java 알고리즘 공부 (37)
      • Java 백준 문제풀이 (27)
      • Java 코테 나만의 팁 (3)
    • SQL Study (0)
      • Programmers SQL 문제풀이 (0)
      • SQLP 준비 (0)
    • 웹 개발 지식 정리 (0)
      • Servlet (0)
      • Java 정리 (0)
    • 자바 스프링 (45)
      • 스프링 공부 (4)
      • 스프링 게시판 프로젝트 (6)
      • 부트 블로그 JPA 프로젝트 (30)
      • react & springboot (5)
      • 스프링 오류창고 (0)
      • 리액트 + 스프링 프로젝트 (0)
      • pf (0)
      • pfError (0)
    • React (6)
      • React 정리 (3)
      • React 오류 창고 (3)
    • C++ 코딩테스트 공부 (중단) (20)
      • c++ 백준 문제풀이 (15)
      • c++ 알고리즘 공부 (5)
    • Unity (3)
      • Unity 공부 (3)
    • WebRTC (2)
      • WebRTC 강의학습 정리 (0)
      • WebRTC 프로젝트 (1)
    • 김영한님의 스프링 강의 학습 (10)
      • 스프링 강의 목차 (1)
      • 인텔리제이 & 스프링 기초 (1)
      • 스프링 핵심 원리 (8)
    • 전공 지식 정리 (40)
      • interview (0)
      • Java (0)
      • 운영체제 (4)
      • 데이터베이스 설계 (10)
      • 소프트웨어 공학 (3)
      • 유닉스 (14)
      • 디지털 논리회로 (0)
      • 인공지능 (7)
      • js (0)
      • etc (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • React&Spring 강의수강
  • Java 코테 나만의 팁
  • 스프링 공부
  • 스프링부트 블로그 프로젝트
  • 김영한 스프링 입문
  • 운영체제
  • 백준 c++
  • java 알고리즘
  • java
  • 노마드코더의 zoom클론코딩
  • 유닉스
  • Java 백준 문제풀이
  • 인공지능
  • 디지털 논리회로
  • 스프링부트 프로젝트
  • 무서운 이야기
  • Unity 공부
  • C++ 알고리즘
  • 김영한 스프링 강의
  • 데이터베이스 설계
  • 스프링 프로젝트
  • 부트 jpa 게시판 프로젝트
  • 코테 알고리즘
  • 김영한의 스프링 핵심 원리

최근 댓글

최근 글

hELLO · Designed By 정상우.
daramG
#3 React useState
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.