[React] 컴포넌트(Component)와 훅(Hook)

rsuubinn·2023년 3월 22일
0

React

목록 보기
4/7

컴포넌트(Component)

클래스형 컴포넌트(Class Component)

// 카운팅 하는 <Counter />
class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: 0
    }
    this.handleIncrease = this.handleIncrease.bind(this);
  }
  
  handleIncrease = () => {
    this.setState({
      counter: this.state.counter + 1
    })
  }
  
  render() {
    return (
      <div>
      	<p>You clicked {this.state.counter} times</p>
		<button onClick={this.handleIncrease}>
          Click me
        </button>
	  </div>
	  )
   }
}

클래스 컴포넌트는 복잡해질수록 이해하기 어려워졌고, 컴포넌트 사이에서 상태 로직을 재사용하기 어렵다는 단점이 있다.
또한 React의 클래스 컴포넌트를 사용하기 위해서는 JavaScript의 this 키워드가 어떤 방식으로 동작하는지 알아야 하는데. 이는 문법을 정확히 알지 못하면 동작 방식 자체를 정확히 이해하기 어렵게 만들었다.

함수형 컴포넌트(Function Component)

클래스형 컴포넌트의 단점을 보완하기 위해 만들어진 것이 함수형 컴포넌트 이다.

function Counter () {
  const [counter, setCounter] = useState(0);
  
  const handleIncrease = () => {
    setCounter(counter + 1);
  }
  
  return (
    <div>
    	<p>You clicked {counter} times</p>
		<button onClick={handleIncrease}>
          Click me
        </button>
    </div>
  )
}

함수형 컴포넌트는 클래스형 컴포넌트에 비해 훨씬 더 직관적이고 보기 쉽다는 장점이 있다.
위 예시에서 숫자를 올리기 위해 상태값을 저장하고 사용할 수 있게 해주는 useState()가 있는데 이 메서드가 바로 훅(Hook) 이다.

훅(Hook)이란?

훅(Hook)은 클래스(class)를 작성하지 않고도 state와 다른 React의 기능들을 사용할 수 있게 해준다.

Hook은 다르게 말하면 함수형 컴포넌트에서 상태 값 및 다른 여러 기능을 사용하기 편리하게 해주는 메소드를 의미한다.
Hook은 class가 아닌 function으로만 React를 사용할 수 있게 해주는 것이기 때문에 클래스형 컴포넌트에서는 동작하지 않는다.

Hook 사용 규칙

1. 리액트 함수의 최상위에서만 호출해야 한다.

반복문, 조건문, 중첩된 함수 내에서 Hook을 실행하면 예상한 대로 동작하지 않을 우려가 있다.

...
if(counter) {
  const [sample, setSample] = useState(0);
}
...

예를 들어 count가 있을 때 sample 이라는 state를 사용하고 싶어서 조건문 안에 useState() hook을 불러왔다고 가정해보자.
이런 식으로 호출을 하게 되면 React의 동작 방식에 거스르기 때문에 React는 에러를 출력한다.
컴포넌트 안에는 useState나 useEffect 같은 hook들이 여러 번 사용될 수 있는데, React는 이 hook을 호출되는 순서대로 저장을 해놓는다.
하지만 조건문, 반복문 안에서 hook을 호출하게 되면 호출되는 순서대로 저장을 하기 어려워지고, 결국 예기치 못한 버그를 초래하게 될 수 있다.

2. 오직 리액트 함수 내에서만 사용돼야 한다.

리액트 함수형 컴포넌트나 커스텀 hook이 아닌 다른 일반 JavaScript 함수 안에서 호출해서는 안된다.

...
window.onload = function () {
  useEffect(() => {
    // do something...
  }, [counter]);
}
...

예를 들어 window의 요소가 모두 준비되면 useEffect() 가 호출되었으면 좋겠다고 생각하여 함수를 작성했다고 가정해보자.
이 또한 React의 동작 방식에 위배되기 때문에 React는 에러를 출력한다.
애초에 Hook은 React의 함수 컴포넌트 내에서 사용되도록 만들어진 메소드이기 때문에 근본적으로 일반 JavaScript 함수 내에서는 정상적으로 돌아가지 않는다.
따라서 이 규칙 또한 반드시 준수해야 한다.

profile
@rsuubinn

0개의 댓글