REACT

[React] HOOK 맛보기 (State hook, Effect hook)

ksh21 2022. 2. 15. 17:39

react hook은 기존 Class 코드를 작성할 필요 없이 함수 컴포넌트에서 state와 life cycle method를 이용할 수 있도록 도와줍니다. 굳이 기존의 Class 컴포넌트들을 함수형으로 다 바꿀 필요는 없지만 코드의 유지보수성과 가독성을 위해서 상황에 따라 Hooks를 사용하는 게 더 좋을때도 있다고 하니 배워보려 합니다!!

 

오늘은 useState와 useEffect에 대해서 알아보도록 하겠습니다.

 

 

1. useState

-함수형 컴포넌트에서 상태를 관리해야 할 때 사용

-실제의 state 값과 업데이트 할 수 있는 함수 두 개를 리턴

 (아래 예시에서는 count와 setCount 두 가지 호출)

 

※ hooks에서는 this 사용하지 않음

 

 

2. useEffect

-리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 수행하도록 설정 할 수 있는 Hook

-클래스형 컴포넌트의 componentDidMount 와 componentDidUpdate 를 합친 형태로 보면 됨

 

  2.1 마운트 될 때만 실행하고 싶을 때

  만약 useEffect 에서 설정한 함수가 컴포넌트가 화면에 가장 처음 렌더링 될 때만 실행되고 업데이트 할 경우에는 실행    할 필요가 없는 경우엔 함수의 두번째 파라미터로 비어있는 배열을 넣어주시면 됩니다.
  

  2.2 특정 값이 업데이트 될 때만 실행하고 싶을 때

  useEffect 를 사용 할 때 특정 값이 변경이 될 때만 호출하게 하고 싶을 경우에는 두 번째 파라미터로 특정 값을 넣어      줍니다. 아래 예시에서는 count가 업데이트 될때마다 함수를 호출하도록 설정했습니다.

 

 

 

아래 예시는 기존 코드를 hooks를 활용해 바꿔본 것입니다.

//기존 코드

import React, { Component } from "react";

class SimpleHabit extends Component {
  state = {
    count: 0,
  };

  handleIncrement = () => {
    this.setState({ count: this.state.count + 1 });
  };
  render() {
    return (
      <li className="habit">
        <span className="habit-name">Reading</span>
        <span className="habit-count">{this.state.count}</span>
        <button
          className="habit-button habit-increase"
          onClick={this.handleIncrement}
        >
          <i className="fas fa-plus-square"></i>
        </button>
      </li>
    );
  }
}

 

//react hooks로 변경한 코드 

import React, {  useState, useRef, useCallback, useEffect  } from "react";

const SimpleHabit = (props) => {
  const [count, setCount] = useState(0);
  const spanRef = useRef();

  const handleIncrement = useCallback(() => {
    setCount(count + 1);
  });

  useEffect(() => {
    console.log("mounted & updated: ${count}");
  }, [count]); //count가 업데이트 될때마다 이 함수 호출
  return (
    <li className="habit">
      <span ref={spanRef} className="habit-name">
        Reading
      </span>
      <span className="habit-count">{count}</span>
      <button className="habit-button habit-increase" onClick={handleIncrement}>
        <i className="fas fa-plus-square"></i>
      </button>
    </li>
  );
};
export default SimpleHabit;