Vue组件

代码吟游使
• 阅读 1395

组件系统

组件可以扩展 HTML 元素,封装可重用的代码。

vue.js的核心组件:

  1. 模板(template)——模板声明了数据和最终展现给用户的DOM之间的映射关系。
  2. 初始数据(data)——一个组件的初始数据状态。对于可复用的组件来说,通常是私有的状态。
  3. 接受的外部参数(props)——组件之间通过参数来进行数据的传递和共享。参数默认是单向绑定(由上至下),但也可以显式声明为双向绑定。
  4. 方法(methods)——对数据的改动操作一般都在组件的方法内进行。可以通过v-on指令将用户输入事件和组件方法进行绑定。
  5. 生命周期钩子函数(lifecycle hooks)——一个组件会触发多个生命周期钩子函数,比如createdattacheddestroyed等。在这些钩子函数中,我们可以封装一些自定义的逻辑。和传统的MVC相比,这可以理解为Controller的逻辑被分散到了这些钩子函数中。
  6. 私有资源(assets):Vue.js当中将用户自定义的指令过滤器组件等统称为资源。由于全局注册资源容易导致命名冲突,一个组件可以声明自己的私有资源。私有资源只有该组件和它的子组件可以调用。
  7. 除此之外,同一棵组件树之内的组件之间还可以通过内建的事件API来进行通信。Vue.js提供了完善的定义、复用和嵌套组件的API,让开发者可以像搭积木一样用组件拼出整个应用的界面。这个思路的可行性在Facebook开源的React当中也得到了印证。

基于构建工具的单文件组件格式

Vue.js的核心库只提供基本的API,本身在如何组织应用的文件结构上并不做太多约束。但在构建大型应用时,推荐使用 Webpack+vue-loader 这个组合以使针对组件的开发更高效。

Webpack是由Tobias Koppers开发的一个开源前端模块构建工具。它的基本功能是将以模块格式书写的多个JavaScript文件打包成一个文件,同时支持CommonJS和AMD格式。但让它与众不同的是,它提供了强大的loader API来定义对不同文件格式的预处理逻辑,从而让我们可以将CSS、模板,甚至是自定义的文件格式当做JavaScript模块来使用。Webpack 基于loader还可以实现大量高级功能,比如自动分块打包并按需加载对图片资源引用的自动定位根据图片大小决定是否用base64内联开发时的模块热替换等等,可以说是目前前端构建领域最有竞争力的解决方案之一。

其他特性

Vue.js还有几个值得一提的特性:

  1. 异步批量DOM更新:当大量数据变动时,所有受到影响的watcher会被推送到一个队列中,并且每个watcher只会推进队列一次。这个队列会在进程的下一个 “tick” 异步执行。这个机制可以避免同一个数据多次变动产生的多余DOM操作,也可以保证所有的DOM写操作在一起执行,避免DOM读写切换可能导致的layout。
  2. 动画系统:Vue.js提供了简单却强大的动画系统,当一个元素的可见性变化时,用户不仅可以很简单地定义对应的CSS TransitionAnimation效果,还可以利用丰富的JavaScript钩子函数进行更底层的动画处理。
  3. 可扩展性:除了自定义指令过滤器组件,Vue.js还提供了灵活的mixin机制,让用户可以在多个组件中复用共同的特性。

使用Prop传递数据

组件实例的作用域是孤立的。这意味着不能(也不应该)在子组件的模板内直接引用父组件的数据。要让子组件使用父组件的数据,我们需要通过子组件的 props 选项。

子组件要显式地用 props 选项声明它期待获得的数据。

Vue.component({
        props: ['message'],
        template: '<span>{{message}}</span>'
    });

父子组件通信

Vue 中子组件可以通过通过事件和父组件进行通信的。向父组件发消息是通过 this.$dispatch,而向子组件发送消息是通过 this.$boardcast

数据绑定的实现原理

Vue 把双向绑定称作 reactive,可以翻译为响应式数据绑定。内部是通过 ES5 定义的 gettersetter 方法实现的,所以不支持 IE8 及以下浏览器,这种实现方式有两个容易犯错的地方:

  • 如果在 data 上直接添加和删除属性是无法被检测到的,一般删除是不会的,但是可能会动态添加,这个时候应该通过 vm.$set(“name”, value) 的方式来添加。
  • 无法检测到对象内部的变化,也就是只能检测 data 的属性变化,如果 data.a 是一个对象,那么 data.a.b = 1 这种变化是无法被检测到的。这种情况下应该创建一个新的对象并赋值给 data.a 就行了。

