繁体   English   中英

使用 react-google-maps/api 时如何正确处理路线更改?

[英]How to correctly handle route changes when using react-google-maps/api?

我有一个具有以下结构的react-router-dom路由器:

...
...
<BrowserRouter>
      ...
      <Switch>
          <Route exact path="/" component={Landing} />
          <Route path="/about" component={About} />
          <Route path="/dashboard" component={MyAccount} />
          <Route path="/register" component={Register} />
          <Route path="/login" component={Login} />
        </Switch>
</Router>
....

我的Landing组件使用@react-google-maps/api库有条件地显示MapContainer组件:

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

const containerStyle = {
  width: '100%',
  height: '400px'
};

const MapComponent = ({ trips }) => { 
  const [map, setMap] = useState(null);
  const [ selected, setSelected ] = useState({});
  const [ currentPosition, setCurrentPosition ] = useState({});

  const success = position => {
    const currentPosition = {
      lat: position.coords.latitude,
      lng: position.coords.longitude
    }
    setCurrentPosition(currentPosition);
  };

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

  const onLoad = useCallback(function callback(map) {
    const bounds = new window.google.maps.LatLngBounds();
    map.fitBounds(bounds);
    setMap(map)
  }, []);

  const onUnmount = useCallback(function callback(map) {
    setMap(null)
  }, []);

  const getPosition = () => {
    return new Promise((res, rej) => {
        navigator.geolocation.getCurrentPosition(res, rej);
    });
  }

  const setPositionFromGeolocation = async () => {
    const res = await   getPosition();
    const currentPosition = {
      lat: res.coords.latitude,
      lng: res.coords.longitude
    }
    setCurrentPosition(currentPosition);
  }


  useEffect(() => {
    setPositionFromGeolocation(); 
  },[setPositionFromGeolocation]);
  
    return (
       <LoadScript
      googleMapsApiKey={process.env.REACT_APP_GOOGLE_MAPS_API_KEY}
    >
      <GoogleMap
        mapContainerStyle={containerStyle}
        center={currentPosition}
        zoom={2}
        onLoad={onLoad}
        onUnmount={onUnmount}
      >
        {Array.from(trips).map(trip => {
            const position = {
              lng: trip.geometry.coordinates[0],
              lat: trip.geometry.coordinates[1]
            }
              return (
              <Marker 
                key={trip._id}
                position={position}
                onClick={() => onSelect(trip)}
                />
              )
            })
        }
        {
            selected.geometry && (
              <InfoWindow
              position={{
                lng: selected.geometry.coordinates[0],
                lat: selected.geometry.coordinates[1] 
              }}
              clickable={true}
              onCloseClick={() => setSelected({})}
            >
              <p>{selected.description}</p>
            </InfoWindow>
            )
         }
        
      </GoogleMap>
    </LoadScript>
      
    );
}

当我更改路线时,我在控制台中收到这些错误 我相信,这些错误正在发生,因为我使用navigator.geolocation.getCurrentPosition来获取具有async/await语法的当前用户 position。 除了我忘记添加的 try/catch 之外,有人可以指出我遗漏了什么或做错了什么吗?

原来,我忘了将trips prop添加到useEffect作为依赖项,它是从Landing组件传递到MapComponent组件的。 所以最终版本的useEffect应该是这样的:

useEffect(() => {
    setPositionFromGeolocation(); 
  },[trips]); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM