组件
1、什么是组件
实现应用中局部功能代码和资源的集合
代码:HTML,CSS,JS,,
资源:mp3, mp4, ttf, .zip
2、组件与传统编程的区别
传统方式编写应用存在问题:
- 依赖关系混乱,不好维护
- 代码复用率不高
模块化编程优点:
复用代码,简化项目编码,提高运行效率
组件的两种编写形式
1、单文件组件
一个文件中只包含一个组件,组件类型为XX.vue
优点:条理清晰,代码易维护
2、非单文件组件
-
含义:一个文件中包含有N个组件
-
Vue中使用组件的三步骤:
- 定义组件(创建组件)
//创建school组件 const school = Vue.extend({ name:'school', template:' <div> <h2>学校名称{name}</h2> </div> ', data(){ return{ name:'建大' } } })
- 注册组件
- 局部注册:new Vue的时候传入components:{}选项
- 全局注册:Vue.component(‘组件名’,组件)
//创建vm new Vue({ el:'#root', components:{ school } })
- 使用组件
<div id='root'> <school></school> </div>
实例对象
- VueComponent构造函数
- school组件本身是一个名为VueComponent的构造函数,是
Vue.extend
生成的。 - 我们只需要写
<school> </school>
或者<school>
,Vue解析时会帮我们创建school组件的实例对象,即执行new VueComponent(options)
。 - 注意:每次调用
Vue.extend
,返回的都是一个全新的VueComponent。 - school组件中,data,methods,watch,compute中的this都指向school的实例对象,记vc(VueComponent),也可称为组件实例对象
- Vue实例对象,记vm
- 被vm管理的vc,即注册在vm中的vc,console.log(vm),可以在vm下的$children属性中找到被管理的vc。
- school组件本身是一个名为VueComponent的构造函数,是
- vc和vm的区别
- new vc时,里面不能写el;new vm时,里面可以写el
- new vc时,里面的data必须写成函数的形式;new vm时,data可以是对象类型,也可以是函数
原型对象
一个重要的内置关系:VueComponent.prototype._proto_ === Vue.prototype
作用:让组件实例对象都可以访问到Vue原型上的属性、方法。
//定义一个构造函数
function Demo(){
this.a=1
}
const d=new Demo()
console.log(Demo.prototype)//显式原型属性
console.log(d._proto_)//隐式原型属性
console.log(Demo.prototype===d._proto_)//true
//程序员用显式原型属性放东西,程序执行时顺隐式原型属性去取这个东西
Demo.prototype.x=9
console.log(d.x)//输出9,原理:先查找d中定义的普通属性,只有a,没有x,就去_proto_属性下找x
总结:
实例的隐式原型属性永远指向自己的缔造者的原型对象。
Vue上有显式原型属性prototype,vm是Vue的实例,有隐式原型属性_proto_,他们都共同指向Vue原型对象,Vue原型对象又是object类型,所以也会有隐式原型属性_proto_,指向Object原型对象;
VueComponent上显示原型属性prototype和其实例(记作vc)的隐式原型_proto_同时指向VueComponent原型对象,VueComponent原型对象的_proto_属性又指向Vue原型对象,最终指向Object原型对象。