简介

在了解了Vue语法的基础知识和常用特性之后,在进行正式的开发之前,非常有必要的对组件化的相关知识进行了解。本文就是为介绍组件的相关知识点的。

1、组件化开发思想

现实生活中的组件化思想主要是:标准,分治,重用和组合。而软件上的组件化思想,其实都是对上面所说的进行抽象表示,然而每种语言所用的标准可能又不相同。

组件化规范:Web Components

但是这个规范并不是所有的浏览器都支持

  • 我们希望尽可能多的重用代码
  • 自定义组件的方式不太容易(html,css和js
  • 多次使用组件可能导致冲突

Web Components 通过创建封装好功能的定制化元素来解决上述问题。

其官网地址为:https://developer.mozilla.org/zh-CN/docs/Web/Web_Components。

Vue部分的实现了上述规则。

2、组件注册

2.1 全局组件注册语法

Vue.component(组件名称 ,{data: 组件数据,template: 组件模板内容
})

以下是定义组件的具体例子。

// 定义一个名为button-counter的新组件
Vue.component('button-counter',{data: function () {return {count : 0}},template : '<button v-on:click="count++">点击了{{count}}次。</button>'
})

2.2 组件的用法

<div id="app"><button-counter></button-counter>
</div>
<div id="app"><button-counter></button-counter><button-counter></button-counter><button-counter></button-counter>
</div>

2.3 组件注册的注意事项

  • data 必须是一个函数

    • 分析函数和普通对象的对比
  • 组件模板内容必须是单个根元素

    • 分析演示实际的效果
  • 组件模板内容可用是模板字符串

    • 模板字符串需要浏览器提供支持(ES6语法)
    • 即模板内容使用反引号(tab键上面那个键)包裹,可多行显示,可读性强。(正常是用单引号包裹的)
  • 组件命名方式

    • 短横线方式
    • 驼峰方式
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}
})

局部组件只能在组测它的父组件中使用,其他地方不可以使用。

3、Vue调试工具

3.1 安装调试工具

在官网的生态系统菜单下可找到 Devtools

安装步骤:

  • 克隆仓库
  • 安装依赖包
  • 构建
  • 打开chrome扩展页面
  • 选中开发者模式
  • 加载已经解压的扩展,选中shells/chrome

安装后如下图所示:

可用很直观的查看组件之间的层次关系。

4、组件间的数据交互

4.1 父组件向子组件传值

1、组件内部通过props接收传递过来的值

Vue.component('menu-item',{props: ['title'],data: function() {return {msg: '子组件本身的数据'}}template:'<div>{{ msg + "-------" + title }}</div>'
})

2、父组件通过属性将值传递给子组件

<menu-item title="来自父组件的数据"></menu-item>
<menu-item :title="title"></menu-item>

3、props属性名规则

  • props中使用驼峰形式,模板中需要使用短横线的形式

  • 字符串形式的模板中没有这个限制

Vue.component('menu-item', {// 在javascript中是驼峰式的props: ['menuTitle'],template: '<div>{{ menuTitle }}</div>'
})
<!-- 在html中是短横线方式的 -->
<menu-item menu-title="nihao"></menu-item>

4、props属性值类型

  • 字符串 String
  • 数值 Number
  • 布尔值 Boolean
  • 数组 Array
  • 对象 Object

4.2 子组件向父组件传值

props传递数据原则:单项数据流。即父组件可通过props向子组件传递数据,不建议通过props从子组件向父组件传值。

1、子组件通过自定义事件向父组件传递信息

<button v-on:click='$emit("enlarge-text")'>扩大字体</button>

2、父组件监听子组件的事件

<menu-item v-on:enlarge-text='fontSize += 0.1'></menu-item>

3、子组件通过自定义事件(带参数)向父组件传递信息

<button v-on:click='$emit("enlarge-text",0.1)'>扩大字体</button><!--父组件处理事件-->
<menu-item v-on:enlarge-text='fontSize += $event'></menu-item>

4.3 非父子组件间传值

1、单独的事件中心管理组件间的通信

var eventHub = new Vue()

2、监听事件与销毁事件

eventHub.$on('add-todo',addToDo)
eventHub.$off('add-todo')

3、触发事件

eventHub.$emit('add-todo',id)

可参考下图所示

5、组件插槽

5.1 组件插槽的作用

  • 父组件向子组件传递内容

5.2 组件插槽级别用法

1、插槽位置

Vue.conmponent('alert-box', {template: `<div class="demo-alert-box"><strong>Error:</strong><slot>默认内容</slot></div>`
})

2、插槽内容和显示效果

<alert-box>有一个bug</alert-box>
<alert-box>有一个警告</alert-box>
<alert-box></alert-box><!--显示如下-->
Error:有一个bug
Error:有一个警告
Error:默认内容

5.3 具名插槽用法

1、插槽定义

<div class="container"><header><slot name="header"></slot></header><main><slot></slot></main><footer><slot name="footer"></slot></footer>
</div>

2、插槽内容

<base-layout><h1 slot=="header">标题内容</h1><p>主要内容1</p><p>主要内容2</p><p name="footer">底部内容</p>
</base-layout>
<base-layout><tempalte slot=="header"><h1>标题内容</h1><h1>标题内容</h1></tempalte><p>主要内容1</p><p>主要内容2</p><tempalte name="footer"><p>底部内容</p><p>底部内容</p></tempalte>
</base-layout>

