가장 자주 사용하고, 가장 친숙한 state를 사용할때 주의해야하는 점 위주로 작성함
리액트 블로그를 보고 작성하는데 생각보다 내용이 너무 많아서 다 적지는 못했음

useState

  • 함수 컴포넌트에서도 가변적인 상태를 지닐 수 있게 해줘서 상태 관리를 가능하게 해줌
  • 기본 형태
    const [state, setState] = useState(initialState);
    
  • 상태 설정 함수(setState)를 호출하면 컴포넌트는 상태(state) 값을 업데이트하면서 해당 컴포넌트도 새로 리렌더링 함

사용

  • 업데이트 되는 상태값이 필요 할 때
  • 업데이트 이전의 값을 토대로 업데이트 되는 상태값이 필요 할 때
  • 이전 렌더링에서의 내용을 저장해야 할 때

특징

  • 상태 설정 함수를 통해서 상태를 업데이트 하면 해당 컴포넌트와 자식 컴포넌트 들에게 리렌더링 일어남
  • 초기값(inisialState)은 첫렌더링 이후 상태가 업데이트 되면 무시함
  • 상태 설정 함수를 통해서 업데이트 하지 않는 상태는 렌더링 되어도 이전 상태를 유지함
  • 여러개의 상태를 사용할 수 있고, 배열, 객체 등의 다양한 형태의 값을 넣어줄 수 있음
  • 상태 설정 함수를 통하지 않고 직접 상태를 업데이트 하면 안됨

예제

숫자, 문자 등 업데이트
  import { useState } from 'react';

  const State = () => {
    const [number, setNumber] = useState(0); // 상태와 상태 설정 함수의 이름은 편하게 지어주면 된다.

    return (
      <div>
        <p>
          현재 숫자: <b>{number}</b>
        </p>
        <button onClick={() => setNumber(number + 1)}>+ 1</button> // 버튼을 누르면 +1 해주는 이벤트를 걸었다.
        <button onClick={() => setNumber(number - 1)}>- 1</button> // 버튼을 누르면 -1 해주는 이벤트를 걸었다.
      </div>
    );
  };

  export default State;
  • 결과 화면 화면-기록-2023-05-18-오후-8 28 17
배열 업데이트
  import { useState } from 'react';

  let nextId = 3;
  const initialTodos = [
    { id: 1, title: '블로그 쓰기', done: false },
    { id: 2, title: '요가 하기', done: false },
    { id: 3, title: '도시락 만들기', done: false },
  ];

  const TodoList = () => {
    const [todos, setTodos] = useState(initialTodos);
    const [title, setTitle] = useState('');

    function handleAdd(title) {
      setTodos([
        ...todos,
        {
          id: ++nextId,
          title: title,
          done: false,
        },
      ]);
    }

    function handleChange(nextTodo) {
      setTodos(
        todos.map((t) => {
          if (t.id === nextTodo.id) {
            return nextTodo;
          } else {
            return t;
          }
        }),
      );
    }

    function handleDelete(todoId) {
      setTodos(todos.filter((t) => t.id !== todoId));
    }

    return (
      <div>
        <input placeholder="Add Todo" value={title} onChange={(e) => setTitle(e.target.value)} />
        <button
          onClick={() => {
            setTitle('');
            handleAdd(title);
          }}
        >
          추가
        </button>
        <ul style=>
          {todos.map((todo) => (
            <li key={todo.id} style=>
              <label>
                <input
                  type="checkbox"
                  checked={todo.done}
                  onChange={(e) => {
                    handleChange({
                      ...todo,
                      done: e.target.checked,
                    });
                  }}
                />
                {todo.title}
                <button onClick={() => handleDelete(todo.id)}>Delete</button>
              </label>
            </li>
          ))}
        </ul>
      </div>
    );
  };

  export default TodoList;
  • 결과 화면 state-array
객체 업데이트
  import { useState } from 'react';

  const State = () => {
    const [form, setForm] = useState({ name: 'summer', phoneNumber: '010-', birthDay: '2023.' });

    const handleInput = (e) => {
      setForm({ ...form, [e.target.name]: e.target.value });
    };

    return (
      <div>
        <label>
          name:
          <input type="text" placeholder="name" value={form.name} name="name" onChange={handleInput}></input>
        </label>
        <br />
        <label>
          phone number:
          <input
            type="text"
            placeholder="phoneNumber"
            value={form.phoneNumber}
            name="phoneNumber"
            onChange={handleInput}
          ></input>
        </label>
        <br />
        <label>
          birth day:
          <input type="text" placeholder="birthDay" value={form.birthDay} name="birthDay" onChange={handleInput}></input>
        </label>
        <p>
          {form.name} / {form.phoneNumber} / {form.birthDay}
        </p>
      </div>
    );
  };

  export default State;
  • 결과 화면 ezgif-3-b523f178f7