跳转至

第11章 Vue

第 11 章

Vue

本章要学习的 Vue 是一套用于构建用户界面的渐进式框架,同时也是一个 JavaScript 框架。任何编程语言在最初的时候都是没有框架的,随着在实际开发过程中不断总结经验,积累最佳实践,慢慢地,人们发现很多特定场景下的特定问题总是可以套用固定的解决方案。于是有人把成熟的固定解决方案收集起来,整合在一起就成了框架。在使用框架的过程中,我们往往只需要告诉框架做什么(声明),而不需要关心框架怎么做(编程)。

对于 Java 程序来说,我们使用框架就是导入那些封装了固定解决方案的 jar 包,然后通过配置文件告诉框架做什么,从而大大简化编码,提高开发效率。例如,JUnit 其实就是一款单元测试框架。而对于 JavaScript 程序来说,我们使用框架就是导入那些封装了固定解决方案的 JS 文件,然后在框架的基础上编写代码实现业务逻辑。

Vue 框架提供了一套开发规则,按照这个开发规则可提高开发效率。Vue 框架是轻量级的,有很多独立的功能或库,使用 Vue 时可以根据项目需求来选用它的一些功能。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。本章主要介绍 Vue 的基本语法和生命周期,以及如何应用,如声明式渲染、条件渲染、列表渲染、事件驱动等。

11.1 Vue 简介与入门案例

Vue 的作者是尤雨溪,Vue 最早发布于 2014 年 2 月。作者在 Hacker News、Echo JS 与 Reddit 的 JavaScript 版块发布了最早的版本。一天之内,Vue 就登上了这三个网站的首页。Vue 是 Github 上最受欢迎的开源项目之一。

Vue 最初的目标是成为大型项目的一个良好补充,“渐进式框架” 的设计思想是为了遵循淡化框架本身的主张,从而降低框架作为工具的复杂度,以及对使用者的要求。

Vue 是为了实现前后端分离的开发理念,开发前端 SPA(single page web application)项目,实现数据绑定、路由配置、项目编译打包等一系列工作的技术框架。Vue 有著名的全家桶系列,包含了 vue-router、vuex、vue-resource,再加上构建工具 vue-cli、sass 样式,就是一个完整的 vue 项目的核心构成。概括起来就是项目构建工具、路由、状态管理、HTTP 请求工具。

由于 Vue.js 只聚焦视图层,本质上说是一个构建数据驱动的 Web 界面的库。Vue 通过简单的 API(应用程序编程接口)提供高效的数据绑定和灵活的组件系统。Vue 的特点如下。

Vue.js 的两大核心要素是数据驱动和组件化。数据驱动,简单来说就是修改绑定的数据(页面上依赖的数据)就能对应地更新视图(页面),这样一来极大地解放了 DOM 操作的工作,提高开发效率。组件化开发通常是将一个应用以一棵嵌套组件树的形式来组织,把页面按照页面功能(如导航、侧边栏、下拉框)拆分业务,每个组件代表一个独立的功能,从而大大提高了代码可维护性和复用性。

Vue 数据驱动采用 MVVM 模式,M(Model)指的是模型层,这里表示 JavaScript 对象,V(View)指的是视图层,这里表示 DOM(HTML 操作的元素),VM(ViewModel)指的是连接视图和数据的中间

件,Vue.js 就是 MVVM 中的 VM 层的实现者。Vue 与 MVVM 模式的关系如图 11-1 所示。

在 MVVM 架构中,是不允许数据和视图直接通信的,只能通过 VM 层来通信,而 VM 本质就是一个观察者。VM 能够观察到数据的变化,并对视图下对应的内容进行更新;还能够监听到视图的变化,并通知数据发生改变。综上,Vue.js 就是一个 MVVM 的实现者,它的核心就是实现了 DOM 监听和数据绑定。

18e9386b4971ae0d45ac1ca3e008c202f24fd87bd599d66854a8f810a85a2320.jpg

下面通过入门案例,来简单了解一下 Vue 的使用。