5.4 作用域插槽

  • 应用场景:父组件对子组件的内容进行加工处理。

1、插槽定义

<ul><li v-for="item in list" v-bind:key="item.id"><!--bind后的item是自定义的,引号中的item是上面的--><slot v-bind:item="item">{{ item.name }}</slot></li>
</ul>

2、插槽内容

<fruit-list v-bind:list="list"><template slot-scope="slotProps"><!--此处显示了加工处理的情况--><strong v-if="slotProps.item.current">{{ slotProps.item.text}}</strong></template>
</fruit-list>

总结

组件化的开发,可以让我们在实际的项目中对很多公共的功能进行抽取,从而实现重用。当然,本文中的很多知识点不是只看看就能理解的,需要手动的编码去感受代码的实现细节,并加深理解。接下来是关于前后的交互的相关总结,有兴趣的也可看看。

Vue学习笔记(二) —— 组件开发相关推荐

  1. Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画

    文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...

  2. Springboot学习笔记(二)Web开发

    前言: 学习B站UP主狂神说视频笔记整理视频链接 狂神笔记链接 上篇笔记链接-Springboot学习笔记(一)快速上手 Web开发 静态资源 在以往的SpringMVC中所有静态资源或者页面应该放在 ...

  3. Vue学习笔记02 = 组件化

    目录 一.组件化基本概念 什么是组件化?组件化有什么作用? 人面对复杂问题的处理方式: 组件化也是类似的思想: Vue组件化思想: 组件化思想的应用: 二.组件的基本使用: 2.1.创建组件的构造器. ...

  4. 【Vue】Vue学习笔记——UI组件库和常用插件

    文章目录 6. UI组件库和常用插件 6.1 Element-ui 6.2 Vue-router 6.2.1 基本用法 6.2.2 跳转 6.2.3 路由嵌套 6.2.4 路由参数传递 6.3 Axi ...

  5. 少侠请重新来过 - Vue学习笔记(二) - Vue生命周期

    Vue 生命周期和钩子 每一个vue实例创建时,会经历一段初始化的过程,同时会调用其生命周期钩子,实例的钩子this指向它的Vue实例,不需要在钩子用箭头函数. <template>< ...

  6. vue学习笔记(1)-组件通信

    vue.js官方教程上讲的也挺清楚的了,自己整理一遍以加深印象,同时也完成自己的项目中需要的动态创建表单提交编辑修改功能. 表单主要是v-model双向绑定实现父组件与子组件的双向数据传递,所以首先说 ...

  7. Vue学习笔记(八) 组件进阶

    1.插槽 (1)插槽内容 像 HTML 元素一样,我们常常需要给组件传递内容 比如在下面的例子中,我们给自定义组件 prompt-info 传入 出错啦 的文本 <!DOCTYPE html&g ...

  8. Vue学习笔记_组件化

    文章目录

  9. Vue学习笔记(二)组件化和模块化

    Vue学习笔记(二)组件化和模块化 前言 组件化 什么是组件化 1.基础使用 2.全局组件和局部组件 3.语法糖和模板抽离 4.组件的data为什么是函数 5.父子组件 5.1 父子组件 5.2 父子 ...

  10. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

最新文章

  1. Python数据挖掘:绘制直方图,设置上下限和步长,绘制子图
  2. apache2.0性能优化
  3. LVS负载均衡群集的了解与基本配置(一)
  4. 各种协议中的协议类型对应的值
  5. Linux 进程管理命令之pidof
  6. 回到网易后开源APM技术选型与实战
  7. 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作
  8. Opencv——基于索引表的图像细化
  9. ios开发-教程选择
  10. c语言通讯录程序设计个人感言,C语言学习感悟(1)
  11. dpkg安装软件流程_Linux下安装软件的一般步骤
  12. Ubuntu傻瓜式录制GIF图—— Peek
  13. html怎么偏左居中,word文档偏左怎么调到中间
  14. 学计算机有那些方向,计算机专业的研究生研究方向有哪些
  15. 《梦的解析》读后感(来给自己解解梦吧)
  16. Qt QPainter::end: Painter ended whith 2 saced states
  17. 怎么把图片转换成PDF文件?
  18. 9大论坛、多项AI创新成果,Imagination邀您共聚 AIIA2020人工智能开发者大会
  19. 新库上线 | 税收调查企业专利及引用被引用数据
  20. 数据结构 — 浅析红黑树原理以及实现

热门文章

  1. 集设作品灵感|App夜间模式如何设计?
  2. 电商大促首焦背景素材|大火C4D元素
  3. 超火网络直播短视频宣传海报PSD分层模板,新媒体互动
  4. 网页ui设计模板素材|液体流动效果!
  5. asp.net web开发框架_Python之Web开发框架学习 发送电子邮件
  6. c语言猜拳游戏实验报告,《猜拳小游戏》--一个c语言写的小项目
  7. easyui打开新的选项卡_Jquery Easyui选项卡组件Tab使用详解(10)
  8. Vue项目部署到CentOS服务器
  9. 使用DM框架实现一个小的计算器
  10. QT保留小数点后位数