vue 页面使用百度地图

10 篇文章 0 订阅

前言

关于使用 vue 的页面

当只用 vue 做数据绑定,且未使用其它功能时,页面代码形式如下:

<html>
<body>
<div id="appContainer">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
	el: '#appContainer',
	...
});
</script>
</body>
</html>

使用百度地图

<!DOCTYPE html>
<html>
<body>
<div id="appContainer">
	<div id="baiduMapContainer" style="height: 500px; width: 100%;">
	</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=您的密钥"></script>
<script>
var baiduMap = null;
function initBaiduMap() {
	// GL版命名空间为BMapGL
	// 按住鼠标右键,修改倾斜角和角度
	baiduMap = new BMapGL.Map("baiduMapContainer");    // 创建Map实例
	baiduMap.centerAndZoom(new BMapGL.Point(116.404, 39.915), 11);  // 初始化地图,设置中心点坐标和地图级别
	baiduMap.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
}

var app = new Vue({
	el: '#appContainer',
	data: {},
	created: function () {},
	mounted: function (){
		// 初始化百度地图
		initBaiduMap();
	},
});
</script>
</body>
</html>

解释

  • 百度地图容器 baiduMapContainer 在 vue 容器 appContainer 内。vue 初始化后,导致百度地图无法使用。因此,需要在vue初始化后,再初始化百度地图。
  • vue 的生命周期中, 到mounted时可以操作dom。百度地图的初始化也就需要写在mounted中。

关于vue生命周期的讲解,参考这里:https://segmentfault.com/a/1190000020058583
在这里插入图片描述

百度地图如何被vue破坏的?

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
	<style type="text/css">
	body, html,#appContainer,#baiduMapContainer{width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
	#appContainer {display: flex; flex-direction: column;}
	#message{display: block;}
	#baiduMapContainer {flex-basis: auto;}
	</style>
	<script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=您的密钥"></script>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<title>地图展示</title>
</head>
<body>
	<div id="appContainer">
		<div id="message">
			<p v-if="vueInitDone">百度地图如何被vue破坏的?</p>
			<p v-if="!vueInitDone">先初始化百度地图,过5秒后再初始化vue。等5秒再看效果。</p>
			<p style="display: none" v-bind:style="{display: vueInitDone?'block':'none'}">vue已初始化完成。现在效果如何?</p>
		</div>
		<div id="baiduMapContainer"></div>
	</div>
</body>
</html>
<script type="text/javascript">
    // GL版命名空间为BMapGL
    // 按住鼠标右键,修改倾斜角和角度
	var map = new BMapGL.Map("baiduMapContainer");    // 创建Map实例
	map.centerAndZoom(new BMapGL.Point(116.404, 39.915), 11);  // 初始化地图,设置中心点坐标和地图级别
	map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
	
	setTimeout(function() {
		var app = new Vue({
			el: '#appContainer',
			data: {
				vueInitDone: false,
			},
			mounted: function (){
				this.vueInitDone= true;
			},
		});
	}, 1000 * 5);
</script>

在这里插入图片描述
在这里插入图片描述

动态创建元素

<!DOCTYPE html>
<html>
<body>
<div id="appContainer">
	<div id="baiduMapContainer" style="height: 500px; width: 100%;" v-if="dituEnable">
	</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=您的密钥"></script>
<script>
function initBaiduMap() {
	// GL版命名空间为BMapGL
	// 按住鼠标右键,修改倾斜角和角度
	baiduMap = new BMapGL.Map("baiduMapContainer");    // 创建Map实例
	baiduMap.centerAndZoom(new BMapGL.Point(116.404, 39.915), 11);  // 初始化地图,设置中心点坐标和地图级别
	baiduMap.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
}
var app = new Vue({
	el: '#appContainer',
	data: {
		dituEnable: false,
	},
	mounted: function (){
		let _this = this;
		setTimeout(function(){
			_this.dituEnable = true;
		},1000*5);
		// 初始化百度地图
		initBaiduMap();
	},
});
</script>
</body>
</html>

控制台输出错误如下:
在这里插入图片描述

v-show 替代 v-if

当使用 v-if 控制地图容器时( <div id="baiduMapContainer" style="height: 500px; width: 100%;" v-if="dituEnable"> ),导致地图不能在预期的时间点上初始化,进而发生错误。
使用 v-show 替代 v-if ( <div id="baiduMapContainer" style="height: 500px; width: 100%;" v-show="dituEnable"> )可以避免该问题。

说明:

  • 相同点:v-if与v-show都可以动态控制dom元素显示隐藏
  • 不同点:v-if显示隐藏是将dom元素整个添加或删除(隐藏时dom元素不存在),而v-show隐藏则是为该元素添加css display:none(dom元素还在)。

等地图容器创建完成后再初始化地图:vue.$nextTick

<!DOCTYPE html>
<html>
<body>
<div id="appContainer">
	<div v-if="!dituEnable">
		<p>你来早了!!!百度地图要10秒后才能初始化完成</p>
		<p>倒计时:{{leftSeconds}}</p>
	</div>
	<div id="baiduMapContainer" style="height: 500px; width: 100%;" v-if="dituEnable">
	</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=您的密钥"></script>
<script>
function initBaiduMap() {
	// GL版命名空间为BMapGL
	// 按住鼠标右键,修改倾斜角和角度
	baiduMap = new BMapGL.Map("baiduMapContainer");    // 创建Map实例
	baiduMap.centerAndZoom(new BMapGL.Point(116.404, 39.915), 11);  // 初始化地图,设置中心点坐标和地图级别
	baiduMap.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
}
var app = new Vue({
	el: '#appContainer',
	data: {
		dituEnable: false,
		initDituFlag: false,
		leftSeconds: 10,
	},
	mounted: function (){
		let _this = this;
		var dituTimer = setInterval(function(){
			_this.leftSeconds-= 1;
			if (0 == _this.leftSeconds) {
				_this.dituEnable = true;
				clearInterval(dituTimer);
			}
			
		},1000);
		
	},
	watch: {
		dituEnable: function (val) {
			let _this = this;
			if (!_this.initDituFlag){
				_this.$nextTick(function(){
					// 初始化百度地图
					initBaiduMap();
			    });
			    _this.initDituFlag= true;
		    }
		}
	},
});
</script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值