组件
组件的定义:实现应用中局部功能代码和资源的集合。
一、创建组件
(1)非单文件组件
一个文件中包含有n个组件。
Vue中使用组件的三大步骤:
(1)定义组件(创建组件)
(2)注册组件
(3)使用组件(写组件标签)
如何定义一个组件?
使用
Vue.extend(options)
创建,其中options
和new Vue(options)
时传入的那个options几乎一样,但也有点区别;el
不要写,为什么?最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。data
必须写成函数,为什么?避免组件被复用时,数据存在引用关系。备注:使用
template
可以配置组件结构。
如何注册组件?
- 局部注册:靠
new Vue
的时候传入components
选项 - 全局注册:靠
Vue.component('组件名',组件)
- 局部注册:靠
编写组件标签:
1
<school></school>
注意:
关于组件名:
一个单词组成:
(1)第一种写法(首字母小写):school
(2)第二种写法(首字母大写):School
(3)多个单词组成:
第一种写法(kebab-case命名):my-school
第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
备注:
(1)组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
(2)可以使用name配置项指定组件在开发者工具中呈现的名字。1
2
3
4//多个单词组成
<div id="app">
<my-student></my-student>
</div>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21const student = Vue.extend({
template: `
<div>
<h1>{{studentName}}</h1>
<hr>
<h1>{{studentAge}}</h1>
</div>
`,
data() {
return {
studentName: '张三',
studentAge: '19'
}
},
})
new Vue({
el: '#app',
components: {
'my-student': student
},
})关于组件标签:
第一种写法:
1
<school></school>
第二种写法:
1
<school/>
备注:不用使用脚手架时,
<school/>
会导致后续组件不能渲染。一个简写方式:
1
2const school = Vue.extend(options)
可简写为:const school = optionsapp
组件1
2
3<div id="app">
<app></app>
</div>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71//student组件
const student = Vue.extend({
template: `
<div>
<h1>{{name}}</h1>
<hr>
<h1>{{age}}</h1>
</div>
`,
data() {
return {
name: '张三',
age: 19
}
},
})
//school组件
const school = Vue.extend({
name: 'mySchool',
template: `
<div>
<h1>{{schoolName}}</h1>
<hr>
<h1>{{schoolAge}}</h1>
<myStudent></myStudent>
</div>
`,
data() {
return {
schoolName: '烟台科技学院',
schoolAge: '2003'
}
},
components: {
//将student组件嵌入到school组件
'myStudent': student
}
})
//hello组件
const hello = Vue.extend({
template: `
<h1>你好,欢迎来到{{school}}</h1>
`,
data() {
return {
school: '烟科'
}
},
})
//app组件
const app = Vue.extend({
name: 'myApp',
template: `
<div>
<hello></hello>
<school></school>
</div>
`,
components: {
分别将hello组件和school组件嵌入到app组件
hello,
school,
}
})
new Vue({
el: '#app',
components: {
//vm根结点下只有app组件
app,
},
})注意:组件中,
template
属性要求必须有一个根结点。
关于VueComponent:
school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。
我们只需要写
<school/>
或<school></school>
,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!
关于this指向:
组件配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
new Vue(options)配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。
VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。Vue的实例对象,以后简称vm。
一个重要的内置关系:
- 一个重要的内置关系:VueComponent.prototype.proto === Vue.prototype
- 为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
(2)单文件组件
一个文件只包含一个组件。
1.文件名写法:
- 单个单词文件名写法:
school.vue
、School.vue
(推荐)。 - 多个单词文件名写法:
my-school.vue
、MySchool.vue
(推荐)。
1 |
|