5. usehooks-ts
keyword
usehooks-ts
useBoolean
useEffectOnce
useFetch
useInterval
useEventListener
useLocalStorage
useDarkMode
swr
react-query
usehooks-ts
Custom Hook์ ๋ชจ์๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ ๋ง๋ค์ด ๋์ Custom Hook์ ํตํด ์์ด๋์ด๋ฅผ ์ป์ด๊ฐ์.
useBoolean
์ฐธ๊ณผ ๊ฑฐ์ง์ ํ๋ณํ๋ Hook, toggle๊ณผ ๊ฐ์ด ์๋๊ฐ ๋ช ํํ ํจ์๋ฅผ ์ฌ์ฉํ์.
import { useBoolean } from 'usehooks-ts';
const { value : playing, toggle } = useBoolean();
const handleClick = () => toggle();
useEffectOnce
๋น์ด์๋ ์์กด์ฑ ๋ฐฐ์ด์ ๋ฃ์ด ์ปดํฌ๋ํธ ๋ง์ดํธ ์ ๋ฑ ํ ๋ฒ๋ง ์คํํ๋ effect, once์ ๋ถ์ฌ ํ ๋ฒ๋ง ์คํ๋จ์ ๋ช ์์ ์ผ๋ก ์ ์ ์๋ค.
import { useEffectOnce } from 'usehooks-ts';
useEffectOnce(() => {
const fetchProducts = async () => {
const url = 'http://localhost:3000/products';
const response = await fetch(url);
const data = await response.json();
setProducts(data.products);
};
fetchProducts();
});
useFetch
์๋ฒ API์ ์์ฒญ์ ๋ณด๋ด๋ Hook, ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ๋ ์ ์ฉํ๋ค.
import { useFetch } from 'usehooks-ts';
const url = 'http://localhost:3000/products';
const { data = {products: []} } = useFetch(url);
useInterval
setInterval์ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ setInterval์ ์ฝ๋ฐฑํจ์๋ ํด๋ก์ ๋ก์ ์ธ๋ถ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค. ๋๋ฌธ์ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋์์ด๋, ํจ์๊ฐ ์ ์๋ ๋น์์ ๊ฐ์ ๊ธฐ์ตํ๊ณ ์์ด ๋์ผํ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ค.
function IntervalComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
// setCount(count + 1); => X
setCount(prevCount => prevCount + 1);
}, 1000);
return () => {
clearInterval(interval);
};
}, []);
return <div>...</div>;
}
setInterval์ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ useInterval์ ์ฌ์ฉํ๊ณ , ์ง์ ๊ตฌํ ํด์ผํ๋ค๋ฉด custom hook์ ๋ง๋ค์ด ํด๊ฒฐํด์ผํ๋ค.
useInterval ์ฝ๋
import { useEffect, useLayoutEffect } from 'react'
export const useIsomorphicLayoutEffect =
typeof window !== 'undefined' ? useLayoutEffect : useEffect
๋ด๋ถ ๋ก์ง์ useIsomorphicLayoutEffect Hook์ ์ฌ์ฉํ๊ณ ์๋๋ฐ ์คํ ํ๊ฒฝ์ด ๋ธ๋ผ์ฐ์ ๋ฉด DOM ๋ ๋๋ง ์ ์ ์คํ๋๋ useLayoutEffect ํ ์ ์ฌ์ฉํ๊ณ ์๋๋ผ๋ฉด useEffect๋ฅผ ์ฌ์ฉํ๋ค.
useEventListener
window ๊ฐ์ฒด์ ์ ๊ทผํ๋ ํ์๋ ์ธ๋ถ ์์คํ ๊ณผ ์ฑํฌํ๋ ๋ถ์ ํจ๊ณผ์ด๋ฏ๋ก useEffect ๋ด๋ถ์์ ์กฐ์ํ๋๋ฐ useEventListener์ ์ฅ์ ์ useEffect๋ฅผ ์๋ตํ๊ณ ๋ธ๋ผ์ฐ์ ์คํฌ๋กค, ๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ์ ๊ฐ์ด window ๊ฐ์ฒด์ ์ ๊ทผํด ๋ธ๋ผ์ฐ์ ์์ฒด UI๋ฅผ ์กฐ์ํ ๋ ์ ์ฉํ ๊ฒ ๊ฐ๋ค. ํน์ํ๊ฒ ์ธ๋ถ์ ๋ฌผ๋ ค์๋ ์ฝ๋๊ฐ ๋ง์ ๊ฒฝ์ฐ ํด๋น ํ ์ ์ฐ๋ฉด ์ ์ฉํ๋ค๊ณ ํ๋ค.
useLocalStorage
์น ์คํ ๋ฆฌ์ง, localStorage๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ์์ํ(์ธ๋ถ์ ๋ฐ์ดํฐ ์ ์ฅ์ด ์ง์๋๋) ํค๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํ์ ์ ๋ฉฐ์น ๊ฐ ์๋ณด๊ธฐ, ํ ๋ง ์์ ๋ณ๊ฒฝํ๊ธฐ ๋ฑ์ด ๊ฐ๋ฅ
useDarkMode
useDarkMode ๋ด๋ถ์ ์ผ๋ก useLocalStorage ํ ์ ์ฌ์ฉํ๊ณ ์์(๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ ํ ์ฌ์คํ ๋์ ๋ ํ ๋ง๋ ์ง์๋์ด์ผ ํจ)
์ข์ ๊ธฐ๋ฅ๋ค์ด ๋ง์ด ์๋ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ์ธ์ ์ผ๋ก๋ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ง ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ฌด ์์กดํ๊ฒ ๋๋ ์ง์ ๊ตฌํ์ด ๊ฐ๋ฅํ ๋ถ๋ถ์ ์ต๋ํ ๊ตฌํํ ์ ์๋๋ก ํ๋ค.
swr
react-query
React Query๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ cachingํ์ฌ ํ์ํ ๋ ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ฑํ์ฌ ๋์ผํ ๋ฐ์ดํฐ์ ๋ํ ๋ฐ๋ณต์ ์ธ ์์ฒญ์ ์บ์์์ ์ ๊ณตํจ (๋คํธ์ํฌ ๋น์ฉ ์ ์ฝ)
๋ฐ์ดํฐ ์์ฒญ ์คํจ์ ์๋ ์ฌ์๋
์์ ์ฝ๋
import { useQuery } from '@tanstack/react-query';
function Products() {
const { isLoading, error, data: products } = useQuery(['queryKey'], async () => {
return fetch('request url').then((res) => res.json());
})
if (isLoading) return <p>Loading...</p>;
if (error) return <p>{error}</p>;
}
์ฒซ๋ฒ์งธ ์ปดํฌ๋ํธ๊ฐ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ queryKey์ ์ด๋ฆ ์๋์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ ์ปดํฌ๋ํธ๊ฐ ๋๊ฐ์ queryKey๋ก ๋คํธ์ํฌ ํต์ ์๋ ์, ๋์ผํ ๋ฐ์ดํฐ์ ๋ํ ๋ฐ๋ณต์ ์ธ ์์ฒญ์ด๋ฏ๋ก ํด๋น ๋ฐ์ดํฐ๋ฅผ ์บ์์์ ์ ๊ณตํ์ฌ ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ์ค์ธ๋ค. ์ฆ, A๋ผ๋ key๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์์ฒญ์ ๋ํด์ ๋์ผํ ์บ์๋ฅผ ์ฌ์ฉํ๋ค.
Last updated