一、组件化开发概述
1.组件化开发思想
标准
分治:不同的功能分配到不同的组件中
重用:
组合
2.编程中的组件化思想体现
3.组件化规范:
Web Components
我们希望尽可能多的重用代码
自定义组件的方式不太容易(html、css和js)
多次使用组件可能导致冲突
Web Components通过创建封装好功能的定制元素解决上述问题
Vue部分实现了上述规范
不同的功能封装到不同的组件中,组件可以组合以形成完整的应用
二、组件的注册
2.1 全局组件注册语法
Vue.component(组件名称,{
data:组件数据,
template:组件模板内容
})
例:
1 // 定义一个名为button-counter的组件
2 Vue.component('button-counter',{
3 data:function(){
4 return{
5 count:0
6 }
7 },
8 template:``
9 });
2.2 组件的用法
1
注:组件可以重用,且组件之间是相互独立的
2.3 组件注册注意事项
1.data必须是一个函数
分析函数与普通对象的对比
2.组件模板内容必须是单个的根元素
分析实际演示效果
3.组件模板内容可以是模板字符串
模板字符串需要浏览器提供支持(ES6语法)
4.组件的命名方式
短横线
Vue.component('my-component',{/*…*/})
驼峰式
Vue.component('MyComponent',{/*…*/})
如果使用驼峰式命名组件,那么在使用组件的时候,只能在字符串模板中用驼峰的方式使用组件,但是在普通的标签模板中,必须使用短横线的方式使用组件
2.4 局部组件注册
var ComponentA = { /* … */}
var ComponentB = { /* … */}
var ComponentC = { /* … */}
new Vue({
el:'#app',
components:{
'component-a':ComponentA,
'component-b':ComponentB,
'component-c':ComponentC,
}
})
1 var HelloWorld = {
2 data:function(){
3 return{
4 msg:'Hello World'
5 }
6 },
7 template:`
注:局部组件只能在父组件中使用,不能在其他的组件中使用
三、Vue调试工具
3.1 调试工具安装
(1) 克隆仓库
(2) 安装依赖包
(3) 构建
(4) 打开Chrome扩展页面
(5) 选中开发者模式
(6) 加载已解压的扩展,选择shells/chrome
四、组件间数据交互
4.1 父组件向子组件传值
1.子组件中通过props接收父组件传递过来的内容,具体通过属性名来接收
2.父组件通过属性将值传递给子组件,属性绑定有两种方式,一是写死,二是动态绑定
3.属性可以传递多个,具体可以在props中多加参数
1
1 Vue.component('menu-item',{
2 props:['title','content'],
3 data:function(){
4 return{
5 msg:'子组件自身的数据'
6 }
7 },
8 template:`
4.2 props属性名规则
1.在props中使用驼峰的形式,模板中需要使用短横线的形式
2.字符串形式的模板中没有这个限制
1
1 Vue.component('third-com',{
2 props:['testTitle'],
3 template:`
4.3 props属性值类型
字符串 String
数值 Number
布尔值 Boolean
数组 Array
对象 Object 1
3 字符串 String
4 数值 Number
5 布尔值 Boolean
6 数组 Array
7 对象 Object
8 -->
9
10
1 Vue.component('menu-item',{
2 props:['pstr','pnum','pboo','parr','pobj'],
3 template:`
4.4 子组件向父组件传值
注:props传递数据原则: 单向数据流,只允许父组件向子组件传递数据,不允许子组件直接操作props的数据
1. 子组件通过自定义事件向父组件传值
2. 父组件监听子组件事件
1
1 /*
2 props传递数据原则: 单向数据流,只允许父组件向子组件传递数据,不允许子组件直接操作props的数据
3 */
4 Vue.component('menu-item',{
5 props:['parr'],
6 template:`
7
3. 子组件通过自定义事件向父组件传递消息
4. 父组件监听子组件的事件
$event是固定的
1
1 Vue.component('menu-item',{
2 props:['parr'],
3 template:`
4
4.5 非父子组件间传值
1. 单独的事件中心管理组件间的通信
var eventHub = new Vue()
2. 监听事件与销毁事件
eventHub.$on('add-todo',addTodo)
eventHub.$off('add-todo')
3. 触发事件
eventHub.$emit('add-todo',id)
1
1 // 提供事件中心
2 var hub = new Vue();
3
4 Vue.component('test-tom',{
5 data:function(){
6 return{
7 num:0
8 }
9 },
10 template:`
11
五、组件插槽
5.1 组件插槽的作用
父组件向子组件传递内容
5.2 组件插槽的基本用法
1.插槽的位置
Vue.component('alert-box',{
template:`
Error!
`
})
2.插槽的位置
1
1 Vue.component('alert-box',{
2 template:`
3
5.3 具名插槽用法
1.插槽定义
2.插槽内容
主要内容1
主要内容2
底部内容
5.4 作用域插槽
应用场景:父组件对子组件内容进行加工处理
六、基于组件的案例 - 购物车
6.1 按照组件化的方式实现业务需求
根据业务功能进行组件化划分
(1) 标题组件 展示文本
(2) 列表组件 列表展示、商品数量变更、商品删除
(3) 结算组件 计算商品总额
实现整体布局和样式效果
划分独立的功能组件
组合所有的子组件形成整体结构
逐个实现各个组件功能
标题组件
列表组件
结算组件
手机扫一扫
移动阅读更方便
你可能感兴趣的文章