Hooks - useState

2021. 9. 29. 15:41React/문법

반응형

리액트 16.8 이전 버전에서는 함수형 컴포넌트에서는 상태를 관리할 수 없었는데요, 리액트 16.8 에서 Hooks 라는 기능이 도입되면서 함수형 컴포넌트에서도 상태를 관리할 수 있게 되었습니다. 이번에는 useState 라는 함수를 사용해보게 되는데, 이게 바로 리액트의 Hooks 중 하나입니다.

function Counter() {
  const [number, setNumber] = useState(0);

  const onIncrease = () => {
    setNumber(number + 1);
  }

  const onDecrease = () => {
    setNumber(number - 1);
  }

  return (
    <div>
      <h1>{number}</h1>
      <button onClick={onIncrease}>+1</button>
      <button onClick={onDecrease}>-1</button>
    </div>
  );
}

// 함수를 만들고, button 의 onClick 으로 각 함수를 연결해주었습니다. 
// 리액트에서 엘리먼트에 이벤트를 설정해줄때에는 on이벤트이름={실행하고싶은함수} 형태로 설정
// 여기서 주의하셔야 하는 점은, 함수형태를 넣어주어야 하지, 함수를 다음과 같이 실행하시면 안됩니다.
// onClick={onIncrease()}

- input 엘리먼트 다루기

변경되는 값은 useState로 관리

이벤트에 등록하는 함수에서는 이벤트 객체 e 를 파라미터로 받아와서 사용 할 수 있음
e.target 은 이벤트가 발생한 DOM 인 input DOM을 가리킴
e.target.value 를 조회하면 현재 input 에 입력한 값을 알 수 있음

input 의 상태를 관리할 때에는 input 태그의 value 값도 설정

- 여러개의 input 엘리먼트 다루기

function InputSample() {
  const [inputs, setInputs] = useState({
    name: '',
    nickname: ''
  });

  const { name, nickname } = inputs; // 비구조화 할당을 통해 값 추출

  const onChange = (e) => {
    const { value, name } = e.target; // 우선 e.target 에서 name 과 value 를 추출
    setInputs({
      ...inputs, // 기존의 input 객체를 복사한 뒤
      [name]: value // name 키를 가진 값을 value 로 설정
    });
  };
  
  // 여기서 사용한 ... 문법은 spread 문법입니다. 객체의 내용을 모두 "펼쳐서" 기존 객체를 복사 
  // 이러한 작업을, "불변성을 지킨다" 라고 부릅니다. 
  // 불변성을 지켜주어야만 리액트 컴포넌트에서 상태가 업데이트가 됐음을 감지 할 수 있고 
  // 이에 따라 필요한 리렌더링이 진행됩니다. 
  // 만약에 inputs[name] = value 이런식으로 기존 상태를 직접 수정하게 되면, 
  // 값을 바꿔도 리렌더링이 되지 않습니다.
  // 즉, 지금은 이것만 기억하세요. 리액트에서 객체를 업데이트하게 될 때에는 기존 객체를 직접 수정하면 안되고, 
  // 새로운 객체를 만들어서, 새 객체에 변화를 주어야 됩니다.

  const onReset = () => {
    setInputs({
      name: '',
      nickname: '',
    })
  };


  return (
    <div>
      <input name="name" placeholder="이름" onChange={onChange} value={name} />
      <input name="nickname" placeholder="닉네임" onChange={onChange} value={nickname}/>
      <button onClick={onReset}>초기화</button>
      <div>
        <b>값: </b>
        {name} ({nickname})
      </div>
    </div>
  );
}
반응형

'React > 문법' 카테고리의 다른 글

배열 렌더링  (0) 2021.09.29
Hooks - useRef  (0) 2021.09.29
JSX 기본 문법  (0) 2021.09.29
TypeScript  (0) 2021.09.27
Styled Component  (0) 2021.09.27