안녕하세요.
nextjs13을 이용해서 useEffect로 맵과 커스텀오버레이를 불러와 쓰고 있습니다.
select tag 옵션에 따라서 data가 갱신되면 맵에 표출될 커스텀오버레이 갯수도 바뀌도록 했는데요,
문제는 옛 커스텀오버레이가 맵에서 사라리지 않은 채 새로운 커스텀오버레이가 중첩된다는 것입니다.
let pins = [];
pin.setMap(kakaoMap);
pins.push(pin);
console.log(pins);
추이를 보기 위해 위와 같이 pins 정보를 콘솔로 찍어보면
빈 어레이가 되었다가 변경된 커스텀오버레이 갯수만큼만 나타나는데
왜 옛날 커스텀오버레이는 안 사라지는 걸까요…? ㅠㅠ
참고하실 수 있도록 아래에 코드를 공유드립니다
const [kakaoMap, setKakaoMap] = useState(null);
const [gu, setGu] = useState(0);
const [type, setType] = useState(0);
const [installYear, setInstallYear] = useState(0);
useEffect(() => {
const kakaoMapScript = document.createElement("script");
kakaoMapScript.async = false;
kakaoMapScript.src = `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_API_KEY_KAKAO_MAP}&autoload=false`;
document.head.appendChild(kakaoMapScript);
const onLoadKakaoAPI = () => {
window.kakao.maps.load(() => {
const container = document.getElementById("map");
const options = {
center: new window.kakao.maps.LatLng(
35.824078559135316,
127.14814325735101
),
level: 8,
};
const map = new window.kakao.maps.Map(container, options);
/* map.setZoomable(false); */
setKakaoMap(map);
});
};
kakaoMapScript.addEventListener("load", onLoadKakaoAPI);
}, []);
useEffect(() => {
if (kakaoMap == null) {
return;
}
const width = 10;
data &&
data.solar.map((solar) => {
const pin = new window.kakao.maps.CustomOverlay({
content: `
<div>
<div style="
position: relative;
left: -50%;
transform: translateX(50%);
top: 50%;
width: ${width}px;
height: ${width}px;
border-radius: ${width / 2}px;
background-color: ${
solar.type == 1
? "#e6233a99"
: solar.type == 2
? "#d7770799"
: "#2680eb99"
};
border: solid ${width / 10}px #ffffff;
box-shadow: 1px 1px 3px 2px #00000020;
"></div>
</div>
`,
position: new window.kakao.maps.LatLng(
solar.latitude,
solar.longitude
),
xAnchor: 0.5,
yAnchor: 0.5,
zIndex: 3,
});
pin.setMap(kakaoMap);
pins.push(pin);
});
console.log(pins);
}, [data]);
※ map이 load되는 useEffect에 gu, type, installYear(selectbox를 통해 변하는 값들)을 넣어주면 얼추 원하는 대로 되는 것 같다가도 셀렉트박스를 빨리 변경하면 도루묵이 됨