Vue.extend 编程式插入组件

前言

平常中咱们要使用一个弹框组件的方式一般是先经过Vue.component 全局或是 component 局部注册后,而后在模版中使用。接下来咱们尝试编程式的使用组件。编程

实现

其实步骤很简单bash

  1. 经过 Vue.extend() 建立构造器
  2. 经过 Vue.$mount() 挂载到目标元素上
  3. 目标实现一个 alert 弹框,确认和取消功能以下图

document.createElement

其实想要插入一个元素,经过 document.createElement 就能够实现,并不是必定须要上面两步,可是涉及到组件的复杂度、样式设置、可维护性因此使用建立构造器的方式比较可行。app

Vue.extend()

首先来定义这个弹框的结构和样式,就是正常的写组件便可函数

<template>
  <div class="grid">
      <h1 class="head">这里是标题</h1>
      <div @click="close">{{ cancelText }}</div>
      <div @click="onSureClick">{{ sureText }}</div>
  </div>
</template>
<script>
export default {
  props:{
    close:{
      type:Function,
      default:()=>{}
    },
    cancelText:{
      type:String,
      default:'取消'
    },
    sureText:{
      type:String,
      default:'肯定'
    }
  },
  methods:{
    onSureClick(){
      // 其余逻辑
      this.close()
    }
  }
};
</script>

复制代码

将建立构造器和挂载到目标元素上的逻辑抽离出来,多处能够复用ui

export function extendComponents(component,callback){
  const Action = Vue.extend(component)
  const div = document.createElement('div')
  document.body.appendChild(div)
  const ele = new Action({
    propsData:{
      cancelText:'cancel',
      sureText:'sure',
      close:()=>{
        ele.$el.remove()
        callback&&callback()
      }
    }
  }).$mount(div)
}
复制代码

上面代码须要注意如下几点:this

  1. Vue.extend 得到是一个构造函数,能够经过实例化生成一个 Vue 实例
  2. 实例化时能够向这个实例传入参数,可是须要注意的是 props 的值须要经过 propsData 属性来传递
  3. 获得 Vue 实例后,咱们须要经过一个目标元素来挂载它,有人首先会想到挂载到 #app 上,这个挂载的过程是将目标元素的内容所有替换,因此一旦挂载到 #app 上,该元素的全部子元素都会消失被替换
  4. 针对第3点,因此建立了一个 div 元素插入到 body 中,咱们将想要挂载的内容替换到这个div上

Vue.extend 和 Vue.component component 的区别

  1. Vue.component component二者都是须要先进行组件注册后,而后在 template 中使用注册的标签名来实现组件的使用。Vue.extend 则是编程式的写法
  2. 关于组件的显示与否,须要在父组件中传入一个状态来控制 或者 在组件外部用 v-if/v-show 来实现控制,而 Vue.extend 的显示与否是手动的去作组件的挂载和销毁
  3. Vue.component component 在组件中须要使用 slot 等自定义UI时更加灵活,而 Vue.extend 因为没有 template的使用,没有slot 都是经过 props 来控制UI,更加局限一些。
相关文章
相关标签/搜索