组件是vue非常重要的内容,组件可以扩展 HTML 元素,封装可重用的代码。
组件是可复用的Vue实例,说白了就是一组可以重复使用的组件模板,跟JSTL的自定义标签、Thymeleaf 的th:fragment以及Sitemesh3 框架有着异曲同工之妙。通常一个应用会以一棵嵌套的组件树的形式来组织:
在页面开发时,可能页面里会用到相同的模块,比如顶部的菜单栏,左边的侧边栏等等,这些都是相同的模块。每次写代码都要写重复的代码,所以需要实现代码的复用来减少代码量,而组件可以定义模板,从而达到复用代码的作用。
当然,组件的作用不仅是减少复用,因为可以嵌套,所以组件里面又可以套组件,这样一层层组件,无限套娃。
组件的定义
我们的组件都只是通过 Vue.component 全局注册的:
Vue.component('my-component-name', {
// ... options ...
})
注册一个全局组件语法格式如下:
Vue.component(tagName, options)
tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:
<tagName></tagName>
vue组件的示例:
<div id="app">
<my-component></my-component><!-- 利用组件名来使用定义的“模板” -->
</div>
<script>
Vue.component('my-component',{ // “my-component”是组件名
template: '<div><span>我的模板</span></div>' //template参数是模板的内容
})
var vm = new Vue({
el: '#app'
})
</script>
全局注册
组件的注册类型:全局注册和局部注册。
全局注册的组件可以用在其被注册之后的任何 (通过 new Vue) 新创建的 Vue 根实例,也包括其组件树中的所有子组件的模板中。
比如:
<div id="app">
<component-a></component-a>
<component-b></component-b>
<component-c></component-c>
</div>
Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })
//创建根实例
new Vue({ el: '#app' })
在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。
局部注册
全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。
在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:
var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }
new Vue({
el: '#app',
components: {
'component-a': ComponentA,
'component-b': ComponentB
}
})
注意局部注册的组件在其子组件中不可用。例如,如果你希望 ComponentA 在 ComponentB 中可用,则你需要这样写:
var ComponentA = { /* ... */ }
var ComponentB = {
components: {
'component-a': ComponentA
},
// ...
}
参数传递
上面组件的数据是写死的,如果我们想实现传递参数到组件,需要用到props。
props 是子组件用来接受父组件传递过来的数据的一个自定义属性。
父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 “prop”:
<div id="app">
<ul>
<my-component-li v-for="item in items" :item1="item"></my-component-li>
</ul>
</div>
<script>
// 注册
Vue.component('my-component-li', {
// 声明 props
props: ['item1'],
template: '<li>{{item1}}</li>'
})
// 创建根实例
new Vue({
el: '#app',
data:{
items:['吃饭','睡觉','学习']
}
})
</script>
说明:
- v-for=“item in items” :遍历Vue 实例中定义的名为items的数组,并创建同等数量的组件
- v-bind:item1=“item” :将遍历的item 项绑定到组件中props定义的名为item1 属性上; =号左边的item1为props定义的属性名,右边的为item in items 中遍历的item项的值
自定义事件
props是父组件向子组件传递消息,如果想要从子组件向父组件传递信息,需要用到自定义事件
可以看看这篇文章:vue自定义事件
插槽
和组件相关的还有一个比较重要的内容,就是插槽,这里可以看下这篇博客:vue插槽详解
目前就是对组件有一个简单的了解,这里推荐一个文章,写的比较具体一点:传送门