You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript中@vis.gl/react-google-maps刷新后Google Places API报错

解决@vis.gl/react-google-maps刷新后Places API报错问题

核心问题分析

你手动调用initGooglePlaces的时机与@vis.gl/react-google-maps的APIProvider脚本加载逻辑冲突:首次加载时脚本缓存命中,顺序正常;但刷新后缓存失效,手动初始化代码先执行,Places库尚未完全加载就绪,导致后续调用出现Cannot read properties of undefined (reading 'lH')错误。

解决方案步骤

1. 移除手动初始化,改用APIProvider管理Places库加载

删除initGooglePlaces(process.env.REACT_APP_GOOGLE_API_KEY || "");这一行,通过APIProvider的libraries参数指定加载places库,确保脚本加载顺序由官方库统一管理:

root.render(
  <React.StrictMode>
    <QueryClientProvider client={queryClient}>
      <GoogleAuthProviderWrapper>
        <APIProvider 
          apiKey={process.env.REACT_APP_GOOGLE_API_KEY || ""}
          libraries={['places']} // 新增:指定加载Places库
        >
          <App />
        </APIProvider>
      </GoogleAuthProviderWrapper>
    </QueryClientProvider>
  </React.StrictMode>
);

2. 确保Autocomplete组件在API就绪后渲染

在你的Autocomplete组件中,使用@vis.gl/react-google-maps提供的useJsApiLoader钩子,判断API加载状态后再渲染组件逻辑:

import { useJsApiLoader } from '@vis.gl/react-google-maps';

const AutocompletePlaces = () => {
  const { isLoaded } = useJsApiLoader({
    apiKey: process.env.REACT_APP_GOOGLE_API_KEY || "",
    libraries: ['places']
  });

  if (!isLoaded) {
    return <div>加载中...</div>; // 显示加载状态,避免提前渲染
  }

  // 渲染Autocomplete逻辑
  return (
    <input type="text" id="autocomplete" />
  );
};

3. 处理React Strict Mode的重复渲染影响(可选)

如果上述步骤仍未解决问题,可暂时关闭React Strict Mode测试:

root.render(
    <QueryClientProvider client={queryClient}>
      <GoogleAuthProviderWrapper>
        <APIProvider 
          apiKey={process.env.REACT_APP_GOOGLE_API_KEY || ""}
          libraries={['places']}
        >
          <App />
        </APIProvider>
      </GoogleAuthProviderWrapper>
    </QueryClientProvider>
);

Strict Mode会触发两次渲染,可能导致Google Maps API重复初始化,确认问题后再调整组件逻辑适配Strict Mode。

4. 清理Autocomplete实例残留

在Autocomplete组件中添加清理逻辑,避免刷新时全局对象冲突:

useEffect(() => {
  let autocomplete: google.maps.places.Autocomplete | null = null;
  if (isLoaded) {
    autocomplete = new google.maps.places.Autocomplete(
      document.getElementById('autocomplete') as HTMLInputElement
    );
  }

  return () => {
    if (autocomplete) {
      autocomplete.unbindAll(); // 清理事件监听
      autocomplete = null;
    }
  };
}, [isLoaded]);

内容的提问来源于stack exchange,提问作者Angel Villarruel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:28:25