@pansy/react-mapbox-gl
Version:
🌍 基于 Mapbox GL 封装的 React 组件库
42 lines (41 loc) • 1.16 kB
JavaScript
// 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
};