Карта Vue2-листовки не отображается должным образом в модальности BoostrapVue - PullRequest
2 голосов
/ 29 мая 2019

Вот моя проблема - карта листовки Vue2 неправильно отображается в модале BootstrapVue.

Вот как это выглядит визуально (оно должно показывать только океан)

enter image description here

<template>
  <div>
    <b-modal size="lg" :visible="visible" @hidden="$emit('clear')" title="Event details">
      <div class="foobar1">
        <l-map :center="center" :zoom="13" ref="mymap">
          <l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
          <l-marker :lat-lng="center"></l-marker>
        </l-map>
      </div>

      <template slot="modal-footer">
        <b-btn variant="danger" @click="deleteEventLocal(event.id)">Delete</b-btn>
      </template>
    </b-modal>
  </div>
</template>

<script>
import * as moment from "moment";
import { LMap, LMarker, LTileLayer } from "vue2-leaflet";
import { deleteEvent } from "./api";
import "vue-weather-widget/dist/css/vue-weather-widget.css";
import VueWeatherWidget from "vue-weather-widget";

export default {
  data() {
    return {
      center: L.latLng(event.latitude, event.longitude),
      url: "http://{s}.tile.osm.org/{z}/{x}/{y}.png",
      attribution:
        '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
    };
  },
  props: {
    visible: {
      type: Boolean
    },
    event: {
      required: true,
      type: Object
    }
  },
  methods: {
    async deleteEventLocal(id) {
      await deleteEvent(id);
      this.$emit("refresh");
      this.$emit("clear");
    }
  },
  components: {
    weather: VueWeatherWidget,
    LMap,
    LMarker,
    LTileLayer
  }
};
</script>

Как видите, нет никаких правил CSS, которые могли бы заставить карту выплеснуться за пределы модальной, как это происходит. Что странно.

Я задаю этот вопрос, чтобы ответить на него сам, так как раньше не мог найти решение.

1 Ответ

3 голосов
/ 29 мая 2019

Было 3 проблемы, из-за которых это происходило.

  1. Во-первых - я забыл загрузить листовку css в main.js - вот почему карта листовок была как-то вне модальной области.
//main.js
import '@babel/polyfill';
import Vue from 'vue';
import './plugins/bootstrap-vue';
import App from './App.vue';
import router from './router';
import store from './store';
//above imports not important to this answer

import 'leaflet/dist/leaflet.css'; //<--------------add this line

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app');
Теперь карта может исчезнуть.Установите ширину и высоту для контейнера компонента l-map.
<div class="foobar1">
  <l-map :center="center" :zoom="13">
    <l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
    <l-marker :lat-lng="center"></l-marker>
  </l-map>
</div>
<style lang="scss">
.foobar1 {
  width: 100%;
  height: 400px;
}
</style>
Теперь ваша карта будет отображаться в модальном режиме, но если вы переместите вид карты, вы увидите, что листовка не загружает квадраты карт во времени.Вы увидите что-то вроде этого: modal after fixing css but without invalidateSize() fix

Чтобы исправить это, создайте обработчик событий на b-modal для события @shown.

    <b-modal
      size="lg"
      :visible="visible"
      @hidden="$emit('clear')"
      title="Event details"
      @shown="modalShown"
    >

Я назвал мой modalShown.

Затем добавьте атрибут ref к вашему l-map.Я вызвал мой mymap.

        <l-map :center="center" :zoom="13" ref="mymap">
          <l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
          <l-marker :lat-lng="center"></l-marker>
        </l-map>

Затем создайте метод modalShown в методах Vue для вашего представления / компонента и вызовите invalidateSize() внутри.Я не знаю, почему это работает.invalidateSize является частью нативного API листовки ( vue2leaflet - просто оболочка ), и мы вызываем его в этом методе.

export default {
  data() {
   //some data here
  }

  methods: {
     modalShown() {
      setTimeout(() => {
        this.$refs.mymap.mapObject.invalidateSize(); 
      }, 100);
    }
  }
}

Теперь вседолжно быть в порядке - карта не должна выходить за пределы модальной, карта должна быть видимой (дух), и квадраты карты должны быть загружены, когда они находятся в теле карты.

Вот мой полный код,он содержит некоторые вещи, специфичные для моего приложения, но в целом он содержит все приведенные выше фрагменты кода.

...