1. 认识Vue组件
组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。
仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:
1.1 组件是什么
组件就是一段独立的,能代表页面某一个部分的代码片段, 拥有自己独立的数据,JavaScript脚本,以及样式的 标签.
1.2 组件的好处:
- 提高开发效率
- 方便重复使用
- 便于协同开发
- 更容易被管理和维护
1.3 组件创建的基本步骤
Vue.js的组件的使用有3个步骤:创建组件构造器、注册组件和使用组件
1.4 示例
通过一个示例来了解组件的使用
使用Vue的component方法注册全局组件
<div id="app-one">
<!-- 3.在实例中使用组件 -->
<greeting></greeting>
</div>
<script>
// 1. 组件构造器
let MyComponent= Vue.extend({
// 配置对象
// 因为组件没有挂在点,所以使用模板,只有一个根节点
template: `
<div>
<p>大家好,我叫{{name}}</p>
<button @click="changeName">点击换名字</button>
</div>
`,
data: function(){
return {
name:"渣渣辉"
}
},
methods:{
changeName(){
this.name = "古天乐"
}
}
})
// 2. 通过Component方法,将构造器扩展的构造函数创建组件实例
Vue.component("Greeting",MyComponent)
// Vue 实例
const vm = new Vue({
el:"#app-one",
})
</script>
显示结果:
1.5 理解组件的创建和注册
- Vue.extend()是Vue构造器扩展,调用Vue.extend()创建的是一个组件构造器,而不是具体的组件实例。
- Vue.extend()构造器有一个选项对象,选项对象的template属性用于定义组件要渲染的HTML模板。
- 使用Vue.component()注册组件时,需要提供2个参数,第1个参数时组件的名,第2个参数是组件构造器。
- Vue.component()方法内部会调用组件构造器,创建一个组件实例。
- 组件应该挂载到某个Vue实例下,否则它不会生效。
1.6 Vue构造器扩展直接创建Vue实例
Vue.extend 方法相当于是对于原有的Vue 构造函数进行了扩展, 本质上核心还是Vue的构造函数,所以我们可以直接通过扩展的构造函数创建Vue实例
<div id="app"></div>
<script>
// 1. 通过组件构造器扩展构造函数
let MyComponent= Vue.extend({
// 配置对象
// 因为组件没有挂在点,所以使用模板,只有一个根节点
template: `
<div>
<p>大家好,我叫{{name}}</p>
<button @click="changeName">点击换名字</button>
</div>
`,
data: function(){
return {
name:"渣渣辉"
}
},
methods:{
changeName(){
this.name = "古天乐"
}
}
})
// 2. 通过扩展的构造函数创建Vue实例
new MyComponent({
el:'#app'
})
</script>
示例说明:
- Vue组件其实也是Vue实例,只不过没有挂在点, 通过
template
处理需要渲染的DOM - 但是组件实例必须有一个名字, 通过这个名字在Vue实例中使用, 通过自定定义标签方式使用组件
在vue中,一个自定义标签 vue就会把它看成一个组件,vue可以给这些标签赋予一定的意义
1.7 直接通过选项对象创建组件
其实所有的Vue的组件同时也都是Vue的实例.
所以组件可接受的相同选项对象.
因此我们在创建组件的过程中也就没有必要每次都通过构造器扩展Vue构造函数
直接把构造器的选项对象作为第二个参数传递给Vue.component就可以
示例如下:
// 创建组件
Vue.component("Greeting",{
template: `
<div>
<p>大家好,我叫{{name}}</p>
<button @click="changeName">点击换名字</button>
</div>
`,
data: function(){
return {
name:"渣渣辉"
}
},
methods:{
changeName(){
this.name = "古天乐"
}
}
})
使用组件
<div id="app-one">
<greeting></greeting>
</div>
推荐使用这种方式创建组件.
注意事项:
- 组件名称不能起和HTML合法标签相同 的名字,如p,
- 如果组件名跟HTML合法标签同名, 会默认解析为合法的标签,
- 因此会将p识别为普通的标签,而不是自定义标签,因此就不会被当成组件处理, 同时还会报错
1.8 组件的分类
- 全局组件 : 可以声明一次在任何地方使用(一般写插件的时候全局使用的多一点)
- 局部组件: 必须告诉这个组件属于谁(一般用局部比较好)
那么接下来就让我们好好理解一些全局组件和局部组件的使用
2. 全局组件
通过刚才的实例,对于全局组件相信你们已经有了一定的了解
调用Vue.component()注册组件时,组件的注册是全局的,这意味着该组件可以在任意Vue示例下使用。
通过示例了解全局组件的使用
2.1 创建全局组件
通过Vue.component 方法注册全局组件, 组件名称建议使用大驼峰命名
// 在js中定义组件名时使用大驼峰式命名,
// 但是在标签html中里使用时尽量用连字符-
Vue.component('MyCom', {
template: `
<div>这是全局组件的内容</div>
`
})
2.2 创建多个Vue实例
// 实例一
new Vue({
el:"#app-one",
})
// 实例二
new Vue({
el:"#app-two",
})
2.3 在多个Vue实例中使用全局组件
<div id="app-one">
<!-- 是使用组件的时候要把大驼峰转为连字符的方式使用 -->
<my-com></my-com>
<!--
如果使用了如下的方式就会报错,
-->
<!-- <MyCom></MyCom> -->
</div>
<div id="app-two">
<!-- 如果自定义标签里面没有嵌套内容可以写成单标签的形式 -->
<my-com />
</div>
2.4 注意事项
相信你们看到了我们注册组件的时候使用的组件名是一个驼峰写法的方式,此时使用组件时的自定义标签中不能使用驼峰写法会报错的, 因为HTML不能识别大小写, 会将你写的<MyCom>
识别为<mycom>
这样就找不到组件了,因此会在控制台报错
但是我们可以在定义组件的使用使用连字符的方式定义组件名
示例代码如下:
<div id="app-two">
<!-- 使用组件 -->
<my-com />
</div>
<script>
// 使用连字符定义组件名
Vue.component('my-com', {
template: `
<div>这是全局组件的内容</div>
`
})
// Vue实例化
new Vue({
el:"#app",
})
</script>
通过示例,我们了解了定义组件是使用连字符和驼峰命名都可以,但是在HTML标签里使用组件的使用一定只能写成连字符的方式.
关于组件名说明:
- 虽然在定义组件时我们可以使用连字符命名,但是不推荐,
- 推荐的使用方式是,定义组件使用驼峰方式, 使用组件使用连字符方法.
至于为什么, 您接着往下看.
3. 局部组件
有的时候我们并不希望组件在所有的实例中都能使用, 那么我们就可以将组件定义为局部组件
3.1 局部组件使用三步曲
- 创建局部配置,
- 注册局部组件
- 使用局部组件
3.2 使用构造器创建并使用局部组件
我们可以使用构造器创建局部组件,
示例代码如下:
<div id="app-one">
<!-- 3. 在注册了局部组件的实例中使用局部组件 -->
<my-component></my-component>
</div>
<div id="app-two">
<!-- 当前的这个实例并没有注册局部组件,所以会报错 -->
<my-component></my-component>
</div>
<script>
// 1. 使用构造器创建组件配置
let MyComponent = Vue.extend({
template: `
<div>
<h2>我想被创建为局部组件</h2>
</div>
`,
})
// 注册局部组件的实例
const vm = new Vue({
el:"#app-one",
// 2. 注册为只能在当前实例中使用的局部组件
components: {
"my-component": MyComponent
}
})
// 没有注册局部组件的实例
new Vue({
el:"#app-two",
})
</script>
示例说明:
- 通过
extend
方法创建Vue构造器 - 在Vue选项对象中,通过
components
选项将构造器创建为局部组件, -
components
选项值是一个对象,对象的属性是组件的名称,值是将要被创建为组件的构造器或选项对象 - 没有注册局部组件的实例对象是不能使用其它实例中的局部组件,
因此示例的实例中app-two
中是不能使用组件my-component
的,会报错
3.3 直接通过选项对象来创建组件
前一小节有讲过我们可以直接将选项对象注册为全局组件, 同样的我们也可以直接将选项对象注册为局部组件,Vue内部会将选项对象进行处理
示例代码如下:
<div id="app-one">
<!-- 3. 在注册了局部组件的实例中使用局部组件 -->
<my-component></my-component>
</div>
<script>
// 1. 创建局部组件的选项对象
let MyComponent = {
template: `
<div>
<h2>我想被创建为局部组件</h2>
</div>
`,
}
const vm = new Vue({
el:"#app-one",
// 2. 将选项对象注册为局部组件
components: {
"my-component": MyComponent
}
})
</script>
通过对比我们就会发现直接将选项对象注册为局部组件要来的简单一点,所以推荐使用选项对象创建组件的方式,无论是全局组件还是局部组件
这种使用选项对象直接注册为组件的方式被称作为组件注册语法糖