https://postcode.map.daum.net/guide
Daum ์ฐํธ๋ฒํธ ์๋น์ค
์ฐํธ๋ฒํธ ๊ฒ์๊ณผ ๋๋ก๋ช ์ฃผ์ ์ ๋ ฅ ๊ธฐ๋ฅ์ ๋๋ฌด ๊ฐ๋จํ๊ฒ ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ. Daum ์ฐํธ๋ฒํธ ์๋น์ค๋ฅผ ์ด์ฉํด๋ณด์ธ์. ์ด๋ ์ฌ์ดํธ์์๋ ๋ฌด๋ฃ๋ก ์ ์ฝ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ต๋๋ค.
postcode.map.daum.net
ํ์๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํ ์ค, ์ฃผ์๋ฅผ ์ง์ ์ ๋ ฅํ์ง ์๊ณ ๊ฒ์ ์๋น์ค๋ฅผ ๋ฃ๊ธฐ ์ํด ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณด๋์ค,
๋๋ก๋ช ์ฃผ์ api๋ ์กฐ๊ธ ๋ณต์ก..ํ๋ค ์๊ฐํ๋ ์ค
๋ค์์ฃผ์ ๊ฒ์ api๋ฅผ ์๊ฒ๋จ! ์ด๊ฑด ์ง์ง ํธํ๋ฐ...
์ผ๋จ ๋ค์์์ ์ ๊ณตํ๋ api๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ์ค์น๋ถํฐ ํด๋ณด์
npm install react-daum-postcode
์ด๊ฒ๋ง ํ๋ฉด ์ด์ ์ง์ง ๋๋ฌ์!!!
๋๋ ํ์๊ฐ์ ํ์ด์ง์์ ๊ณตํต์ผ๋ก ์ฐ๋ ๋ฒํผ์ ์ด์ฉํด,
์๋ก์ด ๋ชจ๋ฌ์ฐฝ์ ์ฌ๋ ๋ฐฉ์์ผ๋ก ํ๋ ค ํ๋ค.
์๋๋ฉด ์ด๊ฑฐ ๋นํ์์ด๋ ๊ด๋ฆฌ์๊ฐ ์ถ๊ฐํ ๋๋ ์ด์ฉํด์ผํ๊ธฐ ๋๋ฌธ์....
import DaumPostcode from "react-daum-postcode";
<DaumPostcode
onComplete={onCompletePost}
></DaumPostcode>
์ฌ์ฉํ ๊ณณ์์ ์ถ๊ฐํด์ฃผ๋ฉด ๋จ
AddressModal.tsx
import {
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalFooter,
ModalBody,
ModalCloseButton,
Button,
} from "@chakra-ui/react";
import DaumPostcode from "react-daum-postcode";
export default function SearchAddressModal({ isOpen, onOpen, onClose, onCompletePost }: any) {
return (
<>
<Modal isOpen={isOpen} onClose={onClose} size={"sm"}>
<ModalOverlay />
<ModalContent>
<ModalHeader>์ฃผ์๊ฒ์</ModalHeader>
<ModalCloseButton />
<ModalBody>
<DaumPostcode
onComplete={onCompletePost}
></DaumPostcode>
</ModalBody>
</ModalContent>
</Modal>
</>
);
}
๋ค๋ฅธ ๊ณณ์๋ ๊ณตํต์ผ๋ก ์ด์ฉํ๋ chakra ui ๋ชจ๋ฌ๋ก ๋ง๋ค์๋ค.
์ค์ํ๊ฑด ์ผ๋จ import ํด์จ ๊ฒ๊ณผ ์ค๊ฐ์ DaumPostCode ์ปดํฌ๋ํธ!
์ด์ ํ์๊ฐ์ ํ์ด์ง์์ ์ด ๋ชจ๋ฌ์ ์ด๊ณ , onComplete ํจ์๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ค์ ํด์ฃผ๋ฉด๋จ
๋ฒํผ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ ์ด์ด์ฃผ๊ณ ,
onCompleteํจ์๋ ์ฃผ์ ๋๋ ์ ๋ ์คํ๋๋ ํจ์์ด๋ค.
const onCompletePost = (data: any) => {
console.log(data);
};
์ผ๋จ ์ด๋ ๊ฒ ํด์ data๊ฐ ์ด๋ป๊ฒ ์ค๋์ง ํ์ธํ๊ณ ,
๋๋ ํ์๊ฐ์ form์ ๊ณตํต ์ปดํฌ๋ํธ ์ฌ์ฉํ๊ณ , ๊ทธ ์์ ๋ค์ด๊ฐ๋ ๋ฐ์ดํฐ ๋ฆฌ์คํธ๋ง ๋ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฃผ์๊ฒ์ ํ ์ฃผ์ ์ ํํ๊ณ ๋๋ฉด ์์ธ์ฃผ์๋ฅผ ์ ๋ ฅํ๋ ์นธ์ด ์ง์! ๋ฑ์ฅํ๊ฒ ๋ง๋ค ๊ฒ์.
const {
isOpen: isSearchAddressOpen,
onOpen: onSearchAddressOpen,
onClose: onSearchAddressClose,
} = useDisclosure();
<Button
ml={"10px"}
fontSize={"sm"}
color={"#F8bbd0"}
onClick={onSearchAddressOpen}
>
์ฃผ์์ฐพ๊ธฐ
</Button>
์ผ๋จ ๋ชจ๋ฌ์ฐฝ ์ด๋ฆฌ๊ฒ ํ๊ณ ,
const [showDetailAddressInput, setShowDetailAddressInput] = useState<boolean>(false);
{
id === "addressDetail" && !showDetailAddressInput ? (
<></>
) : <๋๋จธ์ง input ์ฝ๋>
}
์์ธ์ฃผ์ ์ฐฝ ์ํ๊ฐ์ ์ถ๊ฐํด์ค๋ค
onComplete ํจ์๋ง ๋ง๋ค์ด์ฃผ๋ฉด ๋จ!
const onCompletePost = (data: any) => {
setInputAddressValue(data.address);
onSearchAddressClose();
setShowDetailAddressInput(true);
};
{isSearchAddressOpen ? (
<SearchAddressModal
isOpen={isSearchAddressOpen}
onClose={onSearchAddressClose}
onCompletePost={onCompletePost}
/>
) : (
<></>
)}
์ ํํ ์ฃผ์๊ฐ์ Address input ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ,
๋ชจ๋ฌ์ฐฝ์ ๋ซ๊ณ , ๊ทธ๋ฆฌ๊ณ ์์ธ์ฃผ์ ์ฐฝ ์ํ๊ฐ์ true๋ก ๋ฐ๊พธ์ด์ค!
์ฌ๊ธฐ์ onSearchAddressClose() ์ () ์ด๊ฑฐ ์ ๋ถ์๋๋ ์๊พธ ๋ชจ๋ฌ์ฐฝ๋ง ์ ๋ซํ๋ค ใ ,ใ
์ฃผ์์ฐฝ์ ์์ด์ก๋๋ฐ..
๋ค๋ฅธ button onclick ํ ๋๋ () ์ ๋ถ์ฌ๋ ๋์์ด์ ํท๊ฐ๋ ธ๋ค ใ ,ใ
์ด๋ ๊ฒ ํ๋ฉด ์์ฑ!
'Coding Diary' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Floating Labels Chakra UI๋ก ์ ์ฉํ๊ธฐ (feat. Next 14) (1) | 2024.03.11 |
---|---|
[Next] SNS๋ณ๋ก ๋์ ๋ผ์ฐํ (Dynamic Routes) ์ง์ ํ๊ธฐ (1) | 2024.03.05 |
[JS, React] ํ์ด์ง ์ฒ๋ฆฌ ์ ์ธ๋ฑ์ค๋ฅผ ์ญ์์ผ๋ก ์ฒ๋ฆฌ (2) | 2023.11.27 |
Ag-grid์ ์ซ์๋ง ์ ๋ ฅ๋๊ฒ ํ๊ธฐ : agNumberColumnFilter (0) | 2023.10.02 |
Check Box ์ด์ฉํด์ Select option ๊ฐ ๋ณ๊ฒฝํ๊ธฐ (0) | 2023.09.22 |