본문 바로가기
frontend (React) 개발

(React) useState

by 꼰대코더 2023. 8. 11.

useState 는 React class에서 사용하던 state 를 functional component  에서 간단히 사용가능하게 하는 React Hook중 하나이다. useState(초기값 또는 blank)를 콜 하면 [ 값을 가지는 변수, 변경 가능한 함수] 를 리턴하게 되는데 이들의 명명은 자유롭게 할 수 있지만 [statename, setStatename] 으로 하는게 일반적이다.

state의 값은 setStatename 함수로 변경 할 수 있고, 변경후엔 화면이 자동으로 다시 렌더링하게 되어 state 변수를 사용한 컴포넌트들도 바뀌게 된다. ※ setStatename 함수에 의한 값은 비동기로 변경되기 때문에 아주 긴 string을 변경하여 바로 뒤 코드에서 statename을 들여다 보게 되면 아직 값이 반영이 되지 않는 경우도 있기 때문에 주의가 필요하다.

 

아래 샘플코드에서 보면 state 에 0 을 초기화 하여 0을 보관하는 count 와 변경함수 setCount 를 리턴하고 있다.

버튼 클릭과 동시에 전state 값에 1을 더하여 변경함수 setCount 를 호출하면 count 에 1이 더한 값이 들어가고 화면은 다시 렌더링하게 되고 you clicked {count} times   부분의 숫자도 갱신되게 된다.   

import React, { useState } from 'react';

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

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(prCount => prCount + 1)}>
        click
      </button>
    </div>
  );
}

 

useState 에 설정가능한 데이터 타입과 변경법

  • dictionary 값 변경
    * prevDic : 변경전의 현재값으로 이름은 편하게 명명해도 괜찮다.
const [myDic, setMyDic] = useState({ id: 1, name: 'foo' });

const updateDic = () => {
  setMyDic((prevDic) => ({ ...prevDic, name: 'bar' }));
  // { id: 1, name: 'bar' }
};

 

      form submit 의 경우, control name을 지정하고 onChange={handleChange}  를 설정.

const [ formData, setFormData ] = useState({ username: '', email: '', password: '' })

function handleChange(e) {
           const key     = e.target.name;
           const value  = e.target.value;
           setFormData({...formData, [key]: value})
}
  • list 에 추가
const [myList, setMyList] = useState(['foo', 'bar']);

const addList = () => {
  setMyList((prevList) => ([ ...prevList, 'baz' ]));
  // ['foo', 'bar', 'baz']
};
  • list 선두에 추가
setMyList((prevList) => (['baz', ...prevList]));
  • splice 로 지정된 위치에 끼워넣기
    splice(index, how many to remove, item1, item2, ...)
setMyList((prevList) => {
      const arr = [...prevList];
      arr.splice(1, 0, 'baz');
      return arr;
});
  • filter 로 삭제하기
    filter : 원래 array는 건들이지 않고 각 요소를 true / false 조건으로 새로운 array를 리턴
const [myList, setMyList] = useState(['foo', 'bar']);

const deleteList = () => {
  setMyList((prevList) => prevList.filter((value) => value !== 'bar'));
  // ['foo']
};
  • map 로 값 변경하기
    map : 원래 array는 건들이지 않고 각 요소값을 변경하여 새로운 array를 리턴
const [myList, setMyList] = useState(['foo', 'bar']);

const updateList = () => {
  setMyList((prevList) =>
    prevList.map((value) => (value === 'bar' ? 'new' : value))
  );
  // ['foo', 'new']
};
  • map index로 변경하기
prevList.map((value, index) => (index === 1 ? 'new' : value))
  • object list 에 object 추가하기
const [objList, setObjList] = useState([
  { id: 1, name: 'foo' },
  { id: 2, name: 'bar' },
]);

const updateList = () => {
  setObjList((prevObjList) => [...prevObjList, { id: 3, name: 'baz' }]);
  // [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 3, name: 'baz' }]
};
  • map 을 이용한 object list 변경하기
 setObjList((prevObjList) =>
   prevObjList.map((obj) => (obj.id === 2 ? { id: obj.id, name: 'new' } : obj))
 );

'frontend (React) 개발' 카테고리의 다른 글

(React) VS Code Extension - React Component Splitter  (0) 2023.11.23
(React) useContext  (0) 2023.11.23
(React) Props  (1) 2023.11.23
(React) useRef  (0) 2023.11.21
(React) useEffect  (1) 2023.11.20