프론트엔드/React

[React] 기초(3) - useState

tero1115 2023. 10. 4. 17:05

useState

yarn으로 state-react 프로젝트를 새로 만든다.

yarn create react-app state-react

 

index.js에서 <React.StrictMode>제거

 

App.js

function App() {
  return (
    <div>
      app
    </div>
  );
}


화면의 렌더링을 하기위한 데이터 

데이터가 바뀌면 화면이 바뀐다

 

기존

 - 명령형 프로그래밍 ( 작동 순서를 모두 매번 입력해야 한다 함수를 사용하던지 )

안녕이란 글자를 하이로 바꾸고싶다 -> hellodiv를 찾아서 innerText를 '하이'로 바꾼다

 

상태를 이용하는 프로그래밍

 - 선언형 프로그래밍 ( 미리 작동 방법을 입력해두고 데이터만 변경한다 )

안녕 -> 하이 로 바꾼다

 

 


* 구조분해할당

const arr = [1,2];

const [one, two] = arr;

console.log(one)
console.log(two)

const obj = {
    name : "홍길동",
    age : 12
}

const {name, age} = obj;

console.log(name)
console.log(age)

배열

 - 순서가 중요하다 / 변수명은 직접 작성

객체

 - 변수명이 중요하다 / 순서는 상관없다


App.js

import {useState} from "react";
function App() {
    // useState 리액트에서 상태를 관리하는 함수
    // 리턴값은 배열이고
    // 배열의 첫번째 요소는 값
    // 배열의 두번째 요소는 값을 변경하는 함수
    // useState의 매개변수는 값의 초기값

    const [count, setCount] = useState(0);

  return (
    <div>
        <div>{count}</div>
        <button>+</button>
    </div>
  );
}

+ 버튼을 누르면 숫자가 올라가게 하고싶다.

function App() {
    // useState 리액트에서 상태를 관리하는 함수
    // 리턴값은 배열이고
    // 배열의 첫번째 요소는 값
    // 배열의 두번째 요소는 값을 변경하는 함수
    // useState의 매개변수는 값의 초기값

    const [count, setCount] = useState(0);
    
    const increase = () => {
        setCount(prev => prev + 1);
    }

  return (
    <div>
        <div>{count}</div>
        <button onClick={increase}>+</button>
    </div>
  );

increase 함수 추가후 버튼을 누르면 실행되게 함

숫자가 증가한다.

setCount(prev => prev + 1); 대신

setCount(count + 1); 를 사용해도 카운트가 올라가지만

const increase = () => {
    // setCount(prev => prev + 1);
    setCount(count + 1);
    setCount(count + 1);
}

 이렇게 하면 1만 올라간다.

count를 직접 바꾸면 intcrease 함수가 끝나야 count가 처리되기 때문

const increase = () => {
    setCount(prev => prev + 1);
    setCount(prev => prev + 1);
}

이렇게 한다면 숫자가 2씩 올라가게 된다.


검색 만들어보기

src폴더에 Item.js 생성

function Item(props) {
    return (
        <li>{props.data}</li>
    );
}

export default Item;

App.js 수정

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

function App() {

    const [searchValue, setSearchValue] = useState("");

    const changeSearchValue = (event) => {
        setSearchValue(prev => event.target.value);
    }

  return (
    <div>
        <input value={searchValue} onChange={changeSearchValue} placeholder={"검색어를 입력해주세요"}/>
        <div>{searchValue}</div>
    </div>
  );
}

export default App;

 

App.js 수정

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

function App() {

    const [searchValue, setSearchValue] = useState("");

    const gameList = ["메이플스토리", "리그오브레전드", "서든어택", "배틀그라운드"];

    const changeSearchValue = (event) => {
        setSearchValue(prev => event.target.value);
    }

  return (
    <div>
        <input value={searchValue} onChange={changeSearchValue} placeholder={"검색어를 입력해주세요"}/>
        <ul>{gameList.map((el, index) => <Item key={index} data={el} />)}</ul>
    </div>
  );
}

export default App;

코드 수정 - 필터 추가 

<ul>{gameList.filter(el => el.includes(searchValue)).map((el, index) => <Item key={index} data={el} />)}</ul>

검색어를 포함하고있는 게임만 출력된다.

 

 

 

function App() {

    const [searchValue, setSearchValue] = useState("");

    const randomNumber1 = Math.random();
    const [randomNumber2] = useState(Math.random());

    const gameList = ["메이플스토리", "리그오브레전드", "서든어택", "배틀그라운드"];

    const changeSearchValue = (event) => {
        setSearchValue(prev => event.target.value);
    }

  return (
    <div>
        <div>{randomNumber1}</div>
        <div>{randomNumber2}</div>
        <input value={searchValue} onChange={changeSearchValue} placeholder={"검색어를 입력해주세요"}/>
        <ul>{gameList.filter(el => el.includes(searchValue)).map((el, index) => <Item key={index} data={el} />)}</ul>
    </div>
  );
}

randomNumber1은 검색어를 입력할때마다 숫자가 달라지지만

randomNumber2는 검색어를 입력해도 숫자가 변하지 않는다.

* 원칙상 컴포넌트 내부 변수는 state로 만드는것이 좋다.

렌더링 될 때마다 바뀌는 변수라면
렌더링 때마다 안바뀌게 하려면 state를 사용해야하고
바뀌어도 상관 없으면 일반 변수를 사용한다.

 

'프론트엔드 > React' 카테고리의 다른 글

[React] CSS Modules  (0) 2026.03.12
[React] 기초(6) - nextjs  (0) 2023.10.05
[React] 기초(5) - route  (0) 2023.10.04
[React] 기초(4) - useEffect  (0) 2023.10.04
[React] 기초(1)  (0) 2023.10.04