React Function Component, Hook

멋쟁이 개발자
5 min readFeb 6, 2021

--

React Document의 내용을 요약해서 포스팅했습니다. 자세한 내용은 공식 문서를 참고해주세요.

Function Component

함수형 컴포넌트로, ES6의 화살표 함수를 사용해서 만드는 것도 가능합니다.

형식은 아래와 같습니다.

// props 객체 인자를 받은 후 React 엘리먼트를 반환하는 컴포넌트function Welcome(props){
return <h1>Hello, {props.name}</h1>
}

클래스형 vs 함수형

클래스형 컴포넌트

  1. State, LifeCycle 관련 기능 사용이 가능
  2. 메모리 자원을 함수형 컴포넌트보다 조금 더 사용
  3. 임의 메서드 정의 가능

함수형 컴포넌트

  1. State, LifeCycle 관련 기능 사용 불가능 👉 Hook을 통해 해결
  2. 메모리 자원을 클래스형 컴포넌트보다 덜 사용
  3. 컴포넌트 선언이 편리

React에서는 클래스 컴포넌트를 없앨 계획은 없지만, 함수형 컴포넌트 사용을 지향하고, 점진적으로 적용하기를 권합니다.

Hook

Hook은 React 16.8.0부터 지원하며, 함수형 컴포넌트의 가장 큰 특징들 중에 하나입니다.

개발 이유

Hook이 개발된 이유는 클래스 컴포넌트의 단점과 연결해서 이야기 할 수 있습니다.

  1. 컴포넌트 사이에서 상태와 관련된 로직을 재사용하기 어려움
  2. 복잡한 컴포넌트들의 이해가 어려움
  3. Class는 사람과 기계를 혼동시킴

개발 이유에 따른 Hook의 장점

  1. 계층 변화 없이 상태 관련 로직을 재사용할 수 있도록 도와줌
  2. 로직에 기반을 둔 작은 함수로 컴포넌트를 나눌 수 있음 (ex. 구독 설정 및 데이터를 불러오는 것과 같은 로직)
  3. Class없이 React 기능들을 사용하는 방법을 알려줌

State Hook

useState : 클래스형 컴포넌트를 작성하지 않아도 state와 같은 특징들을 사용할 수 있습니다.

// 선언법
const [count, setCount] = useState(0); //초기값 설정
// 가져오기
<p>You clicked {count} times</p>
// 갱신하기
<button onClick={() => setCount(count+1)}>

useState의 갱신은 클래스형 컴포넌트의 this.setState와 달리 state를 병합하는 것이 아니라 대체하는 것입니다.

Effect Hook

useEffect : 클래스형 컴포넌트 LifeCycle에서 componentDidMount, componentDidUpdate, componentWillUnmount가 합쳐진 것이라고 생각해도 됩니다. effect를 통해 state나 prop에 접근하고, 렌더링 및 모든 업데이트에서 수행하여 최적화 시킬 수 있습니다.

// 선언법
useEffect(() => {});

정리(clean-up)

: effect는 정리를 위한 함수를 반환합니다. effect는 렌더링이 실행될 때마다 실행되므로, 이전의 파생된 effect에 대한 정리가 필요합니다.

따라서 리액트는 컴포넌트 마운트가 해제될 때 정리(clean-up)을 실행합니다.

Hook의 규칙

  • 최상위(at the Top Level)에서만 Hook을 호출
    : 컴포넌트가 렌더링 될 때마다 항상 동일한 순서로 Hook이 호출되는 것을 보장하기 위해 반복문, 조건문 혹은 중첩된 함수 내에서 Hook을 호출하면 안됩니다. 조건문을 사용하길 원한다면 조건문을 Hook내부에 작성해야 합니다.
// 올바른 조건문 사용useEffect(function persistForm(){
if(name !== ""){
localStorage.setItem.('formData',name);
}
});
// 올바르지 않은 조건문 사용if(name !== ""){
useEffect(function persistForm(){
localStorage.setItem('formData',name);
});
}
  • React 함수 내에서 Hook을 호출
    : 컴포넌트의 모든 상태 관련 로직을 소스코드에서 명확하게 보이도록 하기 위해서 Javascript 함수에서 호출하면 안됩니다.

Custom Hook

: 사용자 정의 Hook은 이름이 use로 시작하는 자바스크립트 함수로, 사용자 정의 Hook은 다른 Hook을 호출할 수 있습니다.

  1. React의 특별한 기능이라기 보다 기본적으로 Hook의 디자인을 따르는 관습입니다.
  2. 꼭 ‘use’로 시작하는 이름을 가져야 합니다.
  3. Hook은 상태 관련 로직을 재사용하는 매커니즘이지만, 사용자 Hook을 사용할 때마다 그 안의 state와 effect는 완전히 독립적이기 때문에, 같은 Hook을 사용하는 컴포넌트라고 하더라도 state를 공유하지 않습니다.
  4. 각각의 Hook에 대한 호출은 서로 독립된 state를 받습니다. 사용자 정의 Hook을 직접적으로 호출하기 때문에 useState와 useEffect를 호출한 것과 다름 없습니다. 하나의 컴포넌트 안에서 useState와 useEffect를 여러번 부를 수 있고, 이들은 모두 완전히 독립적입니다.

--

--