详解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 相关文章推荐
PJBlog插件 防刷新的在线播放器
Oct 25 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
Jan 24 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 Javascript
第十篇BootStrap轮播插件使用详解
Jun 21 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
Dec 27 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
Feb 16 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
微信小程序实现导航栏选项卡效果
Jun 19 Javascript
vue基础之data存储数据及v-for循环用法示例
Mar 08 Javascript
js字符串处理之绝妙的代码
Apr 05 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
Jun 11 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的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
JavaScript 事件系统
2010/07/22 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python读写unicode文件的方法
2015/07/10 Python
Python yield与实现方法代码分析
2018/02/06 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
pytorch 共享参数的示例
2019/08/17 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
2019/08/22 Python
基于python的列表list和集合set操作
2019/11/24 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
大学生简历中个人的自我评价
2013/10/06 职场文书
语文教学感言
2014/02/06 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
用python修改excel表某一列内容的操作方法
2021/06/11 Python