[TIL] React Hook useEffect has a missing dependency
๐ ๋ฆฌ์กํธ ์ค๋ฅ โReact Hook useEffect has a missing dependencyโ
๋
ธ๋ง๋์ฝ๋ #7.6 Parameters ๊น์ง ๊ฐ์๋ฅผ ๋ค์๋ค.
๋ง์ง๋ง์ ๋๊ผฌ์ค์ด ํด๋ณด๋ผ๋๊ฑฐ ํ๋๋ฐ ์ .. ? ์ ๋๋ ์๋์งโฆ?useState
์ฌ์ฉํด์ ๋ฐฐ์ด ํ ๋นํ๋ ์์
์ด์๋๋ฐ,,
๊ทธ๋ฅ ์ฝ์์ฐฝ์ ์ฐ์ผ๋ฉด ๋ฐฐ์ด์ด ๋์ค๋๋ฐ setStateํด์ฃผ๋ฉด ๋ฐฐ์ด์ด state์ ์๋ค์ด๊ฐ๋๊ฑฐ๋ค.
ํด๋น ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
const [details, setDetails] = useState([]);
const { id } = useParams();
const getMovie = async () => {
const json = await (
await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
).json();
console.log(json.data.movie);
setDetails(json.data.movie);
console.log(details);
};
useEffect(() => {
getMovie();
}, []);
๊ทธ๋ฆฌ๊ณ ์ฝ์์์ ํ์ธํ๋ฉด ์๋์ฒ๋ผ ๋์จ๋ค.
๋์ฒด ์ ์ผ๊น?
๋์ฒด ์ ๋ด๊ป ์๋ค์ด๊ฐ๊น?
๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๋ป๊ฒ ๋ฃ์์๊น?
๊ฐ์ ๋๊ธ๋ค๋ ํ์ธํด๋ดค์ง๋ง ์ ์ ์์๋ค.
๊ทธ๋ฆฌ๊ณ โ์ด๋ฐ ๋ฌธ์ ์กฐ์ฐจ ํด๊ฒฐํ์ง ๋ชปํ๋ค๋ .. ๋๋ useState๋ ์ฌ์ฉํ์ง ๋ชปํ๋ ๋ฐ๋ณด์ผโ
โ์๋ ์ด๋ ๊ฒ ์ฌ์ฉํ๋๊ฒ ๋ง๋๋ฐ ์ ์๋ค์ด๊ฐ๋๊ณ ์ด๊ฑฐ ๋ด ๋ฌธ์ ๊ฐ ์๋์ผ!โ
ํ๋ ์์ ๋ถ์ด์ ์ฌ์ด์์ ์์์ ์๊ณ ๋ฉฐ์น ๋์ ๋๋ถ๋ฌ์ ธ์๋ค๊ฐ
๊ทธ๋ ๊ทธ๋๋ ํด๊ฒฐํด์ผ์ง. ํด๊ฒฐํ์ง ๋ชปํ๋ ๋ฌธ์ ๋ ์์ด.
ํ๋ ์๊ฐ์ผ๋ก npm start๋ฅผ ํ๋ ๊ทธ ์๊ฐ.
ํฐ๋ฏธ๋์์ ๊ฒฝ๊ณ ๋ฅผ ํ๋ ๋ฐ๊ฒฌํ๋ค!
๋ฐ๋ก ๊ฒฝ๊ณ ๋ฅผ ๋ณต์ฌํด์ ๊ตฌ๊ธ๋งํ๋ค.
๊ทธ ๊ฒฝ๊ณ ๋ ๋ฐ๋ก
React Hook useEffect has a missing dependency
์ด๊ฑฐ์๋ค.
๐์ฐธ๊ณ ๋ธ๋ก๊ทธ
exhaustive-deps-warning ํด๊ฒฐ๋ฒ
๊ตฌ๊ธ๋ง์ํด์ ์์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด๋ณด์๋ค.
ํด๋น ์ค๋ฅ๋ react hook์ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๋ง์ด ๋ณผ ์ ์๋ ๊ฒฝ๊ณ ๋ผ๊ณ ํ๋ค.
useEffect์์ ์ฌ์ฉํ๊ณ ์๋ state๋ฅผ ์ถ๊ฐ์์ผ ๋ฌ๋ผ๋ ์๋ฏธ์ด๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
โก 1. useEffect์ state ๋ฃ์ด์ฃผ๊ธฐ.
useEffect(() => {
getMovie();
}, [details]);
useEffect๋ฅผ ๋ฐฐ์ธ ๋ ๋ค์ ๋๊ดํธ ๋ถ๋ถ์ ์ง์ผ๋ณด๋ค๊ฐ ํด๋น ๋ณ์๊ฐ ์
๋ฐ์ดํธ๋๋ฉด useEffect์ ํจ์๊ฐ ์คํ๋๋ค๊ณ ๋ฐฐ์ ๋ค.
๊ทธ ์ ์ ๋ด ์ฝ๋์์๋ ๋๊ดํธ๋ถ๋ถ์ด ๋น์ด์์ผ๋ ์ฒ์ ํ๋ฉด ๋ก๋ฉ์์๋ง ์คํ์ด ๋๊ณ setDetails ๋์ ๋ ์คํ์ด ์๋๊ฑด๊ฐ๋ณด๋ค.
์ฝ๋๋ฅผ ์์ ๊ฐ์ด ๋ฐ๊พธ๊ณ ๋ค์ ์คํํ๋ ๋ค์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋คโฆ
๊ณ์๊ณ์ ์๋ฉ์ถ๊ณ ์ฝ์์ ์ฐํ๊ณ ์๋ค.
๊ทธ๋ฌ๋ฉด์ ๋ฆฌ์กํธ ๋๋ฒจ๋กํผํด
๋ก ํด๋น ๋ถ๋ถ์ด ๊ณ์๊ณ์ ๋ฆฌ๋ ๋๋ง ํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์๋คโฆ
๋์ฐํ๋คโฆ
โก 2. useEffect ๋ด๋ถ์ ํจ์๋ฅผ ์ ์ํ ๊ฒฝ์ฐ.
๋ธ๋ก๊ทธ ๊ธ์ ์ฐธ๊ณ ํด์ ์ ์ถํด๋ณด์๋ฉด
useEffect ์์์ ์ฌ์ฉํ๊ณ ์๋ getMovie๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ ๋ฃ์ด์ค์ผ ๊ฒฝ๊ณ ๊ฐ ๋์ค์ง ์๋๋ค.
useEffect(() => {
getMovie();
}, [getMovie, id]);
useEffect๋ถ๋ถ์ ์์ฒ๋ผ ๋ฐ๊พธ๊ณ ์คํํด๋ดค์ง๋ง ์ฒซ ๋ฒ์งธ ์์ ๊ณผ ๊ฐ์ ๋ฐ๋ณต๋๋ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค..ใ
์ ๋ฐ ํด๊ฒฐ์ฑ
์ด ๋ ๋์์๊ธฐ๋ฅผโฆ ํ๋ฉฐ ์คํฌ๋กค์ ๋ด๋ ธ๋๋ฐ useCallback
์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋์๋ค.
โก 2-2. useCallback.
useCallback์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ๊ณ์ํด์ ํจ์๋ฅผ ๋ง๋ค๊ฒ ๋๊ณ , ์๋ก์ด ์ฐธ์กฐ๊ฐ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต์ ์ผ๋ก ํจ์๋ฅผ ์คํํ๊ฒ ๋๋ค๊ณ ํ๋ค.
ํ์ง๋ง useCallback์ ์ ์ํ๋ฉด params๊ฐ ๋ฐ๋๋ ๋ง ํจ์๊ฐ ์คํ๋์ด์ ๋ถํ์ํ ํจ์ ์์ฑ๊ณผ ์คํ์ ๋ง์ ์ ์๋ค.
const [details, setDetails] = useState([]);
const { id } = useParams();
const getMovie = useCallback(async () => {
const json = await (
await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
).json();
console.log(json.data.movie);
setDetails(json.data.movie);
console.log(details);
}, [id]);
useEffect(() => {
getMovie();
}, [getMovie]);
useEffect(() => {
getMovie();
}, [getMovie, id]);
์ด๊ฑฐ๋ค..! ํ๋ ๋ง์์ผ๋ก ์์ฒ๋ผ ์ฝ๋๋ฅผ ์์ ํด์ ๋ค์ ์คํํด๋ณด์๋ค.
ํ์ง๋งโฆ ๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ๋ค..ใ
ใ
details๋ ๋น์ด์๋คโฆ
์๋ useEffect๋ถ๋ถ์ ๋ ๋ฒ์งธ ์ฒ๋ผ ๋ฐ๊ฟ์๋ ํด๋ดค์ง๋ง ์๋๋น..ํํ
์ด๊ฒ ์ ๊ฒ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์์ธํ ๋ณด๋ useEffect์์ console.log๊ฐ ๋จผ์ ์ฐํ๊ณ ๋์ getMovie์ console.log๊ฐ ์ฐํ๊ฑธ ํ์ธํ๋ค..
๊ทธ๋ ๋ค๋ ๋ง์ useEffect๊ฐ ์คํ๋๊ณ ๊ทธ ๋ค์์ getMovie๊ฐ ์คํ๋๋๊น useParams๋ก ๋ฐ์ id๊ฐ ๋ฐ๋๋ ์ฝ์์ ์ฐํ ์ ์๋๋ก ์์๋ฅผ ์กฐ๊ธ ๋ฐ๊ฟ์ ๋ค์ ์คํํด๋ดค๋ค.
function Detail() {
const [loading, setLoading] = useState(true);
const [details, setDetails] = useState([]);
const { id } = useParams();
console.log(details);
useEffect(() => {
const getMovie = async () => {
const json = await (
await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
).json();
console.log(json.data.movie);
setDetails(json.data.movie);
setLoading(false);
};
getMovie();
}, [id]);
return null;
}
์ด๋ ๊ฒ ํ๊ณ ๋๋๊น ๋จผ์ ์๋ฌด๊ฒ๋ ์๋ ๋น ๋ฐฐ์ด์ด ๋จผ์ ์ถ๋ ฅ๋๊ณ ๊ทธ ๋ค์์ ์ฝ์์ ์ถ๋ ฅ๋ ๊ฐ์ ธ์จ api์ ๋ฐฐ์ด, ๊ทธ ๋ค์์ setDetails์ ๋ฃ์ด์ฃผ๊ณ ๋ค์ console.log(details) ๊ฐ ์คํ๋๋ค.
์ฌ์ค? ์ด๋ป๊ฒ ๋ ์๋ฌธ์ธ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค๋ง?
์ด๊ฒ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ์ธ์ง..?
์ ์ฐ์ฐํ๋ค.
Leave a comment