Vue中使用组件的三大步骤:
一、定义组件(创建组件)
- 使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但是还是有两点不一样:
- 1.el不要写 ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
- 2.data必须写成函数 ———— 避免组件被复用时,数据存在引用关系。
- 3、使用template 配置组件结构
二、注册组件
- 1.局部注册:靠new Vue的时候传入components选项
- 2.全局注册:靠Vue.component('组件名',组件)
三、使用组件(写组件标签)
组件名规则推荐:
一个单词组成:
- 第一种写法(首字母小写):school
- 第二种写法(首字母大写):School (可跟vue插件呼应)
多个单词组成:
- 第一种写法(kebab-case命名):my-school
- 第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
备注:
- (1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2 ,header,main,footer等都不行。
- (2).可以使用name配置项指定组件在开发者工具中呈现的名字。
2.关于组件调用标签:
- 第一种写法:<school></school>
- 第二种写法:<school/> (需要Vue脚手架支持)
备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。
VueComponent
- school组件的本质是一个名为 VueComponent 的构造函数,且不是程序员定义的,是 Vue.extend 生成的。
- <school/> 或 <school></school> ,Vue 解析时会帮我们创建 school 组件的实例对象,即 Vue 帮我们执行的:new VueComponent(options) 。
- 3. 特别注意 每次调用 Vue.extend,返回的都是一个全新的 VueComponent 。
- 4. 关于this的指向:
- 组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的 this 均是 【VueComponent实例对象】。
- new Vue(options)配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的 this 均是 【Vue实例对象】
- 5.VueComponent的实例对象,简称:vc 或 组件实例对象
Vue的实例对象,简称vm
<div id="root">
<!-- 实际上每次都会通过VueComponent 创建的实例对象 -->
<student></student>
<student></student>
<hello></hello>
</div>
<script>
const student = Vue.extend({
template: ` <div>
<p>{{name}}</p>
</div>`,
data() {
return {
name: '张三',
}
},
})
const hello = {
template: ` <div>
hello
</div>`
}
//创建vm
let vm = new Vue({
el: '#root',
components: { student,hello }
})
</script>
一个重要的内置关系
VueComponent.prototype.__proto__ === Vue.prototype
让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
<div id="root">
<hello></hello>
</div>
<script>
/*
因为:vue内置了:VueComponent.prototype.__proto__ = Vue.prototype
所以:组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
即:
console.log(hello.prototype.__proto__ === Vue.prototype);//输出:true
*/
Vue.prototype.x = 99;//在Vue原型追加一个x属性
const hello = {
template: `
<div>
<!-- 组件可以访问Vue原型的 x属性 -->
{{x}}
</div>`
}
//创建vm
let vm = new Vue({
el: '#root',
components: { hello }
})
console.log(student.prototype.__proto__ === Vue.prototype);//输出:true
</script>