// Custom Hook
- 이름이 use로 시작하고 내부에서 다른 Hook을 호출하는 함수
- 상태값을 사용하고 있는 Custom Hook이 여러 곳에서 사용될 때, 각 컴포넌트들은 독립적인 상태 snapshot을 갖는다.
> 한 컴포넌트에서 state를 바꿔도 다른 컴포넌트의 state는 바뀌지 않는다.
import { useState } from 'react';
function useCounter(initialValue) {
const [count, setCount] = useState(initialValue);
const increaseCount = () => setCount((count) => count + 1);
const decreaseCount = () => setCount((count) => Math.max(count - 1, 0));
return [count, increaseCount, decreaseCount];
}
export default useCounter;
import { useEffect, useState } from 'react';
import useCounter from './useCounter';
const MAX_CAPACITY = 10;
function Accommodate(props) {
const [isFull, setIsFull] = useState(false);
const [count, increaseCount, decreaseCount] = useCounter(0);
useEffect(() => {
console.log('=====================');
console.log('useEffect() is called');
console.log(`is Full: ${isFull}`);
});
useEffect(() => {
setIsFull(count >= MAX_CAPACITY);
console.log(`Current count value: ${count}`);
}, [count]);
return (
<div style={{ padding: 16, textAlign: 'center' }}>
<p>{`총 ${count}명 수용`}</p>
<button
onClick={increaseCount}
disabled={isFull}
style={{ marginRight: 5 }}
>
입장
</button>
<button onClick={decreaseCount}>퇴장</button>
{isFull && <p style={{ color: 'red' }}>만원</p>}
</div>
);
}
export default Accommodate;
'클라이언트 > React' 카테고리의 다른 글
[리액트(React)] Redux with Class-based Component (0) | 2024.02.15 |
---|---|
[리액트(React)] 리덕스(Redux) (0) | 2024.02.14 |
[리액트(React)] Data Fetching & HTTP Request (0) | 2024.02.08 |
[리액트(React)] Class-based Component (0) | 2024.02.07 |
[리액트(React)] Reducer, useReducer(Hook) (0) | 2024.02.02 |