์ฐ๋ฆฌ ํ์ด ํ์ฌ ๊ฐ๋ฐํ๊ณ ์๋ CampUs ์๋น์ค๋ ์ง๋๋ฅผ ํตํด ์บ ํ์ฅ์ ์ขํ๋ฅผ ํ์ธํ๊ณ ์บ ํ์ฅ์ ์กฐํํ ์ ์๋ ์๋น์ค์ด๋ค
์ ์ฌ์ง์ฒ๋ผ ์บ ํ์ฅ์ ๊ฒ์ํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ์ขํ๊ฐ ์ง๋์ ๋ฑ๋ก๋๊ณ ๋ง์ปค๋ฅผ ํด๋ฆญํ์ ๋ ์ฌ์ง๊ณผ ๊ฐ์ '์ปค์คํ ์ค๋ฒ๋ ์ด'๋ผ๊ณ ๋ถ๋ฅด๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๋ค.
์ด์ ์ kakaoMap API๋ฅผ ํตํด ๋ฆฌ์กํธ์์ ๊ฐ๋ฐ์ ํ์ ๋ ๋ฆฌ์กํธ์์ ์ฌ์ฉํ๊ธฐ๊ฐ ์กฐ๊ธ ๋ถํธํ๋ค๊ณ ๋๋์ ์ด ์์ด์
ํธ๋ฆฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์๊น ์ฐพ์๋ณด๋ค๊ฐ
https://github.com/JaeSeoKim/react-kakao-maps-sdk
GitHub - JaeSeoKim/react-kakao-maps-sdk: React components for using kakao map api
React components for using kakao map api. Contribute to JaeSeoKim/react-kakao-maps-sdk development by creating an account on GitHub.
github.com
react-kakao-maps-sdk ๋ผ๊ณ ํ๋ ๋ฆฌ์กํธ์์ ์นด์นด์ค๋งต API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ต์ ํ๋ ๊ธฐ๊ฐ๋งํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ๋ค....!
์ฌ์ฉ๋ฒ์ ๋ฌด์ฒ ๊ฐ๋จํ๋ ์ํ์ ๋ณด๋ฉด์ ๋ฐ๋ผํ๊ธธ ๋ฐ๋๋ค.
์ฐ๋ฆฌ๋ ์ด์ ๋ง์ปค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์ !
// CampLocation.jsx
import { Map } from 'react-kakao-maps-sdk';
import EventMarker from '../SearchLocation/EventMarker/EventMarker';
const CampLocation = ({
campList, // ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ ๋ฐฐ์ด๋ก ์ด๋ฃจ์ด์ง ์บ ํ์ฅ๋ฆฌ์คํธ
}) => {
return (
<Wrap PropState={PropState}>
<MapStyle // ์ง๋๋ฅผ ํ์ํ Container
center={{
// ์ง๋์ ์ค์ฌ์ขํ
lat: campList[0].mapY,
lng: campList[0].mapX
}}
level={3} // ์ง๋์ ํ๋ ๋ ๋ฒจ
>
// ์บ ํ์ฅ๋ฆฌ์คํธ๋ฅผ mapํจ์๋ก ๋๋ ค์ ๊ฐ ์บ ํ์ฅ ๋ฐ์ดํฐ๋ฅผ EventMarker ์ปดํฌ๋ํธ๋ก ์ ๋ฌ
{campList.map((camp) => <EventMarker key={camp.id} camp={camp} />)}
</MapStyle>
</Wrap>
);
};
CampLocation ๋ผ๋ ์ด๋ฆ์ ์ปดํฌ๋ํธ๊ฐ ์๋ค.
์ง๋์ ์ค์ฌ์ขํ๋ ์ฒ์ ์ง๋๊ฐ ๋ณด์ฌ์ง๋ ์ขํ์ด๊ณ ๋๋ ์ด ์ค์ฌ ์ขํ๋ฅผ ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ์บ ํ์ฅ์ด ๊ธฐ์ค์ด ๋๊ฒ ํ์๋ค.
CampList๋ผ๋ ์บ ํ์ฅ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ map ํจ์๋ก EventMarker ๋ผ๋ ์ปดํฌ๋ํธ์๊ฒ ๊ฐ ์บ ํ์ฅ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
EventMarker ์ปดํฌ๋ํธ๋ ๊ฐ ์บ ํ์ฅ์ X, Y ์ขํ๋ฅผ ๊ฐ์ง๊ณ ์ง๋์ ๋ง์ปค๋ฅผ ๊ฝ์์ฃผ๊ฒ ๋๋ค !
์ฐ์ ์ฌ๊ธฐ์ ํฌ์ธํธ๋
import { Map } from 'react-kakao-maps-sdk';
์ ์ฒ๋ผ react-kakao-map-sdk๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ๋ฆฌ์กํธ์์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ปดํฌ๋ํธ ํ์์ผ๋ก import ํด์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๊ธฐ์กด ์นด์นด์ค๋งต API ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค ! ๐๐๐
์ด์ EventMarker ์ปดํฌ๋ํธ๋ฅผ ์์๋ณด์
//EventMarker.jsx
import React, { useEffect, useState } from 'react';
import { CustomOverlayMap, MapMarker } from 'react-kakao-maps-sdk';
import defaultImg from '../../../Assets/Images/default_image.png';
const EventMarkerContainer = ({ camp }) => {
const [isVisible, setIsVisible] = useState(false); // true๋ฉด ์ปค์คํ
์ค๋ฒ๋ ์ด ๋ ๋๋ง
const [position, setPosition] = useState({
lat: '',
lng: '',
});
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๋ฉด position State์ X,Y ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค
useEffect(() => {
setPosition({
lat: camp.mapY,
lng: camp.mapX,
});
}, [camp.mapX, camp.mapY]);
return (
<>
// ์ง๋์์ ๋์ด๋ ๋ง์ปค
<MapMarker
position={position} // ๋ง์ปค๋ฅผ ํ์ํ ์์น
onClick={() => setIsVisible(true)} // ํด๋ฆญํ๋ฉด ์ปค์คํ
์ค๋ฒ๋ ์ด๊ฐ ๋ ๋๋ง ๋๋ค !
/>
{isVisible && ( //isVisible์ด true์ด๋ฉด ๋ ๋๋ง
<CustomOverlayMap
position={position} // ์ปค์คํ
์ค๋ฒ๋ ์ด๊ฐ ๋ํ๋ ์์น
style={{
width: '300px',
transform: 'translate(-20px, -100px)',
backgroundColor: 'white',
borderRadius: '5px',
boxShadow: '0px 1px 2px #888',
}}
>
<div className="wrap">
<div className="info">
<Title>
{camp.facltNm}
<CloseBtn onClick={() => setIsVisible(false)} title="๋ซ๊ธฐ">
....
....
....
....
๋ง ๊ทธ๋๋ก '์ปค์คํ ์ค๋ฒ๋ ์ด' ์ด๊ธฐ ๋๋ฌธ์ ์คํ์ผ์ ๋ง์๋๋ก ์ปค์คํ ์ด ๊ฐ๋ฅํ๋ค
useEffect์์ position์ด๋ผ๋ state์ ๊ฐ ์บ ํ์ฅ์ X, Y ์ขํ๋ฅผ ๋ฃ์ด์ฃผ๊ณ ๋ง์ปค์ ์ปค์คํ ์ค๋ฒ๋ ์ด ์ปดํฌ๋ํธ์
position ์ต์ ์ ๋ถ์ฌํ๋ฉด ์ง๋์์์ ๋ง์ปค์ ์ปค์คํ ์ค๋ฒ๋ ์ด๋ฅผ ํ์ธ ํ ์ ์๋ค !
์๋๋ ํ์ฌ ๊ฐ๋ฐํ๊ณ ์๋ ์๋น์ค์ ๋ง์ปค์ ์ปค์คํ ์ค๋ฒ๋ ์ด๋ฅผ ๊ตฌํํ ๋ชจ์ต์ด๋ค .
๊ธฐ์กด์ ์นด์นด์ค๋งต API๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋๊ผ๋ ๋ถํธํ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ ํจ์ผ๋ก์จ ํธ๋ฆฌํจ์ ๋๋ผ๊ฒ ๋์๋ค
๋ค์์ ์ธ์ ๊ฐ ์ง๋๋ฅผ ์ด์ฉํ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ๋๋ฉด ๋ ์ฐ์ง ์์๊น ?