异步更新机制

Vue 对DOM的更新是异步的! 这个异步是在一个异步队列中进行的,不过这个异步队列会在当前的 Event Loop 中执行完,所以如果修改了 Data 立刻去DOM中做查询操作是不对的,这个时候DOM还没有更新,正确的做法是这样做:

vm.msg = 'new message' // change data
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
 vm.$el.textContent === 'new message' // true
})

或者这样:

vm.$nextTick(function () {
 this.$el.textContent === 'new message' // true
})
点赞
收藏
评论区
推荐文章
Chase620 Chase620
4年前
vue的8种通信方式
1.props/emit1.父组件向子组件传值下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中如何获取父组件section.vue中的数据articles:\'红楼梦','西游记','三国演义'\//section父组件<template<divclass"section"
如何从0开始搭建 Vue 组件库
组件设计是通过对功能及视觉表达中元素的拆解、归纳、重组,并基于可被复用的目的,形成规范化的组件,通过多维度组合来构建整个设计方案,將这些组件整理在一起,便形成组件库。本文我们主要讲述基于VantCLI的自建组件库。VantCLI是一个基于Vite实现的Vue组件库构建工具,通过VantCLI可以快速搭建一套功能完备的Vue组件库。
Easter79 Easter79
4年前
Vue 组件数据通信方案总结
本文首发于政采云前端团队博客:Vue组件数据通信方案总结https://www.zoo.team背景初识Vue.js,了解到组件是Vue的主要构成部分,但组件内部的作用域是相对独立的部分,组件之间的关系一般如下图:!(https://oscimg.oschina.net/osc
Easter79 Easter79
4年前
TypeScript Generics(泛型)
软件工程的一个主要部分就是构建组件,构建的组件不仅需要具有明确的定义和统一的接口,同时也需要组件可复用。支持现有的数据类型和将来添加的数据类型的组件为大型软件系统的开发过程提供很好的灵活性。在C和Java中,可以使用"泛型"来创建可复用的组件,并且组件可支持多种数据类型。这样便可以让用户根据自己的数据类型来使用组件。泛型的简单案例首先,
Easter79 Easter79
4年前
Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构
框架简介主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具组件、视图操作组件、工作流组件组件、代码生成等。采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。平台简介    是一个分布式的框架,提供项目模块化、服务化、热插拔的思想,高
可莉 可莉
4年前
10+个很酷的VueJS组件,模板和实验示例
众所周知,Vue.js组件是Vue创建自定义元素的重要功能之一,同时,模板可帮助你避免从头开始创建网页设计。总之,这些工具对于希望其开发过程更快,更高效的任何Web开发人员都是必不可少的。此外,在过去的几年中,Vue.js变得非常流行,许多企业将其添加到他们的技术栈中。该框架的优点是它具有内置的数据绑定和MVC模型(模型、视图、控制器),
Wesley13 Wesley13
4年前
2.初步认识Angular2
简述:一个完整的Angular应用主要由六个重要部分构成,分别是:组件,模板,指令,服务,依赖注入,和路由.这些组成部分各司其职,而又紧密协作.其中,与用户直接打交互的是模板视图,它是构成组件的要素之一.另一要素是组件类,用以维护组件的数据模型及功能逻辑.路由的功能是控制组件的创建和销毁,从而驱使应用界面跳转切换/指令与模板相互关联,最重要
Wesley13 Wesley13
4年前
2020.8.07 微信小程序(组件封装)
今天说一下微信小程序组件的封装…为什么要封装组件?写组件的目的就是为了复用,它的好处太多了a.写更少的代码。b.减少开发时间。c.代码的bug更少。d.占用的字节更少。…组件复用使我们的代码组织变得非常灵活。那么组件到底怎么封装,其实就和vue组件封装的思
Stella981 Stella981
4年前
Lightning Web Components html_templates(三)
LightningWebComponents强大之处在于模版系统,使用了虚拟dom进行智能高效的组件渲染。使用简单语法以声明方式将组件的模板绑定到组件的JavaScript类中的数据数据绑定我们可以使用{property}绑定组件模版属性到一个组件js类中的属性一个简单的例子组件class
提升前端开发效率的五种实用技术
组件化开发是一种将页面拆分成独立的可重用组件的开发方式。通过组件化开发,我们能够将复杂的界面逻辑拆分成独立的模块,提高代码的复用性和维护性。常用的组件化框架如React、Vue和Angular,它们提供了强大的组件化开发能力,使我们能够轻松构建复杂的用户界面,并提供了组件的生命周期管理和状态管理机制。