概要
ReactでGoogleMapにピンを表示する可視化ツールの作成をしています。
APIを叩いて帰ってきたレスポンスデータ(JSON)データから、PINを表示させたいのですが
うまくいかず困っています。
該当のソースコード
resPoi.ts
export type resPoi ={ items: [ { id: number; lat: number; lng: number; } ]; status: string; };
response.data(Json)
{items: Array(14)} ↓ 0: { id:'1', lat:'35.6545', lng: '126.9778'} 1: { id:'2', lat:'32.9750', lng: '123.4742'} . .. ... 13:{ id:'14', ......}
GetApi.ts
typescript
1import axios from "axios"; 2import { useState, useCallback } from "react"; 3import { resPoi } from "../types/resPoi"; 4 5export const useGetApi = () => { 6 7 const [apiParams, setParams] = useState<resPoi>(); 8 9 const getApi = () =>{ 10 11 axios.get<resPoi>(`API/path`, { 12 params: params, //クエリparam 13 headers: { 14 "x-api-key": 'key', 15 } 16 17 }) 18 .then((res) => { 19 setParams(res.data); //ステートのapiParamsにres.data 20 console.log(res.data); 21 22 }) 23 .catch((error) => { 24 alert(error); 25 }) 26 } 27 28 return { apiParams, getApi } 29};
main.tsx
typescript
1 const { apiParams, getApi } = useGetApi(); 2 3 const getPlaces = useCallback (() => { 4 const places: { lat: number; lng: number}[] = []; 5 if (apiParams?.status === '') { 6 console.log(apiParams.items); 7 8 apiParams.items.map((poi) => { 9 places.push({ 10 lat: poi.lat, 11 lng: poi.lng, 12 }); 13 }); 14 } 15 return places; 16 }, [apiParams]); 17 18 return( 19 <React.StrictMode> 20 <googlemap resPoi={getplaces()} /> 21 </React.StrictMode>
googlemap.tsx
<<省略>> type point ={ lat:number; lng: number; }; type Props ={ resPoi: Array<point>; } export const Googlemap = (props: Props) => { const { resPoi } = props return( <LoadScript googleMapsApiKey={API_KEY} > <GoogleMap mapContainerStyle={containerStyle} center={center.center} zoom={center.zoom} > {/* <Marker position={position.Poi1} /> <Marker position={position.Poi2} /> */} {resPoi.map((marker: point) => ( <Marker key={`${marker.lat * marker.lng}`} position={{ lat: marker.lat, lng: marker.lng, }} /> ))} </GoogleMap> </LoadScript> ); };
試したこと
画面上にはピンが表示されず、エラーも出ないので何が原因かわからない状態です。
予想は、JSONデータをapiParamに渡せていないのではないかと思っています。
あなたの回答
tips
プレビュー