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

@react-google-maps/api切换地图后Infobox组件报错求助

问题解决:切换地图/列表视图后点击标记触发Google Maps错误

问题分析

切换地图/列表视图时,InsMap组件会被完全卸载并重新挂载。之前打开的InfoBox可能残留对旧地图实例的引用,或者组件状态未重置,导致重新渲染时尝试将InfoBox绑定到已销毁的地图对象,从而触发setMap参数无效的错误。

修复方案

1. 切换视图时重置地图相关状态

在InsPage的视图切换方法中,主动重置地图关联状态,确保组件重新挂载时处于初始状态:

// InsPage组件中修改btnHandler
const btnHandler = () => {
    setMapShow(!mapShow);
    // 切换视图时重置选中标记与信息框状态(需在useInsStore中补充对应方法)
    setSelectedMarker(null);
    setIsInfoBoxOpen(false);
};

2. InsMap组件卸载时清理InfoBox引用

添加卸载钩子,清理InfoBox与旧地图的关联,避免残留无效引用:

// InsMap组件中新增useEffect
useEffect(() => {
    return () => {
        // 组件卸载时关闭并解绑InfoBox
        if (infoBoxRef.current) {
            infoBoxRef.current.close();
            infoBoxRef.current.setMap(null);
        }
        // 重置本地状态
        setIsInfoBoxOpen(false);
        setSelectedMarker(null);
    };
}, []);

3. 优化onMarkerClick的依赖项

修正onMarkerClick的依赖数组,避免引用旧的地图实例:

const onMarkerClick = useCallback(
    (event) => {
        setSelectedMarker(event);
        setIsInfoBoxOpen(true);
        event && setCenter(event.position);
    },
    [] // 移除map依赖,此处未直接操作地图实例
);

4. 确保InfoBox仅在地图加载完成后渲染

修改InfoBox的渲染条件,增加地图实例存在的判断:

{isInfoBoxOpen && selectedMarker && map && selectedMarker?.options?.type !== 'target' && (
    <InfoBox
        options={{
            zIndex: 600,
            pixelOffset: new window.google.maps.Size(-100, 0)
        }}
        ref={infoBoxRef}
        onCloseClick={() => {
            setIsInfoBoxOpen(false);
            setSelectedMarker(null);
        }}
        position={selectedMarker.position}
        zIndex={700}
    >
        <InsInfoCard selectedMarker={selectedMarker}></InsInfoCard>
    </InfoBox>
)}

5. 优化mapRef的状态管理

修正onLoadMap的依赖项,避免不必要的重渲染:

const onLoadMap = useCallback(
    (mapFromLib: google.maps.Map<Element>) => {
        mapRef.current = mapFromLib;
        setMap(mapFromLib);
    },
    [] // 移除map依赖
);

核心原理

通过组件卸载时清理InfoBox与旧地图的关联、切换视图时重置状态,确保每次重新挂载地图组件时,所有状态和引用都处于初始状态,避免绑定到已销毁的地图实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:12:07