use
로 시작React에서는 사용자가 만들어서 사용할 수 있는 함수인 custom hook을 만들 수 있다.
Custom hook은 state나 로직 등을 재사용하게 해준다.
앞에 use
를 앞에 붙여 만들 수 있다.
만약 여러개의 component에서 같은 로직을 반복하고 있다면 custom hook을 만들어 사용하면 좋다.
아래 예제 코드를 살펴 보면서 이해해보자.
import { useState } from 'react';
function useCounter(initialCount = 0) {
const [count, setCount] = useState(initialCount);
const increment = () => setCount(count + 1);
const decrement = () => setCount(Math.max(count - 1, 0));
return [count, increment, decrement];
}
export default useCounter;
위 코드를 보면 useCounter
라는 custom hook을 만들어 인자로 initialCount
라는 값을 받아 초기화시킬 수 있게 만들었고,
count
, increment
, decrement
는 반환하면서 다른 component에서 사용할 수 있게 하였다.
이 custom hook을 다른 component에서 어떻게 사용하는지 살펴보자.
import React, {useState, useEffect} from "react";
import useCounter from "./useCounter";
const MAX_CAPACITY = 10;
function Accomodate(props){
const [isFull, setIsFull] = useState(false);
const [count, increment, decrement] = useCounter(0);
useEffect(() => {
console.log("===========");
console.log("useEffect() called")
console.log(`isFull: ${isFull}`);
})
useEffect(() => {
setIsFull(count >= MAX_CAPACITY);
console.log(`Current count value: ${count}`);
}, [count]);
return(
<div style={{padding: 16}}>
<p>
{`촐 ${count}명 수용했습니다.`}
</p>
<button onClick={increment} disabled={isFull}>입장</button>
<button onClick={decrement}>퇴장</button>
{isFull && <p style={{color: "red"}}>정원이 가득 찼습니다.</p>}
</div>
)
}
export default Accomodate;
위 코드에서는 앞서 만든 useCounter
라는 사용해 수용된 인원을 확인하고 업데이트 할 수 있는 component다.
먼저 useState
를 사용했을 때 처럼 0
값을 넣어줘 초기화를 시켜줬는데,
이는 useCounter
에서 인자로 initialCount
라는 값을 받아 초기화 시켜주기 때문에 할 수 있는 것이다.
또, isFull
이라는 boolean
값인 state를 사용해 가득 찼을 경우, count
의 값을 증가 시켜주는 버튼을 비활성화시켜줬다.
만약 다른 component에서 상품의 수를 추가하거나 빼는 기능을 구현하고 싶다면,
우리가 만든 useCount
라는 custom hook을 가져와 사용하면 된다.
이처럼, custom hook을 사용한다면 같은 코드를 굳이 반복적으로 입력하지 않고 가져와 사용할 수 있어
코드의 재사용성과 가독성을 높여준다.