我在使用 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/buefy@0.7/dist/buefy.min.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/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/buefy@0.7/dist/buefy.min.js"></script>
<script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet.js"></script>
</html>