개발자
마커를 생성하고 마커를 클릭시 페이지 이동을 하고 싶은데 아무런 미동조차 없어서 해결하고자 올려봅니다 ㅠㅠ 페이지 구조는 넥스트 앱라우터 /dashboard/[shipId]/page.tsx 로 되어있습니다. 클릭시 아무런 반응도 없고 지피티나 구글을 찾아봐도 저렇게 이벤트를 주는 방법 말고는 보이지가 않아서 질문드립니다 ㅠㅠ
1'use client'
2import { Marker, NaverMarker } from '@/types/mapType';
3import { useRouter } from 'next/navigation';
4import { useEffect, useState } from 'react';
5
6export const createLatLng = (lat: number, lng: number) => {
7 // 네이버 객체를 가져옴
8 const { naver } = window;
9 return new naver.maps.LatLng(lat, lng);
10};
11
12export const useMarkers = ({
13 shipLocations,
14 location,
15 map,
16 shipIconUrl,
17 homeIconUrl,
18}: Marker) => {
19 const [markers, setMarkers] = useState<NaverMarker[]>([]);
20 const router = useRouter();
21
22 useEffect(() => {
23 if (location && map) {
24 const currentLocation = createLatLng(location.lat, location.lng);
25 const homeMarker = new naver.maps.Marker({
26 position: currentLocation,
27 map,
28 icon: {
29 url: homeIconUrl,
30 scaledSize: new naver.maps.Size(25, 25),
31 origin: new naver.maps.Point(0, 0),
32 anchor: new naver.maps.Point(19, 58),
33 },
34 });
35
36 const shipMarkers = shipLocations.map((ship) => {
37 const naverDataLocation = createLatLng(ship.lat, ship.lng);
38 const marker = new naver.maps.Marker({
39 position: naverDataLocation,
40 map,
41 title: `위도: ${ship.lat}, 경도: ${ship.lng}`,
42 // animation: naver.maps.Animation.BOUNCE,
43 icon: {
44 url: shipIconUrl,
45 scaledSize: new naver.maps.Size(25, 25),
46 origin: new naver.maps.Point(0, 0),
47 anchor: new naver.maps.Point(19, 58),
48 },
49 });
50
51 naver.maps.Event.addListener(marker, 'click', () => {
52 router.push(`/dashboard/${ship.id}`);
53 });
54
55 return marker;
56 });
57 setMarkers([homeMarker, ...shipMarkers]);
58 }
59 }, [map, shipLocations]);
60
61 return markers;
62};
답변 1
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 02월 18일
코드 자체는 큰 문제가 보이지 않습니다. 몇 가지 생각해볼 수 있는 원인을 제안하겠습니다. 1. useRouter은 Next.js의 hook입니다. 때문에 이를 사용하는 Component가 반드시 React Functional Component여야 합니다. 2. useRouter의 반환값으로 redirect를 실행하는 중 에러가 발생할 수 있습니다. 예를 들어, `/dashboard/[shipId]/page.tsx`의 동적 라우팅 주소로 이동하려 하나 실제 파일 경로가 존재하지 않거나, `ship.id` 값이 null 또는 undefined인 경우에 페이지 이동이 일어나지 않을 수 있습니다. 3. 브라우저 Console 탭에서 어떤 에러 메세지가 출력되는지 확인해보세요. 4. useEffect 안에서 비동기 작업을 처리할 때에는 cleanup 함수를 꼭 반환해주셔야 합니다. 아래와 같이 Event Listener를 해제하는 코드를 추가해보세요. ```typescript useEffect(() => { // ... 기존 코드 return () => { // marker 클릭 이벤트 리스너 제거 shipMarkers.forEach(marker => { naver.maps.Event.removeListener(marker, 'click'); }); }; }, [map, shipLocations]); ``` 위 사항들을 확인하여도 문제가 해결되지 않는다면, 구체적인 오류 메시지나 환경 정보(Next.js 버전 등)와 함께 다시 질문해주세요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!