4. useRef & Custom hook
keyword
useRef
Hook์ ๊ท์น
1. useRef
useRef๋ ๋ ๋๋ง์ ํ์ํ์ง ์์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ React Hook์ผ๋ก ๊ฐ(current)์ด ๋ฐ๋์ด๋ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ์ง ์์ผ๋ฉฐ, ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋๊น์ง ๋์ผํ ๊ฐ์ฒด๊ฐ ์ ์ง๋๋ค. ref๋ ์ผ๋ฐ JS๊ฐ์ฒด(์ฐธ์กฐํ ๋ฐ์ดํฐ)์ด๊ธฐ ๋๋ฌธ์ React๋ ์ฌ์ฉ์๊ฐ ์ธ์ ๋ณ๊ฒฝํ๋์ง ์์ง ๋ชปํ๋ค.
์ฃผ์ ์ฉ๋
์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋๊น์ง ๋์ผํ ๊ฐ์ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ
(useEffect ๋ฑ๊ณผ ํจ๊ผ ์ฐ๋ฉด์ ๋ง๋๊ฒ ๋๋) ๋น๋๊ธฐ ์ํฉ์์ ํ์ฌ ๊ฐ์ ์ ๋๋ก ์ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ
1๋ฒ ์์ ์ฝ๋
// ์ธ๋ถ์์ ref ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ
const ref = {
value: 1,
}
function TimerControl() {
ref.value += 1;
}
// useRef๋ฅผ ํธ์ถํด ๊ฐ์ ์ฐธ์กฐํ ๊ฒฝ์ฐ
function TimerControl() {
const ref = useRef(1);
ref.current += 1;
}
TimerControl ์ปดํฌ๋ํธ๋ฅผ 10๋ฒ ์ฌ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ์ ๋, ๊ฐ ์ปดํฌ๋ํธ๋ ๋์ผํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก value์ ๊ฐ์ด +10 ์ฆ๊ฐํ ๊ฒ์ด๋ค. ๋๋ฌธ์ useRef hook์ ํธ์ถํด ๊ฐ์์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ๊ฐ๊ฒ๋๋ค.
2๋ฒ ์์ ์ฝ๋
import { useState, useRef } from 'react';
const query = useRef('');
const [filterText, setFilterText] = useState('');
// filterText๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค query.current์ ๊ฐ์ด ํ ๋น๋จ
useEffect(() => {
query.current = filterText;
}, [filterText]);
useEffect(() => {
setTimeout(() => {
console.log(filterText);
}, 5_000);
}, []);
ํด๋ก์ ๋ก ์ธํ ๋ณ์๋ฅผ ์บก์ฒ, ๋ฐ์ธ๋๋ฅผ ๊น๋นกํ๋ ๋ฌธ์ ๊ฐ ์ผ์ด๋๋ค๋ ๋ง์ ์ฒจ์ธํ์๋ฉด, ํจ์ํ ์ปดํฌ๋ํธ๋ ๊ฒฐ๊ตญ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋๋ฉด ์ง์ญ๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋๋ฐ ์ด ํด๋ก์ ํจํด์ ์ด์ฉํ ์ ํจ์์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋ฌ์์๋ ๋ด๋ถ ํจ์์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณ์์ ์บก์ณ, ๋ฐ์ธ๋๊ฐ ๋ฐ์ํ๋ค. useState๋ ๋ด๋ถ์ ์ผ๋ก ํด๋ก์ ๋ฅผ ์ด์ฉํด ์ปดํฌ๋ํธ๊ฐ ๋ฐํ๋ ํ์๋ ๊ณ์ ์ํ๊ฐ์ ์ฐธ์กฐํ๋ฉฐ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ๊ทธ ์ํ๋ฅผ ๊ฐ์ง๊ณ 1์ฉ ๋ํ๊ฑฐ๋ ํ๋๋ฑ์ ๊ณ์ฐ์ ์ํํ๋ฉฐ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ธ๋ฐ, ์ด๋ฌํ ์๋ฆฌ๋ก ์ธํ์ฌ ํ์ฌ useEffect๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ์ ํ ๋ฒ๋ง ์คํ๋๋ฏ๋ก ์ํ ์ ๋ฐ์ดํธ๋ก ์ธํ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๊ธฐ ์ ๊น์ง ๋น์์ ์ํ๊ฐ์ ์ฐธ์กฐํ์ฌ 5์ด ๋ค์ ๋น ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค.
2. Hook์ ๊ท์น
React Hooks์ ํธ์ถ์ ์ปดํฌ๋ํธ ๋๋ Custom Hook์ ์ต์์ ๋ ๋ฒจ์์ ํธ์ถํด์ผํ๋ค. ์ข ์ข ์กฐ๊ฑด๋ฌธ์ด๋ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ ํธ์ถํ๋ ์ค์๋ฅผ ๋ฒํ๋ค.
์๋ชป๋ ์์ ์ฝ๋
const [playing, setPlaying] = useState(false);
if (playing) {
const products = useFetchProducts();
console.log(products);
}
์ถ๊ฐ ํค์๋
Custom hook
Custom hook
๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ React์ ํ ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ํจ์์ด๋ค. ์ปค์คํ ํ ์ ๋ถ์ ํจ๊ณผ ์์ ์ด๋ ์ํ ๊ด๋ฆฌ ๋ก์ง์ ์บก์ํํ์ฌ ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค. ์ปค์คํ ํ ์ ์ด๋ฆ์
use
๋ก ์์ํด์ผ ํ๋ค.
์์ ์ฝ๋
// ์๋ฒ ์์ฒญ ์ปค์คํ
ํ
function useFetchProducts() {
const [products, setProducts] = useState<Product[]>([]);
useEffect(() => {
const fetchProducts = async () => {
const url = 'http://localhost:3000/products';
const response = await fetch(url);
const data = await response.json();
setProducts(data.products);
};
fetchProducts();
}, []);
return products;
}
๋ด๋ถ์์ API ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋, useEffect๋ฅผ ์ฐ๊ฑฐ๋ ์ปค์คํ ํ ์ ํธ์ถํ๋ ์ปดํฌ๋ํธ๋ ๋ด๋ถ ๋ก์ง์ ๋ํด ๊ด์ฌ์ด ์๊ณ ๊ทธ์ ๋ฐํํ๋ ๊ฐ๋ง ๊ฐ์ ธ๋ค ์ด๋ค.
Last updated