인프런 커뮤니티 질문&답변

신주안님의 프로필 이미지

작성한 질문수

맛집 지도앱 만들기 (React Native + NestJS)

[8-6] 마커 필터링하기

의존성 배열에 filterItems를 넣으면 무한렌더링이 발생합니다.

해결된 질문

24.05.17 01:19 작성

·

171

·

수정됨

1

import {useEffect, useState} from 'react';

import {queryKeys, storageKeys} from '@/constants';
import type {Marker} from '@/types';
import {getEncryptedStorage, setEncryptedStorage} from '@/utils';
import queryClient from '@/api/query-client';

const initialFilters = {
  RED: true,
  YELLOW: true,
  GREEN: true,
  BLUE: true,
  PURPLE: true,
  '1': true,
  '2': true,
  '3': true,
  '4': true,
  '5': true,
};

function useMarkerFilterStorage() {
  const [filterItems, setFilterItems] =
    useState<Record<string, boolean>>(initialFilters);

  const set = async (items: Record<string, boolean>) => {
    queryClient.invalidateQueries({
      queryKey: [queryKeys.MARKER, queryKeys.GET_MARKERS],
    });
    await setEncryptedStorage(storageKeys.MARKER_FILTER, items);
    setFilterItems(items);
  };

  const transformFilteredMarker = (markers: Marker[]) => {
    return markers.filter(marker => {
      return (
        filterItems[marker.color] === true &&
        filterItems[String(marker.score)] === true
      );
    });
  };

  useEffect(() => {
    (async () => {
      const storedData =
        (await getEncryptedStorage(storageKeys.MARKER_FILTER)) ??
        initialFilters;
      setFilterItems(storedData);
    })();
  }, [filterItems]);

  return {set, items: filterItems, transformFilteredMarker};
}

export default useMarkerFilterStorage;

의도대로 items의 값을 set으로 변경하면 필터링이 정상적으로 동작하지만 무한렌더링이 발생합니다.

무한 렌더링을 막기 위해 의존성 배열을 지우고 쿼리키를 무효화하는 방법등 많은 시도를 해봤지만 제대로 동작하지 않네요.

혹시 현재 진행된 강의에서 무한 렌더링을 해결할 수 있는 방법이 있을까요?

답변 1

0

Kyo님의 프로필 이미지
Kyo
지식공유자

2024. 05. 17. 01:42

안녕하세요. 의존성 배열에서 filterItems를 제거하고, filterItem을 store로 관리하는 방식으로 변경해보시겠어요? set에 넣으신 쿼리무효화 코드는 제거해도 될것같습니다.

Kyo님의 프로필 이미지
Kyo
지식공유자

2024. 05. 17. 01:43

해당코드 8-6깃헙에도 업로드 하였습니다! 참고해주세요

신주안님의 프로필 이미지
신주안
질문자

2024. 05. 17. 10:29

확인했습니다! 빠른 답변 감사합니다!