在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,也会有相同的部分。例如可能会有相同的头部导航。
但是如果每个页面都独自开发,这无疑增加了我们开发的成本。所以为了提高代码复用,我们会把页面的可复用部分拆分成独立的组件,然后在不同页面就可以共享这些组件,避免重复开发。

第1个组件案例

有如下需求:在页面上要定义多个记录点击次数的按钮,我们使用之前的所学,可以这么做:

<div id="app"><button @click="increment1">你点了我{{count1}}次,我记住了</button><button @click="increment2">你点了我{{count2}}次,我记住了</button>
</div><script >const vm = new Vue({el:"#app",data:{count1:0,count2:0},methods:{increment1(){this.count1++;},increment2(){this.count2++;}}})
</script>

注意:不同的按钮,必须操作不同的属性,如果使用同1个属性,多个按钮的点击次数会累加到一起。如果按钮的数量要求更多,按照这种方式,无法代码复用,影响开发效率而且代码也不易维护。

解决方案:可以将需要复用的代码定义成组件,通过组件进行复用。
1.注册组件

<script >Vue.component("button-counter",{template:"<button @click='increment'>你点了我{{count}}次,我记住了</button>",data:function(){return {count:0}},methods:{increment(){this.count++;}}})
</script>
  • 通过component方法注册组件
  • 第1个参数表示组件名
  • 第2个参数表示组件的组成,组件本质上也是一个Vue实例,也就可以定义:data、methods等等
  • 组件在定义时,不会和任何页面元素绑定,因此没有el属性。但多了template属性抽取html片段
  • data必须是一个函数,后面解释

2.使用组件

<div id="app"><button-counter></button-counter><button-counter></button-counter>
</div>
  • 把组件名当作标签直接使用就可以
    3.创建vue实例
<div id="app"><!-- 2 使用组件 --><button-counter></button-counter><button-counter></button-counter>
</div><script >//1 注册组件Vue.component("button-counter",{template:"<button @click='increment'>你点了我{{count}}次,我记住了</button>",data:function(){return {count:0}},methods:{increment(){this.count++;}}})//3 创建vue实例const vm = new Vue({el:"#app"})
</script>
  • 因为组件会被多次使用,所以定义组件时,语法上要求data必须是一个函数,每次使用时返回一个新的对象。
  • 组件要在Vue实例中使用,所以最后一定要创建Vue实例。

还有2点需要注意:

  • 组件名如果由多个单词组成,按照规范多个单词全小写,并使用-连接,比如 button-counter。如果使用驼峰命令法,比如 buttonCounter,那么在使用组件时,也需要在单词间添加 -。
  • 组件中 template只能有一个根标签,比如实例中只有一个div根标签。如果又有一个同级的div就会报错。
template:"<div><button>按钮</button><br></div>"                  //对
template:"<button @click='increment'>你点了我{{count}}次,我记住了</button>"    //对
template:"<div><button>按钮<button></div><div></div>"           //错误,2个div根标签

组件的注册方式

组件的注册方式有2种:全局注册 和 局部注册

1.全局注册

全局注册的组件,可以在不同的Vue实例中使用。语法如下:

