详解vue组件基础


Posted in Javascript onMay 04, 2018

什么是组件

组件(Component)是对数据和方法的简单封装。web中的组件其实可以看成是页面的一个组成部分,它是一个具有独立的逻辑和功能的界面,同时又能根据规定的接口规则进行相互融和,最终成为一个完整的应用,页面就是由一个个类似这样的组成部分组成的,比如导航、列表、弹窗、下拉菜单等。页面只不过是这样组件的容器,组件自由组合形成功能完整的界面,当不需要某个组件,或者想要替换某个组件时,可以随时进行替换和删除,而不影响整个应用的运行。、前端组件化的核心思想就是将一个巨大复杂的东西拆分成粒度合理的小东西。

使用提高开发效率、方便重复使用、简化调试步骤、提升整个项目的可维护性、便于协同开发。

vue作为一个轻量级前端框架,其核心就是组件化开发。

组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用 is 特性进行了扩展的原生 HTML 元素。

vue中,组件是可复用的 Vue 实例。因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

组件注册

全局注册

通过 Vue.component 来创建组件:

Vue.component('my-component-name', {
 // ... 选项 ...
 })

这些组件是全局注册的。也就是说它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。比如:

Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })

new Vue({ el: '#app' })

<div id="app">
 <component-a></component-a>
 <component-b></component-b>
 <component-c></component-c>
</div>

在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。

局部注册

全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:

var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }

然后在 components 选项中定义你想要使用的组件:

new Vue({
 el: '#app'
 components: {
 'component-a': ComponentA,
 'component-b': ComponentB
 }
})

对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。
注意局部注册的组件在其子组件中不可用。例如,如果你希望 ComponentA 在 ComponentB 中可用,则你需要这样写:

var ComponentA = { /* ... */ }

var ComponentB = {
 components: {
 'component-a': ComponentA
 },
 // ...
}

使用Babel和webpack中的注册组件

import ComponentA from './ComponentA.vue'

export default {
 components: {
 ComponentA
 },
 // ...
}

注意在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:

用在模板中的自定义元素的名称
包含了这个组件选项的变量名

基础组件的自动化全局注册

没看懂。

data 必须是一个函数

data: {
 count: 0
}

这样定义的data中的变量是全局变量,在使用组件时,在一个组件中修改变量的值,会影响到所有组件中该变量的值。为避免变量干扰,一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝:

data: function () {
 return {
 count: 0
 }
}

动态组件

在不同组件之间进行动态切换是非常有用的,比如在一个多标签的界面里:

详解vue组件基础

上述内容可以通过 Vue 的 <component> 元素加一个特殊的 is 特性来实现:

<!-- 组件会在 `currentTabComponent` 改变时改变 -->
<component v-bind:is="currentTabComponent"></component>

你会注意到,如果你选择了一篇文章,切换到 Archive 标签,然后再切换回 Posts,是不会继续展示你之前选择的文章的。这是因为你每次切换新标签的时候,Vue 都创建了一个新的 currentTabComponent 实例。

重新创建动态组件的行为通常是非常有用的,但是在这个案例中,我们更希望那些标签的组件实例能够被在它们第一次被创建的时候缓存下来。为了解决这个问题,我们可以用一个 <keep-alive> 元素将其动态组件包裹起来。

<!-- 失活的组件将会被缓存!-->
<keep-alive>
 <component v-bind:is="currentTabComponent"></component>
</keep-alive>

可以在这里查看动态组件例子。https://jsfiddle.net/chrisvfritz/Lp20op9o/

dom标签内使用组件

有些 HTML 元素,诸如 <ul>、<ol>、<table> 和 <select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li>、<tr> 和 <option>,只能出现在其它某些特定的元素内部。

这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:

<table>
 <blog-post-row></blog-post-row>
</table>

这个自定义组件 <blog-post-row> 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is 特性给了我们一个变通的办法:

<table>
 <tr is="blog-post-row"></tr>
</table>
Javascript 相关文章推荐
AJAX架构之Dojo篇
Apr 10 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
jQuery实现的AJAX简单弹出层效果代码
Nov 26 Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 Javascript
即将发布的jQuery 3 有哪些新特性
Apr 14 Javascript
JS如何判断json是否为空
Jul 06 Javascript
浅谈JS之tagNaem和nodeName
Sep 13 Javascript
js仿微博动态栏功能
Feb 22 Javascript
Vue导出json数据到Excel电子表格的示例
Dec 04 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
微信小程序合法域名配置方法
May 06 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 #Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 #jQuery
Vue.js 踩坑记之双向绑定
May 03 #Javascript
Vue利用canvas实现移动端手写板的方法
May 03 #Javascript
Node.Js中实现端口重用原理详解
May 03 #Javascript
原生JS实现的雪花飘落动画效果
May 03 #Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 #Javascript
You might like
目录,文件操作详谈―PHP
2006/11/25 PHP
php 结果集的分页实现代码
2009/03/10 PHP
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
Vue infinite update loop的问题解决
2019/04/23 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
python K近邻算法的kd树实现
2018/09/06 Python
对Python实现累加函数的方法详解
2019/01/23 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
Python wordcloud库安装方法总结
2020/12/31 Python
Born鞋子官网:Born Shoes
2017/04/06 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
秋天的雨教学反思
2014/04/27 职场文书
租房安全协议书
2014/08/20 职场文书
工作收入证明范本
2015/06/12 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL