Vue.extend
属于 Vue 的全局 API,在实际业务开发中我们很少使用,相比常用的 Vue.component
写法,使用 Vue.extend
步骤要繁琐一些。但在一些独立组件开发场景中,还是用的到Vue.extend
+ $mount
这对组合的。
官方定义
Vue.extend( options )
参数:
{Object} options
用法:
使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。
data
选项是特例,需要注意 - 在 Vue.extend()
中它必须是函数
<div id="mount-point"></div>
// 创建构造器
var Profile = Vue.extend({
template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',//外层div可以去掉,但是必须要嵌套其他标签,不可直接 template: “111”, 应template: "<div>1111</div>"
data: function () {
return {
firstName: 'Walter',
lastName: 'White',
alias: 'Heisenberg'
}
}
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#mount-point')
结果如下:
<p>Walter White aka Heisenberg</p>
可以看到,extend
创建的是一个组件构造器,而不是一个具体的组件实例,所以不可以通过 new Vue({ components: testExtend })
来直接使用,需要通过 new Profile().$mount('#mount-point')
来挂载到指定的元素上。 最终还是要通过Vue.components
注册才可以使用的。
<div id="app">
<h1>{{msg}}</h1>
<Profile></Profile>
</div>
<template id="extend">
<div>
<p>{{ProfileMsg}}</p>
</div>
</template>
// 创建构造器
var Profile = Vue.extend({
template: '#extend',
//data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数
data: function() {
return {
ProfileMsg:"extend"
}
},
})
//注册组件到全局,要放到new Vue()前面,不然无法生效
Vue.component("Profile", Profile)
//创建vue
var vue = new Vue({
el: '#app',
components: {
// Profile,//使用全局组件
},
data: {
msg: 'Vue是最简单的',
},
})
结果如下:
<h1>Vue是最简单的</h1>
<p>extend</p>
在实例化extends
组件构造器时,传入属性必须是propsData
,而不是props
。另外,无论是Vue.extend
还是Vue.component
里面的data
定义都必须是函数返回对象,如Vue.extend({data: function () {return {}}})。
除了new Vue
可以直接对data
设置对象,如new Vue({data: {}})
,但会全局生效;
<div id="mount-point"></div>
<template id="extend">
<div>
<p>{{ProfileMsg}}</p>
</div>
</template>
// 创建构造器
var Profile = Vue.extend({
template: '#extend',
props: ["ProfileData"],
//data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数
data: function() {
return {
ProfileMsg:"extend"
}
},
mounted() {
console.log(this.ProfileData) //hello,Vue!
},
})
// 创建 Profile 实例,并挂载到一个元素上。
//请注意,在市里话extends组件构造器时,传入属性的必须是propsData,而不是props
//propsData 创建实例时传递 props。主要作用是方便测试。
new Profile({
propsData: {
ProfileData: "hello,Vue!"
}
}).$mount('#mount-point')
结果如下:
<p>extend</p>
<p>hello,Vue!</p>
extend的使用
在 vue 项目中,我们有了初始化的根实例后,所有页面基本上都是通过router
来管理,组件也是通过 import
来进行局部注册,所以组件的创建我们不需要去关注,相比 extend
要更省心一点点。但是这样做会有几个缺点:
- 组件模板都是事先定义好的,如果我要从接口动态渲染组件怎么办?
- 所有内容都是在
#app
下渲染,注册组件都是在当前位置渲染。如果我要实现一个类似于window.alert()
提示组件要求像调用 JS 函数一样调用它,该怎么办?
这时候,Vue.extend + vm.$mount
组合就派上用场了。