<script>Vue.component("组件名",{template:"复用的html片段",data:function(){return {...}//return的对象,类似于创建Vue实例时的data},methods:{//和定义Vue实例时一样,用于定义函数}})
</script>

第1个案例就是全局注册,这里不再演示。

2.局部注册

一旦全局注册,就意味着即便以后你不再使用这个组件,它依然会随着Vue的加载而加载。因此,对于一些并不频繁使用的组件,我们会采用局部注册。在Vue实例中添加选项 components 语法如下:

<script>const vm = new Vue({el:"选择器",data:{//属性},components:{//注册局部组件"组件名":{template:"复用的html片段",data:function(){return {...}//return的对象,类似于创建Vue实例时的data},methods:{//和定义Vue实例时一样,用于定义函数}}}});
</script>

示例:

<div id="app"><button-counter></button-counter><button-counter></button-counter>
</div>
<script>const vm = new Vue({el:"#app",components:{"button-counter":{template:"<button @click='increment'>你点了我{{count}}次,我记住了</button>",data:function(){return {count:0}},methods:{increment(){this.count++;}}}}})</script>

3.注册优化

优化1:将组件参数单独抽取成变量
当Vue实例中注册的组件比较多时,Vue实例的代码就会变得非常臃肿,不利于代码管理,此时可以将Vue实例参数抽取成变量。

<script>const buttonCounter = {template:"<button @click='increment'>你点了我{{count}}次,我记住了</button>",data:function(){return {count:0}},methods:{increment(){this.count++;}}};const vm = new Vue({el:"#app",components:{"button-counter":buttonCounter}})</script>

说明:组件注册时,如果组件名和组件变量名同名,还可以简写:

components:{ buttonCounter:buttonCounter }
// ==> 直接只写一个
buttonCounter即可 components:{ buttonCounter }

优化2:将html片段抽取到template标签中
当template中的html片段比较复杂时,在组件参数中直接定义html片段非常麻烦,此时可以将html片段抽取到特殊的template标签中。

<template id="bc"><!-- 再次提示:template标签中也必须只有一个根标签 --><button @click='increment'>你点了我{{count}}次,我记住了</button>
</template>
<script>const buttonCounter = {template:"#bc",data:function(){return {count:0}},methods:{increment(){this.count++;}}};const vm = new Vue({el:"#app",components:{"button-counter":buttonCounter}})</script>

4.组件和is属性(了解)

在html标签中使用组件时,受到 HTML 本身的一些限制。比如table、ul、select内部只能出现特定的子标签,如果在这些标签中使用组件,组件无法正确显示。解决方案:使用is属性

<div id="app"><h4>直接在table中使用table-body组件</h4><table border="1"><thead><tr><th>id</th><th>name</th><th>age</th><th>gender</th></tr></thead><!-- 直接使用组件--><table-body></table-body></table><h4>在table中通过is属性使用table-body组件</h4><table border="1"><thead><tr><th>id</th><th>name</th><th>age</th><th>gender</th></tr></thead><!-- 通过is属性使用组件 --><tbody is="table-body"></tbody></table>
</div><template id="table-body"><tbody><tr v-for="u in users" :key="u.id"><td>{{u.id}}</td><td>{{u.name}}</td><td>{{u.age}}</td><td>{{u.gender}}</td></tr></tbody>
</template><script>const tableBody = {template:"#table-body",data(){return {users: [{"id":1, "name": "小明", "age": 13, "gender": "男"},{"id":2, "name": "小红", "age": 13, "gender": "女"},{"id":3, "name": "小绿", "age": 4, "gender": "男"}]}}}const vm = new Vue({el:"#app",components:{"table-body":tableBody}})
</script>

注:第二部分的全部内容整合成pdf文档,可以进行下载保存

https://download.csdn.net/download/technologist_28/21114069

Vue第二部分(1):组件基础学习相关推荐

  1. Vue学习之组件基础学习

    目录 组件开发 一.组件的结构与注册 1.1 组件的data必须是函数,且必须返回一个实例对象(对象内部保存着数据) 1.2 组件的组织 1.3 局部组件与全局组件 "我的附庸的附庸不是我的 ...

  2. 大数据生态系统组件基础学习

    这是学习大数据这一整套各种组件MySQL,hive,spark,mapreduce等等的一些基础语法,日常更新,有不对的地方欢迎指正,资料也是自己收集来的,若有侵权,联系我立马删. MySQL (一) ...

  3. vue路由和视图组件--个人学习总结

    Vue脚手架项目是一个单页面的应用,即整个项目中只有1个html页面,它认为这个页面是由若干个视图组合而成的,每个视图都只是该页面中的一个部分,并且,都是可以被替换的, 在Vue 脚手架项目中,以.v ...

  4. SpringMVC基础学习之Controller的两种实现方式和RequstMapping注解的使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...

  5. SpringMVC基础学习之Restful风格的简单使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...

  6. Mybatis基础学习之一级缓存和二级缓存的简单使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个Mybatis ...

  7. vue学习第八天——组件基础

    基本示例(官网找去) 因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data.computed.watch.methods 以及生命周期钩子等.仅有的例外是像 e ...

  8. Vue基础学习笔记Day06_动态组件_插槽_自定义指令

    今日目标: 能够了解组件进阶知识 能够掌握自定义指令创建和使用 学习内容: 学习目录: 组件进阶 自定义指令 今日总结 面试题 知识点自测 组件创建, 注册和使用 - 伸手就来特别熟练 指令的作用 1 ...

  9. 前端学习——VUE组件基础

    文章目录 一 基本示例 1.1 基本使用 1.2 基础复用 1.2.1 复用方式 1.2.2 组件data必须为函数 二 组件的组织与注册 三 自定义组件属性 3.1 prop 3.2 v-bind自 ...

最新文章

  1. python web-python web入坑指南
  2. 开始学习python的感受
  3. 数据库查找出list数据,进行处理
  4. 经典C语言程序100例之九一
  5. 垃圾回收算法与垃圾回收器
  6. mysql存储过程触发器游标_MySQL存储过程,触发器,游标
  7. 【ElasticSearch】ElasticSearch 中使用衰减函数来完美你的搜索结果
  8. 计算机视觉CV中RANSAN算法的学习笔记
  9. Anaconda安装后找不到conda.exe
  10. angularjs笔记,基本指令,字符串反转,过滤器
  11. python网址编码转换_刚学python,抓中文网页遇到编码的问题,怎么转换也不行……...
  12. put与putIfAbsent区别
  13. BLM业务战略规划的底层逻辑是什么?
  14. android 远程桌面软件,安卓上的远程桌面软件:Xtralogic Remote Desktop Client
  15. 应用安全系列之二十六:应用层DOS攻击
  16. 商品的spu、sku及其之间的关系
  17. 排序算法lowb三人组-冒泡排序
  18. 关于DSP的SCI通信学习
  19. Makefile中wildcard使用方法
  20. 1.488Mpps是如何计算出来的

热门文章

  1. MagicMongoDBTool数据管理工具使用介绍
  2. 7-31总结----javascript
  3. C/C++编程笔记:经典游戏植物大战僵尸游戏辅助,源码送上
  4. 一个程序员的全部,并不是“技术”!知道为什么只能当码农吗?
  5. 飞秋局域网聊天是一种技术工作
  6. 用VC++实现console程序显示彩色文本
  7. 保存工具条菜单有bug吗?
  8. 2020 年 7 个软件开发趋势
  9. lisp 线性标注自动避让_《数据标注工程》第一章学习笔记及作业:数据标注概述...
  10. 颉伟/郭勇/李伟合作阐释哺乳动物早期胚胎发育中表观重编程和基因印记的进化保守性和物种特异性...