Javascript 从其他组件切换地图图层可见性
首先,我是一名设计专业的学生,我使用Vue.js为我的高级项目制作原型。所以这不是真正的工作项目。只是一些日记应用程序的原型 我的问题是,我构建了一个具有平铺层的地图组件 在平铺层上,我渲染了一个GeoJSON文件,它有两个坐标对象 我还有一个datepicker组件,它通过EventBus发出值 我的目标是:当datepicker发出特定值时,关闭一个Javascript 从其他组件切换地图图层可见性,javascript,vue.js,vuejs2,leaflet,Javascript,Vue.js,Vuejs2,Leaflet,首先,我是一名设计专业的学生,我使用Vue.js为我的高级项目制作原型。所以这不是真正的工作项目。只是一些日记应用程序的原型 我的问题是,我构建了一个具有平铺层的地图组件 在平铺层上,我渲染了一个GeoJSON文件,它有两个坐标对象 我还有一个datepicker组件,它通过EventBus发出值 我的目标是:当datepicker发出特定值时,关闭一个,然后打开另一个 有一个参数,该参数为:可见,可显示或隐藏:可见从GeoJSON对象获取参数datepicker为更改GeoJSON参数发出一些
,然后打开另一个
有一个参数,该参数为:可见,可显示或隐藏<代码>:可见
从GeoJSON对象获取参数datepicker
为更改GeoJSON参数发出一些布尔值。GeoJSON参数会更改,但不会在地图中呈现
我认为,这是因为没有重新渲染贴图组件
我的地图组件如下所示:
<template>
<div v-if="refresh" id="MapView2">
<i class="material-icons geoLocate" v-on:click="geoLoc">location_searching</i>
<l-map :zoom="zoom" :options="{ zoomControl: false }" class="map" :center="center">
<l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
<l-geo-json :visible="yesterday.day" :geojson="bus.geojson" :options="bus.options"></l-geo-json>
<l-geo-json :visible="today.day" :geojson="today.geojson" :options="today.options"></l-geo-json>
</l-map>
</div>
</template>
<script>
import Vue from 'vue';
import Leaflet from 'leaflet';
import L from 'leaflet';
import { LMap, LTileLayer, LGeoJson } from 'vue2-leaflet';
import PopupContent from './GeoJson2Popup';
import { data, EventBus2 } from '../assets/geojson/sample-geojson.js';
export default {
name: 'MapView2',
components: {
LMap,
LTileLayer,
LGeoJson,
},
data(){
return {
zoom: 13,
center: {
lat: '',
lng: '',
},
url:'https://api.mapbox.com/styles/v1/mapbox/light-v9/tiles/256/{z}/{x}/{y}?access_token=...',
attribution: '',
yesterday: {
geojson: data.yesterday,
day: data.yesterday.visible,
options: {
onEachFeature: onEachFeature,
color: "#45B8FF",
fillOpacity: 0.8
}
},
today: {
geojson: data.today,
day: data.today.visible,
options: {
onEachFeature: onEachFeature,
color: "#45B8FF",
fillOpacity: 0.8
}
},
}
},
methods: {
geoLoc() {
navigator.geolocation.getCurrentPosition(position => {
this.position = position.coords;
this.center.lat = position.coords.latitude
this.center.lng = position.coords.longitude
this.zoom = 25
console.log(position.coords)
})
}
},
beforeCreate() {
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(position => {
this.isLoading = false
this.position = position.coords;
this.center.lat = position.coords.latitude
this.center.lng = position.coords.longitude
console.log(position.coords)
})
}
},
mounted() {
EventBus2.$on('mapDay', pickerValue => {
switch (pickerValue) {
case data.today.id:
data.yesterday.visible = true;
data.today.visible = false;
break;
case data.yesterday.id:
data.yesterday.visible = false;
data.today.visible = true;
break;
}
});
},
};
</script>
如您所见,日期选择器以MMDD
格式发出一些值。Switch语句通过id
检查GeoJSON数据中的值。如果匹配,请更改visible
属性。当datepicker发出时,它实际上发生了更改
但它不会在地图中渲染(GeoJSON层不会相应地更改可见性)
我该怎么做?我应该使用
手表
或类似的东西吗?如果是,我如何使用它?您只需直接更改实例数据即可
为了清楚起见,我将像从geojson.js
文件导入data2
一样进行操作。把两者都称为同一个可能是你感到困惑的一个原因
从“../assets/geojson/sample geojson.js”导入{data as data2,EventBus2};
GeoJSON层可见性没有动态更改的原因是,您使用data2
中的信息正确初始化了实例data
和day
属性,但这不会将它们动态绑定到data2
中的未来修改
因此,最简单的方法是在“mapDay”
事件侦听器中切换实例数据
和日期
属性,而不是数据2中的信息
EventBus2.$on('mapDay',pickerValue=>{
开关(选择器值){
案例数据2.today.id:
这是昨天的事;
this.today.day=假;
打破
案例数据2.dun.id:
this.昨日.day=假;
this.today.day=true;
打破
}
});
您还可以切换数据
和数据2
,以防数据2
也同步,例如,如果您在另一个组件中使用它。请注意,这样的策略很脆弱,因为在另一个组件中更改data2
,在这里没有效果
另一方面,您可以简化可见性切换逻辑,只需将pickerValue
存储在实例数据中,并将其与中的geojson.id
进行比较:visible
属性绑定表达式::visible=“pickerValue===昨日.geojson.id”
代码示例:
Vue.component('map-view-2'{
模板:“#地图视图-2”,
组成部分:{
“l-map”:Vue2lapper.LMap,
“l-tile-layer”:Vue2layer.LTileLayer,
“l-geo-json”:Vue2slaple.LGeoJson,
},
数据(){
返回{
pickerValue:'0520',
url:'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
属性:“©;参与者”,
昨天:{
geojson:data2.0昨天,
},
今天:{
geojson:data2.today,
},
};
},
安装的(){
此.$root.$on('mapDay',pickerValue=>{
this.pickerValue=pickerValue;
});
},
});
//为了演示,使用了虚拟的日期选择器组件。
Vue.组件('日期选择器'{
模板:“#日期选择器”,
方法:{
handleInputChange(事件){
这是.$root.$emit('mapDay',event.target.value);
},
},
});
常数数据2={
今天:{
“类型”:“FeatureCollection”,
“id”:“0520”,
“特点”:[{
“类型”:“功能”,
“几何学”:{
“类型”:“点”,
“坐标”:[2.34,48.86]//左
},
}],
},
昨天:{
“类型”:“FeatureCollection”,
“id”:“0519”,
“特点”:[{
“类型”:“功能”,
“几何学”:{
“类型”:“点”,
“坐标”:[2.35,48.86]//右
},
}],
},
};
新Vue({
el:“#应用程序”,
});代码>
选择一个日期
今天0520
昨天5点19分
没有一个
查看组件中的geojson·l-geo-json·当值更改时,应该进行刷新yourself@jacky如何实现手表部分。事实上,我不是一个开发人员,我只是一个困惑的设计学生,有一个明确的截止日期:/起初,我没有得到你的答案,但当我第二次阅读你的答案时,我意识到我在这个问题上写错了geojson.js。我编辑了它,也许有一个变化,你可以再看看我的问题。很抱歉,我浪费了你的时间。顺便说一句,我实现了你的答案,但我得到了引用错误:数据未定义,一些属性或方法“foo”未在实例上定义,而是在渲染过程中被引用。
错误。如果确实将导入重命名为data2
,显然,您也需要在初始化中重命名:geojson:data2。昨天,我犯了一个巨大的错误。但是case.data.dun.id
应该是case.data.day.id:
我现在改了,但是我真的很惭愧。很抱歉。我正在简化组件,以便在stackoverflow中询问答案。但有时变量名称会令人困惑。这次我忘了这个,对不起。
import Vue from 'vue';
export const EventBus2 = new Vue();
export const data = {
today: {
"type": "FeatureCollection",
"id": "0520",
"visible": false,
"features": [ // geojson features and coordinates ]
},
yesterday: {
"type": "FeatureCollection",
"id": "0520",
"visible": false,
"features": [ // geojson features and coordinates ]
}
}