๐ช ์ฌ์ฉ์ ์ง์ React ํํฌ ๋ง๋ค๊ธฐ
8738 ๋จ์ด webdevreactjavascript
๋น์ ์ React hooks์ ๋ํด ๋ค์๊ณ ๊ทธ๊ฒ์ ๋ํด ์ดํดํ๊ธฐ ์์ํ๊ณ ์ฃผ์ ๊ฒ๋ค์ด ๋ฌด์์ ํ๋์ง ์ดํดํ๊ณ ๋น์ ์ ์ปดํฌ๋ํธ์์ ๊ทธ๊ฒ๋ค์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ๊ธฐ ์ํด ๋ ๋ฒจ์ ์ฌ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ง์ ํํฌ ์์ฑ์ ์์ํ ๋์ ๋๋ค.
๊ณ ์ ํ ํํฌ๋ฅผ ๊ตฌ์ถํ ๋์ ์ฃผ์ ์ด์ ์ ๋ ผ๋ฆฌ๋ฅผ ์บก์ํํ๊ณ ์์ฉ ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ์ฌ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์น์์ ์ฝ๋๋ฅผ ๋ฐ๋ณตํ์ง ์๋๋ก ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์์ ๊ณผ ํ๋ก์ ํธ๋ผ๋ ๋ ๊ฐ์ง ํญ๋ชฉ ์ธํธ๋ฅผ ์ฌ์ฉ์์๊ฒ ํ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ด ์๋ค. ์ด๋ฅผ ์ํด 2๊ฐ์ ์๋ก ๋ค๋ฅธ API ๋์ ์ ํธ์ถํ๋ 2๊ฐ์ ๊ฐ๋ณ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. ์์ฒญ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ ๋ค์ ๋ํ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ฏ๋ก ๊ฐ ์ฌ๋ก์ ๋ํด ์๋ํ๋ ์๋ฃจ์ ์ ์ฝ๋ฉํด ๋ณด๊ฒ ์ต๋๋ค.
ํํฌ ๋ง๋ค๊ธฐ
React์์ ํํฌ์ ํ์ค ๊ดํ์ ์ด๋ฆ์ด
use
๋ก ์์ํ๋ฏ๋ก ํํฌ๋ฅผ useItemsLoader
๋ผ๊ณ ํฉ๋๋ค.const useItemsLoader = () => {};
์ํ, ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ์
๋ค๋ฅธ ๋์ ์ ๋ํด ํํฌ๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ๋ง๋ค๊ณ ์ถ์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
ํํฌ๋ ๋ฐ์ดํฐ(ํญ๋ชฉ ํฌํจ) ๋ฐ ์์ฒญ ์ํ(
LOADING
, DONE
๋ฐ ERROR
) ์ ์ฅ์ ๋ด๋นํฉ๋๋ค. ๋ฐ์ดํฐ์ ๋ชจ์์ด ์ถฉ๋ถํ ๋จ์ํ๊ธฐ ๋๋ฌธ์(๋จ์ง ๋ช ๊ฐ์ ํ๋) ๋จ์ผ ๋ณ์์ ์ ์ฅํ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ํด useState
ํํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.๋ง์ง๋ง์ผ๋ก ํํฌ์ ํธ์ถ์ ๊ตฌ์ฑ ์์๊ฐ ์ ๋๋ก ๋ ๋๋ง๋ ์ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
const useItemsLoader = (endpoint) => {
const [data, setData] = useState({ items: null, state: 'LOADING' });
return data;
};
๋ฐ์ดํฐ ์์ฒญ
์์ฒญ์ ํธ๋ฆฌ๊ฑฐํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฏ๋ก
useEffect
ํํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํํฌ๋ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ดํธ๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.๋ํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ํ๋ฅผ ์ค์ ํ์ฌ ์์ฒญ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
useEffect(() => {
fetchItems(endpoint)
.then( items => setData({ items, state: 'DONE' }))
.catch( () => setData({ items: null, state: 'ERROR' });
}, [endpoint]);
๋ชจ๋ ๊ฒ์ ํ๋๋ก ๋ชจ์ผ๊ธฐ
์ด๊ฒ์ ํํฌ์ ์ต์ข ๊ฒฐ๊ณผ์ ๋๋ค.
const useItemsLoader = (endpointPath) => {
const [data, setData] = useState({ items: null, state: 'LOADING' });
useEffect(() => {
fetchItems(endpoint)
.then( items => setData({ items, state: 'DONE' }))
.catch( () => setData({ items: null, state: 'ERROR' });
}, [endpoint]);
return data;
};
๋ค์์ out ๊ตฌ์ฑ ์์์์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
const Tasks = () => {
const tasksData = useItemsLoader('path/to/tasks');
if (tasksData.state === 'LOADING') return <div>Loading data...</div>;
if (tasksData.state === 'ERROR') return <div>Something went wrong</div>;
return (
<div>
<h1>Tasks</h1>
{tasksData.items.map((task) => (
<Task task={task} />
))}
</div>
);
};
Projects
๋ฅผ ์ฌ์ฌ์ฉํ์ง๋ง ๋ค๋ฅธ ๋์ ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ useItemsLoader
๊ตฌ์ฑ ์์์ ๋ํด ๋์ผํ ์์
์ ์ํํ ์ ์์ต๋๋ค.์ฌ์ฉ์ ์ง์ ํํฌ๋ ๋ ๋ณต์กํ ์๋ฃจ์ ์ ๊ฒฝ์ฐ์๋ ์ข์ ์๋ฃจ์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํค๋ ๊ตฌ์ฑ ์์์์ ๋ ผ๋ฆฌ๋ฅผ ํฌํจํ๊ณ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ์์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ํ ๊ณณ์์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ช ์ฌ์ฉ์ ์ง์ React ํํฌ ๋ง๋ค๊ธฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/marcostl/creating-a-custom-react-hook-5eacํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค