UNPKG

@pansy/react-mapbox-gl

Version:

🌍 基于 Mapbox GL 封装的 React 组件库

42 lines (41 loc) 1.16 kB
// src/components/Layer/layer.tsx import { useRef, useState, useMemo, useEffect } from "react"; import { createLayer, updateLayer } from "./utils"; import { useMap } from "../../hooks/useMap"; import { isStyleLoaded } from "../../utils/isStyleLoaded"; var layerCounter = 0; var Layer = (props) => { const { map } = useMap(); const propsRef = useRef(props); const [, setStyleLoaded] = useState(0); const id = useMemo(() => props.id || `jsx-layer-${layerCounter++}`, []); useEffect(() => { if (map) { const forceUpdate = () => setStyleLoaded((version) => version + 1); map.on("styledata", forceUpdate); forceUpdate(); return () => { map.off("styledata", forceUpdate); if (isStyleLoaded(map) && map.getLayer(id)) { map.removeLayer(id); } }; } return void 0; }, [map]); const layer = isStyleLoaded(map) && map.getLayer(id); if (layer) { try { updateLayer(map, id, props, propsRef.current); } catch (error) { console.warn(error); } } else { createLayer(map, id, props); } propsRef.current = props; return null; }; export { Layer };