728x90
Custom Hook
Custom Hook์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉด ์ข๋ค๊ณ ํ๋ค.
- ์ฌ์ฌ์ฉ์ฑ: ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ก์ง์ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Custom Hook์ผ๋ก ๋ถ๋ฆฌํ๋ฉด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
- ์ปดํฌ๋ํธ ๊ฐ๋ ์ฑ ํฅ์: ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ง์์ง๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์๋ค. Custom Hook์ผ๋ก ๋ก์ง์ ๋ถ๋ฆฌํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๊น๋ํ๊ณ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค.
- ๋จ์ผ ์ฑ ์ ์์น: ์ปดํฌ๋ํธ๊ฐ ํ๊ฐ์ง ์ฑ ์๋ง ๊ฐ์ง๋๋ก ํ๊ธฐ ์ํด Custom Hook์ ์ฌ์ฉํด ๋ก์ง์ ๋ถ๋ฆฌํ๋ฉด ์ข๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์ปดํฌ๋ํธ๊ฐ ๋ช ํํ ์ญํ ์ ๊ฐ์ง๊ฒ ๋์ด ์ฝ๋์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
- ์ํ ๊ด๋ฆฌ์ ๋ถ์ ํจ๊ณผ ์ฒ๋ฆฌ: ๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ ๋ถ์ ํจ๊ณผ(side effects)๋ฅผ ์ฒ๋ฆฌํ ๋, Custom Hook์ ์ฌ์ฉํ๋ฉด ์ด ๋ก์ง์ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค.
- ๊ณตํต ํจํด ๋ถ๋ฆฌ: ํน์ ํ ํจํด(์: ๋ฐ์ดํฐ ํ์นญ, ํผ ํธ๋ค๋ง ๋ฑ)์ด ๋ฐ๋ณต๋๋ ๊ฒฝ์ฐ, Custom Hook์ผ๋ก ๋ถ๋ฆฌํ๋ฉด ์ด๋ฌํ ํจํด์ ํ ๊ณณ์ ๋ชจ์ ๊ด๋ฆฌํ ์ ์๋ค.
Custom Hook with axios
ํน์ ํ ํจํด(์: ๋ฐ์ดํฐ ํ์นญ, ํผ ํธ๋ค๋ง)์ด ๋ฐ๋ณต๋๋ ๊ฒฝ์ฐ Custom Hook์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ๋ ํ๋ค๊ณ ํ์ผ๋, axios๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ Custom Hook์ผ๋ก ๋ถ๋ฆฌํด๋ณด์.
1. axios ์ค์น
npm install axios
2. useAxios Custom Hook
import { useState, useEffect } from "react";
import axios from "axios";
function useAxios(url, params = {}) {
const [loading, setLoading] = useState(true);
const [data, setData] = useState([]);
const [error, setError] = useState(null);
useEffect(() => {
setLoading(true);
axios
.get(url, { params })
.then((res) => {
setData(res.data.collection.items);
})
.catch((err) => {
setError(err);
})
.finally(() => {
setLoading(false);
});
}, [url, params]);
return { loading, data, error };
}
export default useAxios;
3. using useAxios
GET ์์ฒญ
import PropTypes from "prop-types";
import useAxios from "../hook/useAxios";
import { useMemo } from "react";
GetData.propTypes = {
query: PropTypes.string.isRequired,
};
function GetData({ query }) {
const memoizedQuery = useMemo(() => ({ q: query }), [query]);
const { loading, data, error } = useAxios("https://images-api.nasa.gov/search", memoizedQuery);
if (loading) return <div><p>Loading...</p></div>;
if (error) return <div><p>Error: {error.message}</p></div>;
return (
<div>
<h1>NASA Astronomy Picture of the Day</h1>
{data.map((item, index) => (
<div key={index}>
<h2>{item.data[0]?.title}</h2>
<p>{item.data[0]?.date_created}</p>
<img src={item.links ? item.links[0]?.href : ""} alt={item.data[0]?.title} />
<p>{item.data[0]?.description}</p>
</div>
))}
</div>
);
}
export default GetData;
⇒ useEffect์ ์์กด์ฑ ๋ฐฐ์ด์ ๋ฃ๋ ๊ฒ์ด ์๋๋ผ refetch๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑํ ์ ์๋ค.
import { useState, useCallback } from "react";
import axios from "axios";
function useAxios(url, params = {}) {
const [loading, setLoading] = useState(true);
const [data, setData] = useState([]);
const [error, setError] = useState(null);
const fetchData = useCallback(() => {
setLoading(true);
axios
.get(url, { params })
.then((res) => {
setData(res.data.collection.items);
})
.catch((err) => {
setError(err);
})
.finally(() => {
setLoading(false);
});
}, [url, params]);
return { loading, data, error, refetch: fetchData };
}
export default useAxios;
์์ง^^.. ์ ๋ชจ๋ฅด๊ฒ ๋ค…
์ฐธ๊ณ
728x90
'๐ป์น(Web) > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TypeScript]TypeScript์ ๊ฐ์ ๋ฐ ๊ธฐ์ด (3) | 2024.09.03 |
---|---|
ํ๋ก ํธ์๋ ์ฝ๋ฉ์ปจ๋ฒค์ (0) | 2024.07.13 |
[React]Vite, Redux (0) | 2024.06.27 |
[React]์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ฑ/์ผ๊ด์ฑ (0) | 2024.06.25 |
[React]AWS EC2๋ก React ๋ฐฐํฌํ๊ธฐ, ๋๋ฉ์ธ ์ฐ๊ฒฐ (0) | 2023.09.07 |