是什么
是一个对象。绝大部份情况下,一个组件就是页面上的某个区域
组件包含该区域的:
- 内容(模版代码)
- 样式(css代码) 要在组件中包含样式,需要构建工具的支撑
- 功能(js代码)
意义
组件出现的意义:
- 降低整体代码的复杂度,提升代码的可读性和可维护性 将粗粒度划分为细粒度 粒度的单位是整个网站
- 提升局部代码的可复用性
组件开发
创建组件
组件是根据一个普通的配置对象创建的,所以,要开发一个组件,只需写一个配置对象
// 组件配置对象
var myComp = {
data(){
return {
count: 0
}
},
template:`
<button>点击了{{count}}次</button>
`
}
为什么data要配置为一个函数? 为了可以复用,因为每次复用的时候,就会重新调用函数,得到一个新的对象,这样就避免了组件之间的数据相互影响。
就算是复用同一个组件,但每一个组件之间是不同的实例。
注册组件
创建完组件之后页面还是没东西,他都不知道组件往哪里放。
所以,创建完之后还要注册,注册完之后才能使用组件。
注意:注册完不代表页面显示内容!只代表可以使用。
注册组件分为两种方式:全局注册和局部注册。
全局注册
注册完之后,任何地方都可以使用这个组件
如下图:
如何全局注册?
Vue.component('组件名称',配置对象)
Vue.component('MyBtn',myComp)
注册完才可以使用,如何使用?
var vm = new Vue({
el:'#app',
template:`
<MyBtn />
`
})
局部注册(推荐)
在vue实例里配置components
var vm = new Vue({
el:'#app',
data: {
},
components:{
MyBtn: myComp
},
template:`
<MyBtn />
`
})
应用组件
必须要有/结束
<MyBtn />
命名方式
-
短横线命名法(kebab-case)
<my-btn /> -
大驼峰命名法(PasCalCase)(推荐) 有的组件可能只有一个单词,可能会和html元素冲突
<MyBtn />
组件树
向组件传递数据
组件中的data函数是自己的数据,把从外部传递给组件的数据叫做组件的属性。
props: 声明组件的属性
举例说明:
<div id="app"></div>
// 创建组件
var Title = {
props:['biaoti1','biaoti2'],
template:`
<div>
<h1>{{biaoti1}}</h1>
<h2>{{biaoti2}}</h2>
</div>
`
}
var vm = new Vue({
el:'#app',
// 注册组件
components:{
Title
},
// 使用组件
template:`
<div>
<Title biaoti1="标题1" biaoti2="标题1-1"/>
</div>
`
})
注意:在组件中,属性是只读的,绝不可以更改,这叫做单向数据流。
组件内部不可以更改属性!!
工程结构
因为项目里会有很多组件,我们需要有一个合理的结构来组织这些组件。 那么,按照什么结构来写呢?
-
在项目中建立src文件夹
-
建立入口文件mian.js,在index.html里引入该js
<script src="./src/main.js" type="module"></script> -
在main.js里创建vue实例 (1). 创建实例之前先引入Vue构造函数
import Vue from './vue.broswer.js'(2). 创建vue实例,挂载到id为app的元素上去
(3). 实例里只做一件事:渲染组件。不用写data和配置,剩下的事情全部交给组件完成。render里创建根组件
new Vue({ // components:{ // App // }, // template:`<App />`, // 相当于 render(h){ // 渲染组件 return h(App) } // 简化 //render:(h) => h(App) }).$mount('#app') // 实例挂载到id为app的元素上 -
创建根组件对象App.js,在入口文件里渲染根组件
import App from './App.js' -
创建子组件,在根组件里引入并注册子组件文件
// 引入子组件 import MyBtn from './components/MyBtn.js' // 导出根组件 export default{ components:{ // 注册子组件 MyBtn }, template:` <div> <h1>App组件</h1> <MyBtn /> </div> ` }