原创

cdn百度地图信息窗体使用vue组件-Vue.extend动态渲染


完整代码

<!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, #allmap {
            width: 100%;
            height: 100%;
            margin: 0;
            font-family: "微软雅黑";
            font-size: 14px;
        }
        #l-map {
            height: 500px;
            width: 100%;
        }
        #r-result {
            width: 100%;
        }
    </style>
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <title>零三的笔记web03.cn</title>
</head>
<body>
    <div id="app">
        <el-button >Button</el-button>
        <div id="l-map"></div>
        <div id="r-result"></div>
    </div>
</body>
</html>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=uw5BXNxAcf2oCi4ybQdRiK0jxNkesirn"></script>
<script type="text/javascript">
    let Btn = Vue.extend({
        template: "<el-button type=\"warning\">警告按钮</el-button>"
    })
    new Vue({
        el: '#app',
        data: function() {
            return { visible: false }
        },
        mounted() {
            let btn = new Btn().$mount();
            // 百度地图API功能
            var map = new BMap.Map("l-map");
            var point = new BMap.Point(116.404, 39.915);
            map.centerAndZoom(point, 15);
            //  这样是行不通的
            // var infoWindow = new BMap.InfoWindow("<el-button type=\"warning\">警告按钮</el-button>");  // 创建信息窗口对象

            // 正确实现
            var infoWindow = new BMap.InfoWindow(btn.$el);  // 创建信息窗口对象
            map.openInfoWindow(infoWindow, point); //开启信息窗口
        }
    })
</script>

问题分析

以下写法vue是不会解析el-button标签的

var infoWindow = new BMap.InfoWindow("<el-button type=\"warning\">警告按钮</el-button>");  // 创建信息窗口对象
map.openInfoWindow(infoWindow, point); //开启信息窗口

解决思路

使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。 data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数

var testComponent = Vue.extend({
  template: '<p>{{pData}}</p><ls-span>自定义组件</ls-span>',
  data: function () {
    return {
      pData: '零三'
    }
  }
})
// 创建 testComponent 实例,并挂载到一个元素上。
new testComponent().$mount('#box')

extend 创建的是 Vue 构造器,需要通过 new Component().$mount('#DOM') 来挂载到指定的元素上。

我们可以通过 $el 属性来访问 Component 组件实例:
document.body.appendChild(Component.$el)

总结意思就是:Vue.extend可以在dom上动态渲染组件

JavaScript
vue
  • 作者:零三(联系作者)
  • 最后更新时间:2020-06-11 20:25
  • 版权声明:自由转载-非商用-非衍生-保持署名
  • 转载声明:来源地址 https://web03.cn