当前位置: 首页 > 知识库问答 >
问题:

在调整屏幕大小之前,无法在具有VueJs和传单的DIV上显示所有地图

楚浩然
2023-03-14

我正在使用VueJS和传单来显示地图的特殊定位。如文档中所述,我添加了关于index.html的css传单。

link rel=“stylesheet”href=“https://unpkg.com/leaflet@1.2.0/dist/leaflet.css”>

但我只有地图的一部分。我必须改变屏幕的大小,以拥有所有的地图与标记。

这是我实现映射的vue(imap.vue)

<template>
  <div id="professionnel">
    <b-row>
     <b-tabs>
        <b-tab title="A" >
            <div>
                <b-col class="col-12">
                    <div>Où nous joindre</div>
                </b-col>
            </div>
        </b-tab>
       <b-tab title="B">
            <div class="tab-content-active" >
                <b-col class="col-6">
                    <div>heure</div>
                </b-col>
                <b-col class="col-6 data_map">
                    <iMap1></iMap>
                </b-col>
            </div>
        </b-tab>
      </tabs>
    </b-row>
  </div>
</template>

<script>
import iMap1 from './iMap1'

export default {
  name: 'professionnel',
  components: {
    iMap1
  },
  data() {
    return {}
  }
</script>

这是地图的vue(imap.vue)

    <template>
        <div id="imap1" class="map" >
        </div>
    </template>

    <script>

    import leaflet from 'leaflet'

    export default {
      name: 'imap1',
      components: {
        leaflet
      },
      data() {
        return {
            professionnel: {},
            map1: null,
            tileLayer: null,
        }
      },
        methods: {
        initMap() {
            this.map1 = L.map('imap1').setView([47.413220, -1.219482], 12)
            this.tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
                      //'https://cartodb-basemaps-{s}.global.ssl.fastly.net/rastertiles/voyager/{z}/{x}/{y}.png',
            {
                maxZoom: 18,
                center: [47.413220, -1.219482],
                attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>, &copy; <a href="https://carto.com/attribution">CARTO</a>',
            }).addTo(this.map1)

 L.marker([47.413220, -1.219482]).addTo(this.map1).bindPopup('name')
                        .openPopup()

 this.map1.invalidateSize()

  })
 },
},
created () {
 this.initMap()
}

}
</script>

共有1个答案

史俊德
2023-03-14

使用挂载的生命周期钩子,而不是创建的生命周期钩子。

created通常是订阅某些数据/启动某些异步进程,而mounted则是在组件的DOM准备就绪时(但不一定插入到页面IIRC中)。

然后,如“数据切换选项卡不下载传单地图”中所述,在包含地图容器的选项卡打开后,您必须使用invalidateSize,也就是说,您必须侦听一个事件,该事件表示您的用户已经打开了该选项卡。

在Bootstrap-Vue的情况下,您有 “input”事件,但该事件仅在用户单击选项卡时发出信号。但后者仍未开通。因此,在调用invalidateSize之前,必须给它一个短的延迟(通常使用settimeout):

null

Vue.use(bootstrapVue);

Vue.component('imap', {
  template: '#imap',
  methods: {
    resizeMap() {
      if (this.map1) {
        this.map1.invalidateSize();
        // Workaround to re-open popups at their correct position.
        this.map1.eachLayer((layer) => {
          if (layer instanceof L.Marker) {
            layer.openPopup();
          }
        });
      }
    },
    initMap() {
      this.map1 = L.map('imap1').setView([47.413220, -1.219482], 12)
      this.tileLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        maxZoom: 18,
        center: [47.413220, -1.219482],
        attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
      }).addTo(this.map1)

      L.marker([47.413220, -1.219482]).addTo(this.map1).bindPopup('name')
        .openPopup() // Opening the popup while the map is incorrectly sized seems to place it at an incorrect position.
    },
  },
  mounted() {
    this.initMap()
  },
});

new Vue({
  el: '#app',
  methods: {
    checkMap(tab_index) {
      if (tab_index === 1) {
        // Unfortunately the "input" event occurs when user clicks
        // on the tab, but the latter is still not opened yet.
        // Therefore we have to wait a short delay to allow the
        // the tab to appear and the #imap1 element to have its final size.
        setTimeout(() => {
          this.$refs.mapComponent.resizeMap();
        }, 0); // 0ms seems enough to execute resize after tab opens.
      }
    }
  },
});
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet-src.js" integrity="sha512-IkGU/uDhB9u9F8k+2OsA6XXoowIhOuQL1NTgNZHY1nkURnqEGlDZq3GsfmdJdKFe1k1zOc6YU2K7qY+hF9AodA==" crossorigin=""></script>
<script src="https://unpkg.com/vue@2"></script>
<link rel="stylesheet" href="https://unpkg.com/bootstrap@4/dist/css/bootstrap.css" />
<link rel="stylesheet" href="https://unpkg.com/bootstrap-vue@2.0.0-rc.11/dist/bootstrap-vue.css" />
<script src="https://unpkg.com/bootstrap-vue@2.0.0-rc.11/dist/bootstrap-vue.js"></script>

<div id="app">
  <!-- https://bootstrap-vue.js.org/docs/components/tabs -->
  <b-tabs @input="checkMap">
    <b-tab title="First Tab" active>
      <br>I'm the first fading tab
    </b-tab>
    <b-tab title="Second Tab with Map">
      <imap ref="mapComponent"></imap>
    </b-tab>
  </b-tabs>
</div>

<template id="imap">
  <div id="imap1" style="height: 130px;"></div>
</template>
 类似资料:
  • 我有一个JFrame,其中包含一个面板。我还向面板添加了。到目前为止,我所做的是在我的框架上使用来对调整窗口大小做出反应。 下面是我的代码片段: 当更改框架的大小时,的大小可以完全调整。但是当我最大化我的框架,图表面板不会改变它的大小!它保持在最大化之前的时刻。因此,当我再次“取消最大化”我的框架时,图表面板被最大化,这导致了问题,图表将不再适合图表面板。所有这些调整尺寸的事情似乎都“落后一步”.

  • 就像上面提到的图像一样。但我将背景色黑色添加到默认,红色添加到19201080。对于19201080个像素分辨率不带红色的模拟器,我这样做是为了在Android中为不同的屏幕尺寸创建不同的UI

  • 我想在我的应用程序中使用背景图像。但是我对不同的屏幕大小感到困惑。我发现了这个问题: Android:支持所有设备的背景图像大小(以像素为单位) 但在回答中他说但Lg G3是和屏幕分辨率: 我需要一个路线图。所有屏幕的图像尺寸应该是多少?(mdpi、hdpi、xhdpi等)

  • 谁能引导我过去吗?也许我的效用不好?

  • 我一直在努力跟进https://github.com/airbnb/react-native-maps教程我尝试了他们说的一切,但在我的android studio模拟器上得到了一个空白屏幕。 我的代码: AndroidManifest。xml文件: