Next.js

Warning: React Hook useEffect has a missing dependency: 'setData'. Either include it or remove the dependency array.

김영수 2024. 5. 17. 22:35

 

터미널에서 경고창에 이런 문구가 올라올때...

Warning: React Hook useEffect has a missing dependency: 'setData'. Either include it or remove the dependency array. 

 

원래 코드

User
import { fetchSearchResults } from "@/api";
import SubLayout from "@/components/SubLayout";
import { useRouter } from "next/router";
import {  useEffect, useState } from "react";
import Searchbar from "@/components/Searchbar";
import CountryList from "@/components/CountryList";
import Head from "next/head";

export default function Search () {

    const router = useRouter()
    const { q } = router.query;

    const [countries, setCountries] = useState([]);

    const setData = async() => {
        const data = await fetchSearchResults(q);
        setCountries(data);    //q로 불러온 결과를 setCountries 에 저장해 준다.
    };

    useEffect(()=>{
        if(q){
            setData();
        }
    },[q]);

    return (
        <>  
            <Head>
                <title>NARAS 검색 결과</title>
                <meta property="og:image" content="/thumbnail.png" />
                <meta property="og:title" content="NARAS" />
                <meta property="og:description" content="전 세계 국가들의 정보를 확인해보세요" />
            </Head>
            <Searchbar q={q} />
            <CountryList countries={countries} />  
        </>
    );
}
Search.Layout = SubLayout;

 

수정후 코드:

import { fetchSearchResults } from "@/api";
import SubLayout from "@/components/SubLayout";
import { useRouter } from "next/router";
import {  useEffect, useState, useCallback } from "react";
import Searchbar from "@/components/Searchbar";
import CountryList from "@/components/CountryList";
import Head from "next/head";

export default function Search () {

    const router = useRouter()
    const { q } = router.query;

    const [countries, setCountries] = useState([]);

    const setData = useCallback(async() => {
        const data = await fetchSearchResults(q);
        setCountries(data);      //Store the results fetched by query q into setCountries. 쿼리 q로 가져온 결과를 setCountries에 저장합니다.
    },[q]);              // Dependency on q ensures setData is only re-created when q changes.
                           q에 대한 종속성은 q가 변경될 때만 setData가 다시 생성되도록 보장합니다.
    useEffect(()=>{
        if(q){
            setData();
        }
    },[q, setData]);      // Now, setData is also included in the dependency array.
                              이제 setData도 종속성 배열에 포함됩니다.
    return (
        <>  
            <Head>
                <title>NARAS 검색 결과</title>
                <meta property="og:image" content="/thumbnail.png" />
                <meta property="og:title" content="NARAS" />
                <meta property="og:description" content="전 세계 국가들의 정보를 확인해보세요" />
            </Head>
            <Searchbar q={q} />
            <CountryList countries={countries} />  
        </>
    );
}

Search.Layout = SubLayout;

 

수정후 다시 빌드 시키면

npm run build

터미널에서 실행 결과를 보여준다.

npm run build

> section122@0.1.0 build
> next build

   ▲ Next.js 14.1.0

 ✓ Linting and checking validity of types    
   Creating an optimized production build ...
 ✓ Compiled successfully
 ✓ Collecting page data    
   Generating static pages (0/7)  [    ]KOR 페이지 생성!
   Generating static pages (1/7)  [=   ] 
 ✓ Generating static pages (7/7) 
 ✓ Collecting build traces    
 ✓ Finalizing page optimization    

Route (pages)                                   Size     First Load JS
┌ ● / (1130 ms)                                 1.66 kB        83.8 kB
├   └ css/56ef7acf6a666ee2.css                  352 B
├   /_app                                       0 B            78.2 kB
├ ○ /404                                        181 B          78.4 kB
├ λ /api/hello                                  0 B            78.2 kB
├ ● /country/[code] (ISR: 3 Seconds) (2295 ms)  1.13 kB        83.2 kB
├   └ css/0a756eec20a9871e.css                  305 B
├   ├ /country/ABW (1051 ms)
├   └ /country/KOR (980 ms)
└ ○ /search                                     20.2 kB         102 kB
    └ css/28245855e53fa023.css                  412 B
+ First Load JS shared by all                   78.5 kB
  ├ chunks/framework-5429a50ba5373c56.js        45.2 kB
  ├ chunks/main-930135e47dff83e9.js             31.8 kB
  └ other shared chunks (total)                 1.53 kB

○  (Static)   prerendered as static content
●  (SSG)      prerendered as static HTML (uses getStaticProps)
   (ISR)      incremental static regeneration (uses revalidate in getStaticProps)
λ  (Dynamic)  server-rendered on demand using Node.js

경고문구 완벽하게 해결!

 

2024.0517