useState 없이 데이터 변경해보기

useState를 사용하지 않고 데이터를 변경시키려면 데이터가 바뀔때마다 render 될 수 있도록
데이터를 변경하는 함수에 모두 render 함수를 넣어줘야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const root = document.getElementById("root");

let num = 0; // 데이터를 담을 변수

function render() {
  ReactDOM.render(<App />, root); // 화면을 렌더할 함수
}

function countUp() {
  num = num + 1;
  render(); // 데이터 변경 시 화면을 리렌더 할 수 있도록 함
}

function App() {
  return (
    <div>
      <h3>Count : {num}</h3>
      <button onClick={countUp}>Click me</button>
    </div>;
  )
}

render(); // 처음에 화면을 렌더링

위 내용을 useState를 활용해 바꾸면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const root = document.getElementById("root");

function App() {
  const [num, setNum] = React.useState(0)
  // 데이터를 담고, 변경하고, 리렌더한다.

  const onClick = () => {
    setNum(num + 1) // 데이터를 변경할 함수 구현
  }

  return (
    <div>
      <h3>Count : {num}</h3>
      <button onClick={onClick}>Click me</button>
    </div>;
  )
}

ReactDOM.render(<App />, root); // 처음에 화면을 한번만 렌더링 하면 된다

useState는 데이터를 보관하고, 데이터가 바뀌면 자동으로 리렌더시켜준다.
컴포넌트 전체를 리렌더 시키며, 바뀐 부분의 UI를 refresh 한다.



useState 이해하기

1
const data = React.useState(0);

이렇게 선언하고 data를 콘솔에 찍어보면 [0, function] 이라는 배열이 나온다.
0은 내가 입력한 값이고, function은 modifier의 역할을 하는 함수이다. (값을 바꿀때 사용할 함수)

그래서 보통 const [data, setData] = React.useState(0)의 형식으로 사용하는데,
구조분해할당 문법으로 useState가 가지고 있는 값과 함수를 할당해준 것이다.

구조분해할당 (Destructuring Assignment)

1
2
3
4
let numArr = [1, 2, 3];
let [one, two, three] = numArr;

console.log(one); // 1



modifier 함수 제대로 사용하기

위 코드블럭에서는 이벤트 함수 onClick 을 만들고,
modifier 함수인 setData 를 활용할때 데이터를 직접적으로 바꾸는 방식으로 구현했다.

하지만 이렇게하면 데이터가 의도와 다르게 바뀌는 경우가 생길 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
const [num, setNum] = React.useState(0);

function onClick() {
  setNum(num + 1); // 1
  setNum(num + 1); // 1
  // 처음에 num값으로 설정된 0을 가져와서 1을 더하는 작업 반복 실행
}
function onClick2() {
  setNum((current) => current + 1); // 1
  setNum((current) => current + 1); // 2
  // 현재 값을 가져와서 데이터를 바꾸는 내용 실행
}

현재 state 값을 참조해서 함수를 실행시키는것이 안전하므로
setNum((current) => current + 1) 의 방식으로 구현하는 것이 좋다.

Leave a comment