Как объяснено в Вкладка переключения данных не загружает карту Leaflet , проблема вызвана тем, что контейнер вашей карты еще не имеет своего полного размера при инициализации.Вы можете понять это легче, если ваша карта была на изначально скрытой вкладке (например, на вкладке 2).
Что касается вашей изначально активной вкладки (т.е. вкладки 1), вполне вероятно, что Buefy / Bulma по-прежнему занимаетнекоторое время для раскрытия содержимого вкладки.
Поскольку после завершения перехода вкладки события не происходит, вам нужно подождать, пока продолжительность перехода не будет вызвана, invalidateSize
метод.В вашем случае 300 мс - это нормально.
Тогда вам следует также вызвать его снова, когда пользователь меняет вкладку (см. События вкладок Buefy), в противном случае браузер изменил размер, покаВаша вкладка была скрыта, такая же проблема возникнет снова.
Демонстрация с картами на 2 вкладках:
new Vue({
el: '#app',
data: {
map: null,
map2: null,
tabMaps: []
},
methods: {
invalidateSize: function(tabIndex) {
setTimeout(() => {
if (typeof tabIndex === "number") {
this.tabMaps[tabIndex].invalidateSize();
} else {
// invalidate all maps
this.tabMaps.forEach(map => {
map.invalidateSize();
});
}
}, 300);
}
},
mounted() {
this.map = L.map('map').setView([38.63, -90.23], 12);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(this.map);
// map2 in tab2
this.map2 = L.map(this.$refs.map2).setView([38.63, -90.23], 12);
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png").addTo(
this.map2
);
this.tabMaps.push(this.map); // 0
this.tabMaps.push(this.map2); // 1
this.invalidateSize();
}
})
<link rel="stylesheet" href="https://unpkg.com/buefy@0.7/dist/buefy.min.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css">
<div class="section">
<div class="container" id="app">
<b-tabs @change="invalidateSize" position="is-centered">
<b-tab-item label="Tab 1">
<div class="section">
Tab 1
<div class="map" id="map" style="height: 400px; width: 100%"></div>
<button class="button is-info" @click="invalidateSize()">invalidateSize</button>
</div>
</b-tab-item>
<b-tab-item label="Tab 2">
<div class="section">
Tab 2
<div class="map" ref="map2" style="height: 400px; width: 100%"></div>
</div>
</b-tab-item>
</b-tabs>
</div>
</div>
<script src="https://unpkg.com/vue@2"></script>
<script src="https://unpkg.com/buefy@0.7/dist/buefy.min.js"></script>
<script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js"></script>