ディレクトリマッピングをNext+Type Scriptネストされたアイテムに関連付ける
24244 ワード
現在進行中のプロジェクトはコカソ地図をバインドしています.
しかし調べてみると、kakaomap公式サイトに展示されている例はES 5文法のバニラJavaScriptで書かれているようです.
これをnextとtypeスクリプトに適用する過程で、様々なブログと文章を参考にして、next+typeスクリプト環境で成功に適用する方法を理解しました.
マカオ地図APIはマカオ地図APIサイトで接続して使用することができます
ただし、その前に、カナダ地図APIを使用する場合は、ココア開発者のWebサイトに移動し、まず私のアプリケーションを登録し、API鍵を取得します.
ではこのように鍵を得ることができ、ここでJavaScript鍵を使えばいいのでサイトドメインを登録すればいいです.
正式な分類マッピングAPIを使用して地図を描く
1.APIキー環境変数の登録
上記のJavascriptキーをコピーし、環境変数としてプロジェクトに登録します.// .env.local
NEXT_PUBLIC_KAKAOMAP_APPKEY="JavaScript key를 여기다가 붙입니다."
nextプロジェクトは.env.local
ファイルに環境変数を登録します.NEXT_PUBLIC_KAKAOMAP_APPKEY
apiキーを後ろに貼り付けます.ここでは引用符で囲みます.
2.リンクディレクトリマッピングJavaScriptスクリプト
kaoマッピングapiを正式に登録するには、JavaScriptの<script>
を貼り付ける必要があります.
ただし、Nextには別の<script>
はありません.
Reactの場合はindexを使用します.htmlがあるので、そこにscriptタグを貼ればいいのですが、nextではどこに貼ればいいのでしょうか?// _app.tsx
function MyApp({ Component, pageProps }: AppProps) {
return (
<>
<Head>
<script src={ `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAOMAP_APPKEY}&autoload=false&libraries=services`}></script>
</Head>
<ThemeProvider theme={themeOptions}>
<GlobalStyles />
<AppLayout>
<Component {...pageProps} />
</AppLayout>
</ThemeProvider>
</>
)
}
私の場合はこのような_app.tsx
がファイル中<Head>
タグに<script>
タグが貼り付けられています.
srcではappkeyの後ろに先ほど.env.local
に登録した環境変数の値があります.
ただし、この場合、次のようにnext自体から赤い下線にエラーがエクスポートされます.External synchronous scripts are forbidden.
外部シナリオは禁止という意味らしい.
この問題を解決するために、以下のコードを修正しました.// _app.tsx
import Script from 'next/script';
function MyApp({ Component, pageProps }: AppProps) {
return (
<>
<Script
strategy='beforeInteractive'
src={ `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAOMAP_APPKEY}&autoload=false&libraries=services`}
/>
<ThemeProvider theme={themeOptions}>
<GlobalStyles />
<AppLayout>
<Component {...pageProps} />
</AppLayout>
</ThemeProvider>
</>
)
}
外部スクリプトを使用するには、'next/sript'
からScript
をインポートし、既存の<Script>
と同様に使用します.<script>
では、'next/script'
プロパティとNextを定義できます.js最適化スクリプトロード
// .env.local
NEXT_PUBLIC_KAKAOMAP_APPKEY="JavaScript key를 여기다가 붙입니다."
// _app.tsx
function MyApp({ Component, pageProps }: AppProps) {
return (
<>
<Head>
<script src={ `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAOMAP_APPKEY}&autoload=false&libraries=services`}></script>
</Head>
<ThemeProvider theme={themeOptions}>
<GlobalStyles />
<AppLayout>
<Component {...pageProps} />
</AppLayout>
</ThemeProvider>
</>
)
}
External synchronous scripts are forbidden.
// _app.tsx
import Script from 'next/script';
function MyApp({ Component, pageProps }: AppProps) {
return (
<>
<Script
strategy='beforeInteractive'
src={ `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAOMAP_APPKEY}&autoload=false&libraries=services`}
/>
<ThemeProvider theme={themeOptions}>
<GlobalStyles />
<AppLayout>
<Component {...pageProps} />
</AppLayout>
</ThemeProvider>
</>
)
}
strategy
:botが検出または管理に同意したような重要なスクリプトに使用され、ページのインタラクションの前にインポートおよび実行する必要があるスクリプトこれらのスクリプトは、サーバの初期HTMLに挿入され、独自のバンドルJavaScriptが実行される前に
beforeInteractive
:(デバッガ)ページインタラクション後にスクリプトをインポートおよび実行するためのラベルマネージャまたは分析ツールこれらのスクリプトはクライアント(client-side)に挿入され、水和後に
afterInteractive
:WeChatやSNSコンポーネントなどのアイドル時間ロードをサポートするためのスクリプトです.lazyOnload
を使用して、ロード終了時にコールバックしてオブジェクトにアクセスします.この場合、v 3ロードスクリプトアドレスにパラメータ
window.kakao.maps.load
を指定する必要があります.最後の
autoload=false
は、アドレスを座標に変換するために追加されたライブラリです.3. Map.tsxファイルを作成してKakaアドレスに接続
import { FC, useEffect } from "react";
import styled from "@emotion/styled";
const MapContainer = styled.div`
aspect-ratio: 16 / 9;
`
declare global {
interface Window {
kakao: any;
}
}
const Map: FC<{address: string}> = ({ address }) => {
useEffect(() => {
const onLoadKakaoMap = () => {
window.kakao.maps.load(() => {
const geocoder = new window.kakao.maps.services.Geocoder() // 주소-좌표 반환 객체를 생성
// 주소로 좌표를 검색
geocoder.addressSearch(address, (result: any, status: any) => {
if (status === window.kakao.maps.services.Status.OK) { // 정상적으로 검색이 완료됐으면
var coords = new window.kakao.maps.LatLng(result[0].y, result[0].x)
// 지도를 생성
const container = document.getElementById("map")
const options = {
center: coords,
level: 3,
}
const map = new window.kakao.maps.Map(container, options)
// 결과값으로 받은 위치를 마커로 표시
new window.kakao.maps.Marker({
map: map,
position: coords,
})
} else { // 정상적으로 좌표가 검색이 안 될 경우 디폴트 좌표로 검색
const container = document.getElementById("map")
const options = {
center: new window.kakao.maps.LatLng(33.450701, 126.570667),
level: 3,
}
// 지도를 생성
const map = new window.kakao.maps.Map(container, options)
new window.kakao.maps.Marker({
map: map,
position: coords,
})
}
})
})
}
onLoadKakaoMap()
}, [address])
return (
<MapContainer id="map" />
)
}
export default Map
まず、グローバルインタフェースlibraries=services
の使用を宣言します.位置はどこでも構いません.
アドレスを座標に変換して使うので、ネットで見たように緯度や経度を受け入れず、ハングルアドレスだけをpropsとして受け入れます.
window.kakao
は、関数onLoadKakaoMap
で実行されます.まずアドレス-座標を生成してオブジェクトを返し、受信したアドレスを座標に変換します.座標が正常に変換された場合、地図を生成してタグにマークします.そうしないと、基本座標を登録します.
(基本座標は済州島ココア社…)
ディレクトリマッピングの使用
現在使用されている場所は、以下のように使用できます.import Map from "parts/Map"
<Map address={address} />
その後、受信したpropsアドレスは、このように自動的に変換される.
addressには、アドレスとして認識できる文字列を入力すればよい.
これでスクリーンの地図がとてもきれいに表示されます.
Reference
この問題について(ディレクトリマッピングをNext+Type Scriptネストされたアイテムに関連付ける), 我々は、より多くの情報をここで見つけました
https://velog.io/@ckm960411/Next-TypeScript-넥스트-프로젝트에-카카오맵-연동하기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import Map from "parts/Map"
<Map address={address} />
Reference
この問題について(ディレクトリマッピングをNext+Type Scriptネストされたアイテムに関連付ける), 我々は、より多くの情報をここで見つけました https://velog.io/@ckm960411/Next-TypeScript-넥스트-프로젝트에-카카오맵-연동하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol