@uiw/react-amap-info-window
Version:
用于在地图上弹出一个详细信息展示窗体,地图上只允许同时展示 `1` 个信息窗体。
79 lines • 2.45 kB
JavaScript
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
};
};