useState

React 에서 상태를 관리할 때 가장 기본적인 useState 를 정리해봅니다.

 

useState 는 가장 기본적인 상태 관리 함수로써 사용됩니다.

사용법도 아주 간단하지만 세부적으로 들어가면 모르는 부분이 있을 수 있다고 생각하기 때문에 실수할 수 있는 부분을 줄이면 좋겠다 싶어 정리해 보았습니다.

useState

import { useState } from 'react';
const [data, setData] = useState('initialState');

 

useState 를 배우면서 알아야 할 가장 중요한 부분을 미리 정리합니다.

 

1. useState 를 사용할 때 배열 구조 분해를 사용하여 변수의 이름을 짓는 것이 규칙입니다.
2. useState() 안에 매개변수로 들어가는 것은 초기 상태로서 이 매개변수는 초기 렌더링 이후에는 무시됩니다.
3. 이 매개변수에는 함수도 들어갈 수 있는데 그 함수에는 return 값이 꼭 필요합니다.

4. useState 는 배열 구조 분해를 할때 두개의 변수를 선언합니다.
5. 하나는 데이터가 저장될 장소, 다른 하나는 데이터의 값을 내가 원하는 대로 바꿀 함수입니다.
6. useState 는 루프문이나 조건문에서 사용할 수 없습니다.

 

예제

import { useState } from 'react';

export default function Form() {
    const [name, setName] = useState('Taylor');
    const [age, setAge] = useState(42);

return (
    <>
    <input
        value={name}
        onChange={e => setName(e.target.value)}
    />
    <button onClick={() => setAge(age + 1)}>
    <p>Increment age Hello, {name}. You are {age}.</p>
    </>
);
}

 

업데이트 함수

만약 이러한 코드가 있다면 React 에서는 어떻게 동작하게 될까요?

function handleClick() {
    setAge(age + 1); // setAge(42 + 1)
    setAge(age + 1); // setAge(42 + 1)
    setAge(age + 1); // setAge(42 + 1)
}

 

이 함수를 실행해도 나이는 45가 아닌 43만 되는데,
이것은 set 함수를 호출해도 이미 실행 중인 코드에서 나이 상태 변수를 업데이트하지 않기 때문입니다.

set 함수는 const [count, setCount] = useState(0); 에서 setCount 를 말합니다.


따라서 각 setAge(age + 1) 호출은 setAge(43)이 되는 것입니다.

이 문제를 해결하기 위해 다음 상태 대신에 setAge에 업데이터 함수를 전달할 수 있습니다.

 

function handleClick() {
    setAge(a => a + 1); // setAge(42 => 43)
    setAge(a => a + 1); // setAge(43 => 44)
    setAge(a => a + 1); // setAge(44 => 45)
}

 

여기서 a => a + 1은 업데이터 함수입니다. 이는 대기 중인 상태를 받아서 다음 상태를 계산합니다.

React는 업데이터 함수를 대기열(stack)에 넣습니다.
이렇게 3번의 업데이트 함수가 대기열에 저장이 되면 최종적으로 마지막에 컴포넌트를 리렌더링 할때
stack 에 저장되어 있던 업데이트 들이 차례대로 실행되면서 3번의 리렌더링이 됩니다.
우리의 눈에는 보이지 않을 정도로 빠르게 리렌더링이 되기 때문에 한번에 바뀌는 모습을 볼 수 있습니다.

 

a => a + 1은 대기 중인 상태로 42를 받아 43을 다음 상태로 반환합니다.
a => a + 1은 대기 중인 상태로 43을 받아 44를 다음 상태로 반환합니다.
a => a + 1은 대기 중인 상태로 44를 받아 45를 다음 상태로 반환합니다.

 

다른 대기 중인 업데이트가 없으므로 React는 최종적으로 45를 현재 상태로 저장합니다.

 

객체와 배열, 함수 넣기

React에서는 객체와 배열을 상태(state)에 넣을 수 있습니다.
그러나 React에서 상태는 읽기 전용으로 간주되므로 기존 객체를 직접 변경(mutate)하는 대신, 해당 객체를 대체(replace)해야 합니다.

"읽기 전용(Read-only)"이란 말은 데이터를 가져오거나 읽을 수는 있지만,
데이터를 변경하거나 수정할 수 없는 것을 의미

 

React에서 상태(state)는 한 번 설정된 후에는 변경되어서는 안 되는 것으로 간주됩니다.

이것은 React의 중요한 설계 원칙 중 하나인 "불변성(Immutability)"의 일부입니다.

// 이렇게 변경하지 마세요.
setData({ firstName: 'chan' })

// 이렇게 변경하세요.
setData({
    ...data,
    firstName: 'chan'
})

 

이렇게 불변성을 유지해야 React 에서 상태 변경을 참고해서 변경된 부분만 바꾸고 리렌더링을 진행합니다.

만약 초기값을 함수를 넣는다면 이렇게 만들어야 합니다.

// 이렇게 하면 리렌더링시 매번 함수를 실행합니다.
const [data, setData] = useState(takeData())

// 이렇게 하면 초기 리렌더링일때만 실행합니다.
const [data, setData] = useState(takeData)

 

'React' 카테고리의 다른 글

Axios  (0) 2024.07.28
React Redux  (0) 2024.07.10
useCallback  (0) 2024.05.03
useMemo  (0) 2024.05.03
useEffect  (0) 2024.05.01