扩展自定义组件
DOM 组件
Amap
组件是一个容器,你可以把自己的其他 DOM 组件作为<Amap>...</Amap>
的子组件,从而实现沉浸式的地图 App。
// example
return (
<Amap>
<div
className="searchbox"
style={{ position: 'absolute', left: 0, top: 0 }}
>
... 你的搜索框UI
</div>
</Amap>
);
如果你的组件中需要访问所属的AMap.Map
地图实例,可以使用useAmap
hooks。
// example
import { useAmap } from '@amap/amap-react';
const map = useAmap(); // AMap.Map | undefined
地图组件
如果你需要基于AMap JSAPI
开发更多复杂的地图组件,可以用useAmapComponent
来引入更多的地图组件
例如,基于下面的代码模式,你可以实现一个自己的Heatmap
组件。
// example
import { useEffect } from 'react';
import { useAmapComponent } from '@amap/amap-react';
export default function MyHeatmap(props) {
const heatmap = useAmapComponent(
(AMap, map) => {
// 初始化热力图
const heatmap = new AMap.HeatMap(map);
return heatmap;
},
['AMap.HeatMap'], // 加载AMap插件
);
const { dataset } = props;
useEffect(() => {
if (!heatmap) return;
// 响应数据更新
heatmap.setDataSet(set);
}, [heatmap, dataset]);
}
完整示例请看热力图 HeatMap
进阶用法
如果你需要基于AMap JSAPI
开发更多复杂的地图组件,可以基于更原始的 hooks API 来实现,例如
// example
import { useEffect } from 'react';
import { useAmap, usePlugins } from '@amap/amap-react';
export default function MyHeatmap(props) {
const map = useAmap();
const AMap = usePlugins(['AMap.Heatmap']);
useEffect(() => {
if (map && AMap) {
// 这里执行初始化逻辑
const heatmap = new AMap.Heatmap(...);
map.add(heatmap);
return () => {
// 这里执行销毁逻辑
map.remove(heatmap);
};
}
}, [map, AMap]);
return null;
}
完整示例请看GLCustomLayer + regl