Vue 是 JavaScript 的框架,使用 Vue 开发需要引入该框架的源码,Java 的框架源码是 JAR 包形式,那么 JS 框架的源码是什么类型的文件呢?答案一目了然,就是 JS 文件。接下来以 Vue2.7.14 为例进行演示。首先搭建 Vue 框架,具体步骤如下。

搭建完成后的 HTML 文件如下。

例如,创建一个 span 标签和一个按钮,单击按钮修改 span 标签的内容。接下来分别用 JavaScript 代码和 Vue 代码实现该案例效果。

使用 JavaScript 实现的代码如下。

查看页面效果,如图 11-2 所示。

单击该按钮,发现值发生变化,如图 11-3 所示。

56a5f2e90ab3f7aebed1357d3b08b511fbaae0135844f3bf665ffe2324cc8a08.jpg

999f3e12582a48241b4effb7b12920361439dccf701fc8e50e8b3fb002438f60.jpg

使用 Vue 实现的代码如下。

查看页面单击按钮,同样能实现相同的效果。Vue 的实现原理是将 span 的标签体内容和 Vue 的数据模型做一个绑定关系,一旦绑定成功,要想操作 span 的内容,直接操作 msg 的值即可。显而易见,如果页面内有很多位置,都需要操作 span 内容时,Vue 代码比 JS 更方便。

11.2 模板语法

随着前端交互复杂度的不断提升,各种字符拼接、循环遍历、DOM 节点的操作也都复杂多变,当数据量大,交互频繁的时候,不论是从用户体验还是性能优化上,都会面临前端渲染的问题。

Vue 使用了一种基于 HTML 的模板语法,使我们能够声明式地将应用或组件实例的数据绑定到呈现的 DOM 上。模板中除了 HTML 的结构,还包含两个 Vue 模板的特有语法:插值语法和指令语法。插值语法只有一个功能,就是向标签体插入一个动态的值。指令语法用来操作所在的标签,比如指定动态属性值、绑定事件监听、控制显示隐藏等。

在底层机制中,Vue 会将模板编译成高度优化的 JavaScript 代码。结合响应式系统,当应用状态数据变更时,Vue 能够自动更新需要变化的 DOM 节点,并做到最小化更新。

下面分别对插值和指令进行具体讲解。

11.2.1 插值语法

插值语法是用来向标签体插入一个动态的数据值。插值语法的结构很固定,是用双大括号包含一个 JavaScript 表达式,像这样:{{JavaScript 表达式}}。值得一提的是,插值语法只可以作为一个标签的标签体文本或者文本的一部分,不能作为标签的一个属性值。双大括号中可以包含任意 JavaScript 表达式,除此之外,它包含的也可以是一个常量值、一个变量,还可以是一个变量对象的方法调用,甚至可以是一个三目表达式。

但是需要注意的是,模板中变量读取数据的来源都是配置指定的 data 对象。虽然还有其他的数据来源,在这里我们暂时只需要理解为 data 对象。

例如,来看一段简单的 Vue 使用实例。

上面代码使用插值语法分别包含了常量 “123”、变量 “msg”、变量对象的方法调用 “msg.toUpperCase ()”,以及三目表达式 “score<60?‘入学测试未通过,暂时不可以来尚硅谷学习’:‘入学测试通过,欢迎来尚硅谷学习’”。由于模板中的所有变量读取的都是 data 中的数据,除了常量 “123” 不需要读取数据,后三者都会读取 data 中对应的值。此时页面中输出的效果如图 11-4 所示。

11.2.2 指令语法

指令(Directives)是带有 “v-” 前缀的标签属性,其属性值一般是一个 JavaScript 表达式。Vue 中包含了一些不同功能的指令,比如 v-bind 用来给标签指定动态属性值,v-on 用来给标签绑定事件监听,v-if 和 v-show 用来控制标签是否显示。但要注意,不管是什么功能的指令,它们操作的都是指令属性所在的标签。

下面以 v-bind 与 v-on 为例来演示一下指令语法的使用,v-bind 与 v-on 两个属性的语法格式如下。

示例代码如下。

上面这段代码使用了 v-bind 指令为 标签指定了动态属性值 url,此时 标签的 href 的值就是 data 中定义的 url 的值,上面代码还在