Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import { useState, useEffect, useMemo, PropsWithChildren } from 'react'; import { useMapContext } from '@uiw/react-baidu-map-map'; import { useEnableProperties, useProperties, useVisiable, useEventProperties, usePortal, } from '@uiw/react-baidu-map-utils'; import { InfoWindowProps } from '.'; export interface UseInfoWindow extends PropsWithChildren<InfoWindowProps> {} export function useInfoWindow(props = {} as UseInfoWindow) { const { position, ...opts } = props; const { container, Portal } = usePortal(); const { container: title, Portal: PortalTitle } = usePortal(); const { map } = useMapContext(); const [infoWindow, setInfoWindow] = useState<BMap.InfoWindow>(); useMemo(() => { Iif (!infoWindow && map) { opts.title = title; const win = new BMap.InfoWindow(props.children ? container : opts.content || '', { ...(opts as BMap.InfoWindowOptions), }); setInfoWindow(win); } return () => { if (infoWindow) { infoWindow.restore(); } }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [map]); const [isOpen, setIsOpen] = useState(opts.isOpen === undefined ? true : opts.isOpen); useEffect(() => { if (map && BMap && infoWindow) { if (!isOpen) { map.closeInfoWindow(); } else if (position) { const point = new BMap.Point(position.lng, position.lat); map.openInfoWindow(infoWindow, point); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isOpen, infoWindow]); useEffect(() => { if (infoWindow) { infoWindow.setContent(props.children ? container : opts.content || ''); } }, [props.content, props.children, infoWindow, container, opts.content]); useEffect(() => { if (infoWindow) { infoWindow.setTitle(title); } }, [infoWindow, props.content, title]); useVisiable(infoWindow!, props); useEventProperties<BMap.InfoWindow, UseInfoWindow>(infoWindow!, props, [ 'Close', 'Open', 'Maximize', 'Restore', 'ClickClose', ]); useProperties<BMap.InfoWindow, UseInfoWindow>(infoWindow!, props, [ 'Width', 'Height', // 'Title', // 'Content', 'MaxContent', ]); useEnableProperties<BMap.InfoWindow, UseInfoWindow>(infoWindow!, props, ['CloseOnClick', 'Maximize', 'AutoPan']); return { /** * 信息窗口实例对象 */ infoWindow, /** * 更新 信息窗口实例对象 */ setInfoWindow, isOpen, setIsOpen, Portal, PortalTitle, }; } |