解決vue中BMap未定義問題


原文鏈接: 點我

最近在項目中使用了百度地圖來顯示物流信息,實現方式有兩種:

引用Vue Baidu Map
引用BMap
存在的問題:\color{red}{存在的問題:}存在的問題:;
使用BMap可以修改起始點和終點的圖標,但是地圖需要刷新頁面才會顯示。
針對以上問題,問題的實現如下所示:

Vue文件中的代碼

<template>
	<div id="myMap"></div>
</template>
import qs from "qs";
export default {
  mounted() {
    this.getMap();
  },
  methods: {
    // 繪制地圖
    getMap() {
      var map = new BMap.Map("myMap");
      map.enableScrollWheelZoom(true);
	 //注意:下面的坐標值換為自己的動態值即可,我就不多說了
      var start = new BMap.Point(this.startLng, this.startLat);
      var end = new BMap.Point(this.currentLng, this.currentLat);
      var p1 = new BMap.Point(this.currentLng, this.currentLat);
      //自定義圖標
      var startIcon = new BMap.Icon(
        require("../../assets/images/point.png"),  //起點圖片
        new BMap.Size(25, 25)
      );
      var currentIcon = new BMap.Icon(
        require("../../assets/images/car.png"),   //物流車圖片
        new BMap.Size(25, 25)
      );
      var endIcon = new BMap.Icon(
        require("../../assets/images/point.png"),   //終點圖片
        new BMap.Size(25, 25)
      );
      var driving = new BMap.DrivingRoute(map, {
        renderOptions: { map: map, autoViewport: true },
        onMarkersSet: function(routes) {
          //標注點完成回調
          map.clearOverlays(); //刪除點
          var myStart = new BMap.Marker(start, { icon: startIcon });
          map.addOverlay(myStart);
          var myEnd = new BMap.Marker(end, { icon: endIcon });
          map.addOverlay(myEnd);
          var myP1 = new BMap.Marker(p1, { icon: currentIcon });
          map.addOverlay(myP1);
        }
      });
      driving.search(start, end, { waypoints: [p1] });
    },
};
</script>

  

  • 這樣寫之后瀏覽器會報BMap is undefined,解決方法如下:

  • 在項目根目錄下建立Js文件(比如:map.js)

    export function MP(ak) {  
    return new Promise(function (resolve, reject) {
      window.onload = function () {
        resolve(BMap)  
      }  
      var script = document.createElement("script");
      script.type = "text/javascript";  
      script.src = "http://api.map.baidu.com/api?v=2.0&ak="+ak+"&callback=init";
      script.onerror = reject;  
      document.head.appendChild(script);  
    })  
    } 
    

    在App.vue中

  • <script>
    import { MP } from './map'    //引入上面創建的map.js文件
    export default {
      name: 'app',
      data(){
        return {
          ak: "這里是您的密鑰",
        }
      },
      async mounted(){
          await MP(this.ak);
      }
    }
    </script>
    

      要使用的vue文件中

  • mounted() {
    // 解決BMap undefined
    this.$nextTick(() => {
      var timer = setTimeout(() => {
        this.getMap();
      }, 500);
    });
    },
    

    好啦,通過上面的代碼刷新顯示地圖就解決啦,若大家有更好的方法歡迎分享在下面👇👇👇,期待中…


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM