Skip to main content

Vue.extend

Vue.extend 属于 Vue 的全局 API。它使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。如下:

<div id="app"></div>

var Profile = Vue.extend({
template: '<p>{{firstName}} {{lastName}}</p>',
data: function () {
return {
firstName: 'Walter',
lastName: 'White'
}
}
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#app')

应用实例

我们常用 Vue.extend 封装一些全局插件,比如 toast, diolog 等。 下面以封装一个 toast 组件为例。

1、编写组件

根据传入的 type 确定弹窗的类型(成功提示,失败提示,警告,加载,纯文字) 设置弹窗消失的时间

<template>
<div>
<transition name="fade">
<div class="little-tip" v-show="showTip">
<img src="/success.png" alt="" width="36" v-if="type=='success'" />
<img src="/fail.png" alt="" width="36" v-if="type=='fail'" />
<img src="/warning.png" alt="" width="36" v-if="type=='warning'" />
<img src="/loading.png" alt="" width="36" v-if="type=='loading'" class="loading" />
<span>{{msg}}</span>
</div>
</transition>
</div>
</template>

<script>
export default {
data() {
return {
showTip: true,
msg: '',
type: ''
}
},
mounted() {
setTimeout(() => {
this.showTip = false
}, 1500)
}
}
</script>
<style lang="less" scoped>
/* 样式略 */
</style>

2、利用 Vue.extend 构造器把 toast 组件挂载到 vue 实例下

import Vue from 'vue'
import Main from './toast.vue'

let Toast = Vue.extend(Main)

let instance
const toast = function(options) {
options = options || {}
instance = new Toast({
data: options
})
instance.vm = instance.$mount()
document.body.appendChild(instance.vm.$el)
return instance.vm
}
export default toast

3、在 main.js 引入 toast 组价并挂载在 vue 原型上

import Vue from 'vue'
import toast from './components/toast'
Vue.prototype.$toast = toast

4、在项目中调用

this.$toast({ msg: '手机号码不能为空' })

this.$toast({
msg: '成功提示',
type: 'success'
})

Vue.extend 和 Vue.component 的区别

component是需要先进行组件注册后,然后在 template 中使用注册的标签名来实现组件的使用。Vue.extend 则是编程式的写法。 控制component的显示与否,需要在父组件中传入一个状态来控制或者在组件外部用 v-if/v-show 来实现控制,而 Vue.extend 的显示与否是手动的去做组件的挂载和销毁。

参考