7

这是我的问题 - Vue2 传单地图无法在 BootstrapVue 模态中正确呈现。

这是它在视觉上的样子(它应该只显示海洋)

在此处输入图像描述

<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 规则可以使地图像它那样溢出到模态框之外。这很奇怪。

我有点问这个问题要自己回答,因为我以前找不到解决方案。

4

3 回答 3

23

发生了 3 个问题。

1.首先 - 我忘记将传单 css 加载到其中main.js- 这就是为什么传单地图以某种方式超出了模态的原因。

//src/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

new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app');

2.现在地图可能会消失。l-map在组件的容器上设置宽度和高度。我使用了一个类,但您可以使用 style="" 等。

<div class="foobar1"> <!-- <--- Add a class on l-map's container -->
  <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 { /* <--- class we added above */
    width: 100%;
    height: 400px;
  }
</style>

3.现在您的地图将在模态中呈现,但是如果您移动地图的视图,您会看到传单没有及时下载地图的方块。你会看到这样的东西:

修复 css 但没有 invalidateSize() 修复后的模态

要解决这个问题:

  • b-modal为事件创建一个事件处理程序@shown

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

    我打电话给我modalShown的。

  • 然后,将ref属性添加到您的l-map. 我打电话给我mymap的。

    <l-map :center="center" :zoom="13" ref="mymap"> <!-- ref attribute added to l-map -->
      <l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
      <l-marker :lat-lng="center"></l-marker>
    </l-map>
    
  • modalShown然后,在 Vue 方法中为您的视图/组件创建一个方法并在其中调用invalidateSize()

    export default {
      data() {
       //some data here
      }
    
      methods: {
         modalShown() {
          setTimeout(() => {
            //mapObject is a property that is part of leaflet
            this.$refs.mymap.mapObject.invalidateSize(); 
          }, 100);
        }
      }
    }
    

现在一切都应该没问题:

  • 地图不应溢出模态
  • 地图应该是可见的(呃)
  • 在地图正文中应下载地图方块

这是我的完整代码,它包含一些特定于我的应用程序的内容,但总的来说它包含上面的所有代码片段。

于 2019-05-29T15:35:38.860 回答
3

Artur Tagisow 答案的补充

如果您的地图位于子组件中,您也可以对父组件使用这种方法。

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

  methods: {
     modalShown() {
      setTimeout(() => {
        window.dispatchEvent(new Event("resize"));
      }, 100);
    }
  }
}
于 2020-10-04T19:35:03.397 回答
0

对于 vue.js 和 nuxt.js 开发人员,可能是因为使用了v-showv-if !在您的情况下显示引导模式没有发生任何事情,但不要担心您唯一需要做的就是仅使用客户端(就像ssr 但对于新版本的 js 框架,如 nuxt 或 vue):

<client-only>
<div id="bootstrapModal">
<div id="map-wrap" style="height: 100vh">
   <l-map :zoom=13 :center="[55.9464418,8.1277591]">
     <l-tile-layer url="http://{s}.tile.osm.org/{z}/{x}/{y}.png"></l-tile-layer>
     <l-marker :lat-lng="[55.9464418,8.1277591]"></l-marker>
   </l-map>
 </div>
</div>
</client-only>

ps:如果仍然没有加载到iphone浏览器中,可能是因为地理位置

于 2021-11-19T07:11:00.437 回答