Skip to content

Commit

Permalink
fixes layer and source deconstruction
Browse files Browse the repository at this point in the history
  • Loading branch information
razorness committed Sep 15, 2021
1 parent 500704e commit 8bdce94
Show file tree
Hide file tree
Showing 14 changed files with 54 additions and 70 deletions.
6 changes: 3 additions & 3 deletions dev/serve.vue
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

<mgl-geo-json-source source-id="geojson" :data="geoJsonSource.data">
<mgl-line-layer
v-if="geoJsonSource.show"
v-if="geoJsonSource.show.value"
layer-id="geojson"
:layout="geoJsonSource.layout"
:paint="geoJsonSource.paint"
Expand Down Expand Up @@ -113,7 +113,7 @@
buttonIcon : mdiCursorDefaultClick,
markerCoordinates: [ 13.377507, 52.516267 ],
geoJsonSource : {
show : true,
show : ref(true),
data : {
type : 'FeatureCollection',
features: [
Expand Down Expand Up @@ -171,7 +171,7 @@
},
mounted() {
setTimeout(() => (this.markerCoordinates = [ 13.377507, 42.516267 ]), 5000);
// setInterval(() => (this.geoJsonSource.show = !this.geoJsonSource.show), 1000);
setInterval(() => (this.geoJsonSource.show.value = !this.geoJsonSource.show.value), 1000);
}
});
</script>
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "vue-maplibre-gl",
"version": "1.0.0-beta.21",
"version": "1.0.0-beta.22",
"description": "Vue 3 plugin for maplibre-gl",
"keywords": [
"vue",
Expand Down
10 changes: 7 additions & 3 deletions src/components/layers/background.layer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { BackgroundLayer, BackgroundLayout, BackgroundPaint } from 'maplibre-gl';
import { genLayerOpts, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, inject, PropType, warn, watch } from 'vue';
import { createCommentVNode, defineComponent, inject, onBeforeUnmount, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';

Expand Down Expand Up @@ -32,12 +32,16 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
function removeLayer() {
if (isLoaded.value) {
map.value.removeLayer(props.layerId);
}
});
}

registry.registerUnmountHandler(props.layerId, removeLayer);
onBeforeUnmount(() => {
removeLayer();
});

},
render() {
Expand Down
9 changes: 2 additions & 7 deletions src/components/layers/circle.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { CircleLayer, CircleLayout, CirclePaint } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
9 changes: 2 additions & 7 deletions src/components/layers/fill.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FillLayer, FillLayout, FillPaint } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
9 changes: 2 additions & 7 deletions src/components/layers/fillExtrusion.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FillExtrusionLayout, FillExtrusionPaint, LineLayer } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
9 changes: 2 additions & 7 deletions src/components/layers/heatmap.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { HeatmapLayer, HeatmapLayout, HeatmapPaint } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
9 changes: 2 additions & 7 deletions src/components/layers/hillshade.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { HillshadeLayer, HillshadeLayout, HillshadePaint } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
9 changes: 2 additions & 7 deletions src/components/layers/line.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { LineLayer, LineLayout, LinePaint } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
9 changes: 2 additions & 7 deletions src/components/layers/raster.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { RasterLayer, RasterLayout, RasterPaint } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
19 changes: 18 additions & 1 deletion src/components/layers/shared.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { defineComponent, PropType, unref, VNode } from 'vue';
import { defineComponent, onBeforeUnmount, PropType, Ref, unref, VNode } from 'vue';
import { AnySourceData, BackgroundLayer, Layer, Map, MapLayerEventType } from 'maplibre-gl';
import { ComponentInternalInstance } from '@vue/runtime-core';
import { SourceLayerRegistry } from '@/components/sources/sourceLayer.registry';

const sourceOpts: Array<keyof (Omit<BackgroundLayer, 'source-layer'> & { sourceLayer?: string })> = [
'metadata', 'ref', 'source', 'sourceLayer', 'minzoom', 'maxzoom', 'interactive', 'filter', 'layout', 'paint'
Expand Down Expand Up @@ -64,3 +66,18 @@ export function unregisterLayerEvents(map: Map, layerId: string, vn: VNode) {
}
}
}

export function handleDispose(isLoaded: Ref<boolean>, map: Ref<Map>, ci: ComponentInternalInstance, props: { layerId: string }, registry: SourceLayerRegistry) {
function removeLayer() {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
}

registry.registerUnmountHandler(props.layerId, removeLayer);
onBeforeUnmount(() => {
registry.unregisterUnmountHandler(props.layerId);
removeLayer();
});
}
9 changes: 2 additions & 7 deletions src/components/layers/smybol.layer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SymbolLayer, SymbolLayout, SymbolPaint } from 'maplibre-gl';
import { genLayerOpts, registerLayerEvents, Shared, unregisterLayerEvents } from '@/components/layers/shared';
import { genLayerOpts, handleDispose, registerLayerEvents, Shared } from '@/components/layers/shared';
import { createCommentVNode, defineComponent, getCurrentInstance, inject, PropType, warn, watch } from 'vue';
import { componentIdSymbol, isLoadedSymbol, mapSymbol, sourceIdSymbol, sourceLayerRegistry } from '@/components/types';
import { getSourceRef } from '@/components/sources/shared';
Expand Down Expand Up @@ -34,12 +34,7 @@ export default defineComponent({
}
}, { immediate: true });

registry.addUnmountHandler(() => {
if (isLoaded.value) {
unregisterLayerEvents(map.value, props.layerId, ci.vnode);
map.value.removeLayer(props.layerId);
}
});
handleDispose(isLoaded, map, ci, props, registry);

},
render() {
Expand Down
1 change: 1 addition & 0 deletions src/components/sources/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export function bindSource<T extends object, O extends object>(map: Ref<GlMap>,
emitter.on('styleSwitched', resetSource);

return onBeforeUnmount(() => {
console.log('UMOUNT SOURC')
if (isLoaded.value) {
registry.unmount();
map.value.removeSource(props.sourceId);
Expand Down
14 changes: 8 additions & 6 deletions src/components/sources/sourceLayer.registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@ export type SourceLayerRegistryHandler = () => void

export class SourceLayerRegistry {

private unmountHandlers: SourceLayerRegistryHandler[] = [];
private unmountHandlers = new Map<string, SourceLayerRegistryHandler>();

addUnmountHandler(handler: SourceLayerRegistryHandler) {
this.unmountHandlers.push(handler);
registerUnmountHandler(id: string, handler: SourceLayerRegistryHandler) {
this.unmountHandlers.set(id, handler);
}

unregisterUnmountHandler(id: string) {
this.unmountHandlers.delete(id);
}

unmount() {
for (let i = 0, len = this.unmountHandlers.length; i < len; i++) {
this.unmountHandlers[ i ]();
}
this.unmountHandlers.forEach((h) => h());
}

}

0 comments on commit 8bdce94

Please sign in to comment.