UNPKG

@uiw/react-amap-info-window

Version:

用于在地图上弹出一个详细信息展示窗体,地图上只允许同时展示 `1` 个信息窗体。

79 lines 2.45 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose"; var _excluded = ["visiable", "visible", "position"]; import { useState, useMemo, useEffect, useLayoutEffect } from 'react'; import { useEventProperties, useSettingProperties, usePortal } from '@uiw/react-amap-utils'; import { useMapContext } from '@uiw/react-amap-map'; export var useInfoWindow = function useInfoWindow(props) { if (props === void 0) { props = {}; } var { visiable, visible, position } = props, other = _objectWithoutPropertiesLoose(props, _excluded); var { map } = useMapContext(); var [isOpen, setIsOpen] = useState(visiable); var [infoWindow, setInfoWindow] = useState(); var { container, Portal } = usePortal(); useLayoutEffect(() => { if (!AMap || !map) return; if (!infoWindow) { var positionCenter = map.getCenter(); if (props.children) { other.content = container; } var instance = new AMap.InfoWindow(_extends({}, other, { position: position || positionCenter })); setInfoWindow(instance); if (isOpen) { instance.open(map, position || positionCenter); } return () => { if (instance) { map && map.remove(instance); setInfoWindow(undefined); } }; } }, [map]); useEffect(() => { if (infoWindow) { infoWindow.setContent(props.children ? container : other.content || ''); } }, [props.children, container, other.content, infoWindow]); var visibleView = visible != null ? visible : visiable; useMemo(() => { if (isOpen !== visibleView && infoWindow && map) { setIsOpen(visibleView); if (visibleView) { var positionCenter = map.getCenter(); infoWindow.open(map, position || positionCenter); } else { infoWindow.close(); } } }, [visibleView, infoWindow]); useEffect(() => { if (!map || !infoWindow || !visibleView) return; var positionCenter = map.getCenter(); infoWindow.open(map, position || positionCenter); }, [position]); useSettingProperties(infoWindow, props, ['Content', 'Anchor', 'Size']); useEventProperties(infoWindow, props, ['onOpen', 'onClose', 'onChange']); return { isOpen, setIsOpen, infoWindow, setInfoWindow, InfoWindowPortal: Portal }; };