Hook 탄생 배경

기존 Class Components의 단점을 보완하기 위해 React팀에서 개발했다.

(Components 재사용이 어려움, 복잡한 Component 이해가 어려움, JavaScript의 this의 문제점)

Hook의 사용 규칙

최상위에서만 Hook을 호출해야 한다. 반복문, 조건문, 중첩된 함수 내에서 사용 금지

Functional Components 와 Custom Hook에서만 사용 가능

useState

 1:  import React, { useState } from 'react'; 2:
 3:  function Example() {
 4:    const [count, setCount] = useState(0); 5:
 6:    return (
 7:      <div>
 8:        <p>You clicked {count} times</p>
 9:        <button onClick={() => setCount(count + 1)}>10:         Click me
11:        </button>
12:      </div>13:    );
14:  }

useEffect

useEffect = componentDidMount + componentDidUpdate + componentWillUnmount

<Class Components>

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  componentDidMount() {    document.title = `You clicked ${this.state.count} times`;  }  componentDidUpdate() {    document.title = `You clicked ${this.state.count} times`;  }
  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}

<Hook>

import React, { useState, useEffect } from 'react';
function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {    document.title = `You clicked ${count} times`;  });
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

clean-up

componentWillUnmount에서 따로 적용했던 구독해지를 useEffect내부에서 적용할 수 있다.

  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });