5월11일(목) MapMidPoint.js 카테고리 코드 리팩토링

Mindfulness·2023년 5월 10일
0

지도중첩으로 안 되던거. 콘솔찍어보니 5번 혹은 3번이나 실행이 된다. 그러니 마커찍혔다 빠지지... 원래 되던 코드 찍어보면 1번씩 찍힘. 근데 왜? 대체 ㅇ왜???

이 부분 해결하려 많은 노력 했지만 실패

function MapMidPoint() {
  // queryKey에 캐싱하여 값 불러오기위해 queryClient선언
  const queryClient = useQueryClient();
  // getQueryData로 캐싱한 값 MIDPOINTPROP키로 불러오기.
  const midPointProp = queryClient.getQueryData({ queryKey: ['MIDPOINTPROP'] });
  // getQueryData로 캐싱한 값 INPUTVALUESPROP키로 불러오기.
  const InputValuesProp = queryClient.getQueryData({
    queryKey: ['INPUTVALUESPROP'],
  });
  //  map page로 뒤로가기 위한 useRouter선언.
  const moveBackClickButtonHandler = () => {
    window.location.href = '/map';
  };
  //  클릭 선택된 장소를 저장할 state 변수
  const [checkedPlace, setCheckedPlace] = useState('');
  // 중간지점 좌표 받아온 값으로 서버와 통신하여 kakaoAPI값 DB저장 및 목록 불러오기
  const { data, isLoading, isError, refetch } = useQuery(
    {
      queryKey: ['GET_KAKAOAPI'],
      queryFn: async () => {
        const response = await apis.get(
          // 서버 URL
          `/kakaoApi?y=${midPointProp?.lat}&x=%20${midPointProp?.lng}&query=술집&radius=1500&page=1&size=15&sort=distance`,
        
        );
        return response;
      },
      //  한 번 실행되고 100분 후 실행되도록. 100분 (단위: 밀리초)
      staleTime: 6000000,
    },
    {
      // 에러 처리
      onError: (error) => {
        console.error(error);
      },
      // 패칭 데이터 상태 변화
      onSettled: (data) => {
        alert(data);
      },
    },
  );

    const [items, setItems] = useState(null);
    const getItems = async (midPointProp, query) => {
        try {
        const response = await apis.get(
            `/kakaoApi?y=${midPointProp?.lat}&x=%20${midPointProp?.lng}&query=${query}&radius=1500&page=1&size=15&sort=distance`,
            midPointProp,
        );

        setItems(response.data.documents);
        } catch (e) {
        console.log(e);
        }
    };

    const clickButtonHandler = (midPointProp, query) => {
        getItems(midPointProp, query);
    };

  //  카테고리별 술집 Data 불러오기
  const kakaoApi = data?.data?.documents; // 전체

  useEffect(() => {
    GetSpotsNearbyMidPoint(kakaoApi);
  }, [kakaoApi]);

  //  키워드 검색 로직
  const GetSpotsNearbyMidPoint = (items) => {
    console.log('items', items);
    const { kakao } = window;
    //지도를 담을 영역의 DOM 레퍼런스
    const container = document.getElementById('map');

    const options = {
      //지도를 생성할 때 필요한 기본 옵션
      center: new kakao.maps.LatLng(midPointProp?.lat, midPointProp?.lng), //지도의 중심좌표(중간지점props받은 값으로 해당지점 찍어줌)
      level: 3, //지도의 레벨(확대, 축소 정도)
    };
    //지도 생성 및 객체 리턴
    const map = new kakao.maps.Map(container, options);
    // const ps = new kakao.maps.services.Places();
    //  인포윈도우 선언(카카오map api에서 부르기)
    const infowindow = new kakao.maps.InfoWindow({ zIndex: 1 });
    // // 마커를 담을 배열입니다

    const searchForm = document.getElementById('submit_btn');

    if (items) {
      searchForm?.addEventListener('click', function (e) {
        //kakaoApi넣어줘야 작동
        showingOnMap(items);
      });
    }

    // 마커 및 인포윈도우, pagination
    function showingOnMap(data) {
      let markers = [];
      // console.log(data);
      // 검색 목록과 마커를 표출합니다
      displayPlaces(data?.data?.documents);

      const bounds = new kakao.maps.LatLngBounds();
      for (let i = 0; i < data?.data?.documents.length; i++) {
        displayMarker(data?.data?.documents[i]);
        bounds.extend(
          new kakao.maps.LatLng(
            data?.data?.documents[i].y,
            data?.data?.documents[i].x,
          ),
        );
      }

      map.setBounds(bounds);

      // 검색 결과 목록과 마커를 표출하는 함수입니다
      function displayPlaces(places) {
        const listEl = document.getElementById('placesList');
        const menuEl = document.getElementById('menu_wrap');
        const fragment = document.createDocumentFragment();
        const bounds = new kakao.maps.LatLngBounds();
        //  클릭된 항목에 대한 표시를 유지하기 위해 변수
        let clickedItem = null;
        //  클릭된 항목이 있다면 그 항목의 표시를 초기화하는 함수
        function clearClickedItem() {
          if (clickedItem !== null) {
            if (clickedItem.classList.contains('clicked')) {
              // 추가된 부분
              clickedItem.classList.remove('clicked');
            }
            clickedItem = null;
          }
        }
  ... 생략

  return (
    <>
                    <CategoryWrapper>
                      <ButtonText
                        id="submit_btn"
                        type="submit"
                        size="xxsm"
                        label="술집(종합)"
                        variant="primaryBolder"
                        onClick={() => {
                          clickButtonHandler(midPointProp, '술집(종합)');
                          GetSpotsNearbyMidPoint(items);
                        }}
                      />
                      <ButtonText
                        id="submit_btn2"
                        type="submit"
                        size="xxsm"
                        label="칵테일바"
                        variant="primaryBolder"
                        onClick={() => {
                          clickButtonHandler(midPointProp, '칵테일바');
                          GetSpotsNearbyMidPoint(items);
                        }}
                      />
                      <ButtonText
                        id="submit_btn3"
                        type="submit"
                        size="xxsm"
                        label="일본식주점"
                        variant="primaryBolder"
                        onClick={() => {
                          clickButtonHandler(midPointProp, '일본식주점');
                          GetSpotsNearbyMidPoint(items);
                        }}
                      />
                      <ButtonText
                        id="submit_btn4"
                        type="submit"
                        size="xxsm"
                        label="실내포장마차"
                        variant="primaryBolder"
                        onClick={() => {
                          clickButtonHandler(midPointProp, '실내포장마차');
                          GetSpotsNearbyMidPoint(items);
                        }}
                      />
                      <ButtonText
                        id="submit_btn5"
                        type="submit"
                        size="xxsm"
                        label="요리주점"
                        variant="primaryBolder"
                        onClick={() => {
                          clickButtonHandler(midPointProp, '요리주점');
                          GetSpotsNearbyMidPoint(items);
                        }}
                      />
                      <ButtonText
                        id="submit_btn6"
                        type="submit"
                        size="xxsm"
                        label="호프"
                        variant="primaryBolder"
                        onClick={() => {
                          clickButtonHandler(midPointProp, '호프');
                          GetSpotsNearbyMidPoint(items);
                        }}
                      />
                      <ButtonText
                        id="submit_btn7"
                        type="submit"
                        size="xxsm"
                        label="와인바"
                        variant="primaryBolder"
                        onClick={() => {
                          clickButtonHandler(midPointProp, '와인바');
                          GetSpotsNearbyMidPoint(items);
                        }}
                      />
                    </CategoryWrapper
                        </>
  );
}

이렇게 바꾸려 하였고 작동 잘함. 그렇지만 지도 중첩 문제로 실패. 계속해서 중첩되는 문제, 즉 여러번 함수들이 호출 되는 문제 해결하려고 하였지만 정확한 원인 파악마저 안 되었다...

profile
Junior Frontend Developer

0개의 댓글