【问题标题】:react-google-maps resets map when using onClick eventsreact-google-maps 在使用 onClick 事件时重置地图
【发布时间】:2021-08-24 02:48:32
【问题描述】:

我在实现一些简单的 react-google-maps 代码时遇到了困难,每当单击标记或关闭信息框时,地图都会将其位置重置为原始位置。我看到我应该将地图组件与更改状态分开渲染,但我不确定如何实现。

感谢任何帮助

import React, {useState} from 'react';
import {Marker, GoogleMap,LoadScript,InfoWindow} from '@react-google-maps/api';


const MapContainer = ({markers}) => {
    const [selected, setSelected] = useState<any>({})

    const onSelect = (item) => {
        setSelected(item)
    }

    const mapStyles = {
        height: "100vh",
        width: "100%",
    }

    const defaultCenter = {
        lat: 45.510440, lng: -122.683338
    }

    const renderMap = () => {
    return <>
        <div>
            <LoadScript
                googleMapsApiKey='[GOOGLE API KEY]'>
                <GoogleMap
                    mapContainerStyle={mapStyles}
                    zoom={13}
                    center={defaultCenter}
                    >

                {markers.map((marker)=> {
                    return(
                    <Marker 
                        position={{
                            lat: marker.lat,
                            lng: marker.lng
                        }}
                        title={marker.title}
                        onClick={ () => onSelect(marker) }
                    />
                )})
                }
                {
                    selected.lng &&
                    <InfoWindow
                    position={
                        {
                            lat: selected.lat,
                            lng: selected.lng
                        }
                    }
                    onCloseClick={() => setSelected({})}
                    >
                        <div>
                        <h3>{selected.title}</h3>
                        <p>{selected.info}</p>
                        </div>
                    </InfoWindow>
                }

                </GoogleMap>
            </LoadScript>
        </div>
    </>
    }

    return renderMap()
}

export default MapContainer; ```

【问题讨论】:

  • 请从代码中删除您的 API 密钥,并在 Google API 控制台中进行更改,否则将被其他人使用。
  • 天哪,谢谢你看到这个!
  • 不客气。我以前也做过类似的事情。不要忘记在控制台中更改它。像这样的网站很可能会因为这样的 API 密钥而被抓取。

标签: reactjs typescript google-maps react-google-maps


【解决方案1】:

似乎将您的中心值置于一个状态并将单击的标记坐标设置为新中心将解决该问题。这是sample code 和代码 sn-p:

import React, {useState} from 'react';
import {Marker, GoogleMap,LoadScript,InfoWindow} from '@react-google-maps/api';
import { render } from "react-dom";
import markers from "./data.json"
const MapContainer = () => {
    const [selected, setSelected] = useState<any>({})
    const [center,setCenter]= useState({
        lat: 39.952584, lng: -75.165221
    })

    const onSelect = (item) => {
        setSelected(item)
        setCenter({
        lat: item.lat, lng: item.lng
    })
    }

    const mapStyles = {
        height: "100vh",
        width: "100%",
    }


    const renderMap = () => {
    return <>
        <div>
            <LoadScript
                googleMapsApiKey='AIzaSyBlfuRgAUDPGJnUpwyyhdSBIs193bXboMQ'>
                <GoogleMap
                    mapContainerStyle={mapStyles}
                    zoom={13}
                    center={center}
                    >

                {markers.map((marker,i)=> {
                    return(
                    <Marker 
                    key={i}
                        position={{
                            lat: marker.lat,
                            lng: marker.lng
                        }}
                        title={marker.title}
                        onClick={ () => onSelect(marker) }
                    />
                )})
                }
                {
                    selected.lng &&
                    <InfoWindow
                    position={
                        {
                            lat: selected.lat,
                            lng: selected.lng
                        }
                    }
                    onCloseClick={() => setSelected({})}
                    >
                        <div>
                        <h3>{selected.id}</h3>
                        <p>{selected.name}</p>
                        </div>
                    </InfoWindow>
                }

                </GoogleMap>
            </LoadScript>
        </div>
    </>
    }

    return renderMap()
}


render(<MapContainer />, document.getElementById('root'));

【讨论】:

    【解决方案2】:

    将中心置于一个状态,并在瓦片加载后将其设置为空,如下所示:

    import React, {useState} from 'react';
    import {Marker, GoogleMap,LoadScript,InfoWindow} from '@react-google-maps/api';
    
    
    const MapContainer = ({markers}) => {
        const [selected, setSelected] = useState<any>({})
    
        const onSelect = (item) => {
            setSelected(item)
        }
    
        const mapStyles = {
            height: "100vh",
            width: "100%",
        }
    
        const defaultCenter = {
            lat: 45.510440, lng: -122.683338
        }
        const [center, setCenter] = useState(defaultCenter)
    
    
        const renderMap = () => {
        return <>
            <div>
                <LoadScript
                    googleMapsApiKey='[GOOGLE API KEY]'>
                    <GoogleMap
                        mapContainerStyle={mapStyles}
                        zoom={13}
                        center={center}
                        onTilesLoaded={() => setCenter(null)}
                        >
    
                    {markers.map((marker)=> {
                        return(
                        <Marker 
                            position={{
                                lat: marker.lat,
                                lng: marker.lng
                            }}
                            title={marker.title}
                            onClick={ () => onSelect(marker) }
                        />
                    )})
                    }
                    {
                        selected.lng &&
                        <InfoWindow
                        position={
                            {
                                lat: selected.lat,
                                lng: selected.lng
                            }
                        }
                        onCloseClick={() => setSelected({})}
                        >
                            <div>
                            <h3>{selected.title}</h3>
                            <p>{selected.info}</p>
                            </div>
                        </InfoWindow>
                    }
    
                    </GoogleMap>
                </LoadScript>
            </div>
        </>
        }
    
        return renderMap()
    }
    
    export default MapContainer;
    

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2018-11-18
      • 1970-01-01
      • 2021-06-20
      • 2017-04-01
      相关资源
      最近更新 更多