inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] React로 NodeBird SNS 만들기

swr 사용해보기

swr 구현 질문입니다.

703

Sssekkk
1

const listFetcher = async (url) => {
    const res = await apiClient.get(url, {
        params: {
            siteKey: siteKey,
            keyword: searchData,
            page: page,
            size: 30,
            orderOption: sortModel.field || "createAt",
            orderSeq: sortModel.sort || "desc",
        },
    });

    console.log(res.data);

    return res.data;
};

const {
    data: listData,
    error: listError,
    mutate: listMutate,
} = useSWR(`/notices`, listFetcher);

useEffect(() => {
    if (!listData) return;
}, [listData]);

useEffect(() => {
    listMutate();
}, [page, sortModel, selectBoxState, searchData]);

안녕하세요! 현재 next.js 프로젝트로 swr 구현중인데,
현재는 useEffect로 mutate를 한번 더 하고 있어서 첫 렌더링 시, 총 2번의 api 호출이 되고 있습니다.

불필요한 api 중복 호출을 막기 위해
첫 렌더링 시에는 한번만 api 호출이 되고, 변수의 state값이 변경될 때마다 api 호출을 하기 위해서는 어떻게 하는것이 나을까요..? ㅜ

react redux node.js express next.js

답변 2

0

제로초(조현영)

일단 listMutate()를 왜 하시는 건가요?

swr에는 조건부 렌더링이 있어서 원할 때만 렌더링할 수 있습니다.

https://swr.vercel.app/docs/conditional-fetching

0

Sssekkk

listMutate()는

page, sortModel, selectBoxState, searchData값이 변경될 때마다 api 재호출하기 위해 사용하고 있는데,

혹시 또다른 방법이 있나요?

보여주신 링크로는 어떻게 처리해야 할지 모르겠습니다 ㅜㅜ

0

제로초(조현영)

false인 state를 하나 만들고 그 state가 true일 때 불러오시면 되고요. listMutate를 호출할 때 위에 state를 true로 만드시면 됩니다.

0

제로초(조현영)

아 근데 지금 생각해보니까

https://swr.vercel.app/docs/conditional-fetching#dependent

이렇게 하는게 훨씬 좋은 방법이긴하네요

0

Sssekkk

const listFetcher = async () => {
    //매개변수로 url받아오지 않고 직접 url 작성.
    const res = await apiClient.get(`/notices`, {
        params: {
            siteKey: siteKey,
            keyword: searchData,
            page: page,
            size: 30,
            orderOption: sortModel.field || "createAt",
            orderSeq: sortModel.sort || "desc",
        },
    });

    console.log(res.data);

    return res.data;
};

//listMutate 대신 key값으로 해당 객체들 넣어줌.
const {
    data: listData,
    error: listError,
    mutate: listMutate,
} = useSWR(`/notices?page=${page}&sortModel=${sortModel}&selectBoxState=${selectBoxState}&searchData=${searchData}`, listFetcher);

useEffect(() => {
    if (!listData) return;
}, [listData]);

이렇게 작성을 말씀하시는 거죠~~?

0

제로초(조현영)

네 맞습니다!

0

Sssekkk

넵!!

위처럼 해봤더니, 정렬(sortModel)의 경우 호출이 바로 되지 않을때도 있는데,
이건 이전에 동일한 key값을 사용한 적이 있기 때문에 그런건가요..?

0

제로초(조현영)

이부분은 swr-devtools 설치해서 확인하시는게 좋을 것 같습니다

0

Sssekkk

아하 넵 감사합니다~!!!!!!!!X10000000

0

얌탱이

const { data: listData, error: listError, mutate: isMutate } = useSWR(['/notices', { siteKey, searchData, page, sortModel }, async ([url, { siteKey, searchData, page, sortModel }]) => {  
  const res = await apiCient.get(url, {
    params: {
      siteKey: siteKey,
      keyword: searchData,
      page: page,
      size: 30,
      orderOption: sortModel.field || "createAt",
      orderSeq: sortModel.sort || "desc",
    }
  });
  return res.data;
});


이렇게 하면 안되나요?

참고: https://swr.vercel.app/docs/arguments#multiple-arguments 

0

Sssekkk

헉... 이런 방법이 있었군요! 감사합니다!!!!!!!@!!!!!

일렉트론으로 앱을 하나 만들었는데

0

296

0

속았어요 ㅠㅠ, 왕초보인데, gui 이었으면..

0

395

0

비전공 국비수료생이 볼 수 있을까요?

0

392

1

로드맵으로 프론트엔드 전향이 가능할까요?

0

415

1

페이지네이션 랜더링 질문

0

447

1

요즘시장에 MERN스택으로 개발하는 프로젝트가 많이 있는지 궁금합니다.

0

459

1

서버공부 (Java spring)

0

436

0

신규 강의가 비슷하게 나왔던데

0

432

0

다이아그램 자료 안뜨는데요.

0

426

0

업데이트로 인해, Adroid 설정부분이 조금 다릅니다.

1

445

1

선생님.. 구현하고자 하는게 있는데 도저히 구글링해도 어떻게 손을 봐야할지 모르겠습니다..

0

529

2

_song.html 세션 문제?

0

509

2