简体   繁体   English

Vue leaflet 在构建应用程序时不起作用

[英]Vue leaflet doesn't work when building app

I'm currently creating a vue3 cli app that uses vue-leaflet (the vue3 compatible version)我目前正在创建一个使用vue-leaflet (vue3 兼容版本)的 vue3 cli 应用程序

Everything works great on my local dev environment but once my app is built the map doesn't load, even when I resize like this thread explains well.一切都在我的本地开发环境中运行良好,但是一旦构建了我的应用程序,map 就不会加载,即使我像这个线程解释的那样调整大小也是如此。

I tried using the leafletObject.invalidateSize() method but nothing changed.我尝试使用leafletObject.invalidateSize()方法,但没有任何改变。

My map is a component called using a v-if on first call (switch between a list view and the map) and a v-show once it has been initialized我的 map 是第一次调用时使用 v-if 调用的组件(在列表视图和地图之间切换)和初始化后的 v-show

  <transition name="fade" mode="out-in">
    <Map v-if="mapInit"
         v-show="(!mobileView && !listing) ||
          (mobileView && !listing && !getFiltresMobile)"
         :liste="getFilteredList"/>
  </transition>

Here is what I get on my dev version when I use npm run serve这是我在使用npm run serve时在我的开发版本上得到的在此处输入图像描述

Here is the result on the prod version这是产品版本的结果传单产品

Here is the relevant part of my code, I can add more if you think more code needs to be shown这是我的代码的相关部分,如果您认为需要显示更多代码,我可以添加更多

<template>

  <div id="map">
    <l-map v-if="!loading" :style="mapHeight" :zoom="zoom" :center="centerValue" :options="{tap : false}" ref="map">
      <l-tile-layer :url="url"></l-tile-layer>
      <l-marker v-for="(marqueur) in mapData" :key="marqueur.id" :visible="isFiltered(marqueur)" :lat-lng="marqueur.latLng" :ref="setMarkerRefs" @click="markerClick(marqueur.latLng)">
        <l-icon :icon-url="checkActive(marqueur.latLng)" :icon-size="[30 , 37]" :popup-anchor="popupUpPosition" :icon-anchor="[15, 37]"/>
        <l-popup :options="popupoptions">
          <MarqueurPopup :contenu="marqueur"/>
        </l-popup>
      </l-marker>
    </l-map>
    <Loader v-if="loading"/>
  </div>

</template>

JS JS

<script>
import "leaflet/dist/leaflet.css"
import { LMap , LTileLayer , LPopup , LMarker , LIcon } from "@vue-leaflet/vue-leaflet";

export default {
  name: "Map",
  props : ['liste'],
  components: {
    Loader,
    MarqueurPopup,
    LMap,
    LTileLayer,
    LMarker,
    LPopup,
    LIcon,
  },
  data() {
    return {
      url: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png',
      zoom: 13,
      mapData : [],
      markerRefs : [],
      markerRefsDef : [],
      popupoptions : {
        maxWidth : 1000,
        minWidth : 300,
        closeButton : false,
      }
    };
  },

  beforeMount() {
    this.initMap()
  },
  mounted() {
    setTimeout( () => {
      console.log(this.$refs.map.leafletObject) // returns the leaflet map objects
      this.$refs.map.leafletObject.invalidateSize(); // no error but does nothing 
    }, 1000);
  },
  computed : {
    popupUpPosition() {
      if (window.innerWidth < 768) {
        return [0, 74]
      }
      return [0, -37]
    },
    mapHeight() {
      let colonneValue = window.innerWidth / 12;
      if (colonneValue < 115) {
        colonneValue = 115
      }
      let height = window.innerHeight - colonneValue;

      return {height : height+'px'}
    },
  },
  methods : {
    async initMap() {
      this.$store.commit('changeLoading' , true);
      this.mapData = []
      this.mapData = this.getFilteredList
      this.$store.commit('changeLoading' , false);
    },
  }
}
</script>

Is there a way to check if the invalidateSize() methods triggers?有没有办法检查invalidateSize()方法是否触发? My console.log get no errors but nothing changes so maybe it doesn't trigger the method?我的 console.log 没有错误,但没有任何变化,所以它可能不会触发该方法?

Rather looks like the Leaflet CSS is incorrectly loaded in your production bundle: tiles are scrambled up, no zoom and attribution controls.看起来 Leaflet CSS 错误地加载到您的生产包中:拼贴被打乱,没有缩放和属性控制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM