У меня проблема с загрузкой карты Leaflet с использованием компонентов вкладки Vue.js и Bulma (через Buefy).
Если карта находится внутри вкладки, она не загружает все плитки до тех пор, пока размер окна браузера не будет изменен.
Если карта размещена вне компонента вкладок Bulma, она загружается без каких-либо проблем.
Вызов map.invalidateSize()
, кажется, помогает, но для того, чтобы делать это автоматически при изменении вкладки, я должен вызывать его с помощью setTimeout
и устанавливать очень большую задержку, например 1 секунду, что очень некрасиво.
Как заставить это работать без этого invalidateSize
обходного пути?
Пример проблемы: https://codepen.io/alxxnder/pen/zyYxwd
Пример без проблемы: https://codepen.io/alxxnder/pen/LMYEjr
Код:
new Vue({
el: '#app',
data: {
map: null,
},
methods: {
invalidateSize: function() {
this.map.invalidateSize();
}
},
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);
}
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Leaflet Test</title>
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/buefy.min.css">
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css">
</head>
<body>
<div class="section">
<div class="container" id="app">
<b-tabs 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>
</b-tab-item>
</b-tabs>
</div>
</div>
</body>
<script src="https://unpkg.com/vue@2"></script>
<script src="https://unpkg.com/[email protected]/dist/buefy.min.js"></script>
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
</html>