Vue.js 作为当前的热门框架之一,之前大部分情况下是被介绍作轻量级、高性能的 MVVM 框架。随着 Vue.js 2.0 的发布,以及框架作者尤雨溪先生在 2016 年底的 NingJS 大会上也介绍说,Vue.js 的核心库只关注视图层,是一套构建用户界面的渐进式框架。而所谓的渐进式在于既可以使用 Vue.js 开发一个最简单的静态页面,也可以使用它开发一个复杂的单页面应用,并且是一个逐步进行的过程,不需要把之前的推翻重来,仅仅在需要的时候引进 Vue.js 生态中提供的插件即可,如路由、状态管理等功能。
本课程将从零开始逐步介绍 Vue.js 及其特性,从最基础的页面开发,到单页应用及使用状态管理来构建大型应用,期间会运用具体的实例和常见的真实场景来进行阐述,希望帮助开发者能快速掌握 Vue.js 的开发方式以及选择合适自己项目的方式来进行构建。
陈陆扬,《Vue.js 前端开发快速入门与专业应用》作者,先后在百度、去哪儿担任前端开发。2014 年投身创业公司,现为新东方旗下精雕细课前端负责人。常用技术栈为 Vue/React + Node.js,目前主要专注于在线课程内容编辑器的研发。
使用任何新框架和库其实都是为了解决我们当前开发所遇到的问题,或者能提升其开发效率。每个人的成本就是时间,好的工具则能够帮助我们节约时间,从项目角度而言,也就帮我们节约了成本。而 Vue.js 就是一款能降低开发成本、提升开发效率的工具,它能帮助我们从繁琐的 DOM 操作中解脱出来。开发中,我们设定好正确视图和数据的规则后,只需要关注数据的变化,视图上的内容是会随之变化的,而不需要我们手动再操作 DOM 元素进行修改。
此外,前端开发的模式也逐渐开始往组件化方向转变,Web Components 的概念也开始逐渐成为标准,拥有自己独立的 HTML 片段、JS 文件以及 CSS 样式,这样在使用时可以不用担心对自己本身业务上的代码造成影响。Vue.js 对这一概念也进行了自己的实现,这样对于提升代码复用、拆解大型项目,都有着很好的帮助。
Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能模拟的 ECMAScript 5 特性。Vue.js 支持所有兼容 ECMAScript 5 的浏览器。
本系列将从零开始介绍 Vue.js,内容安排如下:
期望能使帮助开发者快速掌握 Vue.js,了解其使用方式和使用场景,并构建可上线的真实项目。
本系列的文章适合以下人群阅读:
本系列内容采用 Vue.js 版本为 2.5.6,大部分代码都会使用 ES6,希望读者对 ES6 有一定的了解。
Vue.js 最大的特点之一就是数据驱动视图,也就是说当数据发生变化时,视图(即用户界面)也随之发生变化,而不需要我们手动去更新 DOM 元素。
上图中的视图很好理解,就是我们开发的用户页面,即 DOM 元素;模型则为在这个页面上包含的数据以及业务逻辑,即 JavaScript 对象;而视图模型就是将这两者联系起来的方式,也就是通过 Vue.js 来编写的内容。
组件是 Vue.js 中的重要概念,大部分的应用界面都可以被抽象成组件或多个组件的组合。简单来讲,组件就是一段封装好的、拥有自己独立 HTML 模板、CSS 样式和 JS 的代码段,且被使用的时候不会影响页面上的其他代码。而在 Vue.js 中,可以这么去理解组件:
如果说前端之前考虑的都是如何开发“页面”,那在使用 Vue.js 的过程,我们需要把“页面”这一个略显庞大、多样的概念逐渐转变成高内聚、单一功能的“组件”概念,而页面则变成了多个单一功能组件叠加后的结果。
按照惯例,我们还是先会使用 Vue.js 来构建一个 Hello World 的页面。
首先是引用方式,可以直接在 HTML 插入 script 标签,像引用任何一个简单的 JS 文件一样。
引入后得到了一个全局 Vue 的对象,可以直接用 new 的方式新建一个 Vue 的实例:
var vm = new Vue({ ... })
然后下一步就是如何与 DOM 元素建立联系,并且渲染内容了。
{{ message }}
如图所示,我们得到了一个理所当然的 Hello World!
从上面这个例子可以看到几个具体的用法:
{{ }}
来标明这一部分内容是需要被实例中的数据重新渲染的。我们称之为声明式渲染(Declarative Rendering)。当然,如果 Vue.js 仅仅做了这一次数据渲染的工作,那就变成了前端模板引擎,而不是什么 mvvm 框架了。
那如何体现 Vue.js 的数据驱动视图的特点呢?我们可以手动调用上例中的 vm,修改 vm 中的 message 数据(可以在浏览器的 console 里面直接修改)。
vm.message = 'Hello GitChat'
可以看到 #app 元素中渲染的内容就变成了“Hello GitChat”,而在这个过程中,我们没有手动去获取并修改 DOM 值,这一操作就完全交由 Vue 来实现了,我们只是事先声明好了渲染规则,也就是建立了数据与视图的绑定。
Vue 的实例就是通过 new Vue() 的方式建立的,每个 Vue 的应用也都是由此开始的。
在创建 Vue 实例的时候,我们可以传入一个选项对象,大致包含以下几种,这里先简单介绍一下。
createElement
方法来创建VNode
。这里没有必要一下子全部记住或理解,这些选项的使用方式和规则都会逐渐贯穿在整个课程当中,在使用时会逐一详细解释。
Vue 实例在被创建之前有一系列的初始化过程。例如,设置数据监听、编译模板并挂载到指定 DOM 元素上、绑定事件等,而在实例被销毁后也需要进行取消监听、移除元素等操作。这一个从开始到结束的过程称之为实例的生命周期,而在整个过程中,Vue.js 会在特定的时机运行特定的函数,并允许用户将自己的业务代码传递进来,这些函数被称之为生命周期钩子函数(Lifecycle Hooks)。
这是 官网 给出生命周期图,具体所包含生命周期包括 create(创建)、mount(挂载)、update(更新)、destory(销毁)阶段还有一个activated(激活)阶段(需要包裹在 < keep-alive> 标签下才会触发)。
下面来看下这些阶段所包含的钩子函数和使用区别:
具体效果及运行顺序可以参考该 示例。
刚开始的时候,我们经常会纠结于如何设置目录结构,特别是在多人开发构建大型项目的时候,如果目录没有一个清晰的描述和规划往往会导致项目的混乱和冲突。Vue.js 提供了一个官方的命令行工具 Vue-cli,能帮助我们快速构建单页应用结构,并提供许多方便开发的功能:
那如何来安装和使用 vue-cli 呢?非常方便,首先需要安装 Node 和 NPM 环境,可以访问 官网 直接下载对应操作系统的安装包进行安装。
安装成功之后,通过命令行安装 vue-clic:
npm install -g vue-cli
这样我们就可以全局使用 vue-cli 命令行了。vue-cli 支持以下 6 种模式的脚手架:
我们可以使用以下命令行来选择脚手架进行安装:
vue init (上面6种名称任选其一) (新建的项目名)
以 Webpack 为例:
我们可以依次输入项目名称、描述、作者等描述信息,然后也可以选择所需要的功能,如路由、ESlint、单元测试、E2E 测试等。
生成的目录结构如下:
然后我们就可以根据上图的提示,进入文件目录,安装依赖并运行项目
npm insall
npm run dev
Webpack 在此的作用是将可以分析项目结构,根据依赖,加载对应的模块,并对指定的模块(如 ES6 编写的 JS,SCSS 编写的 CSS)进行编译,使之能在浏览器中正常运行。
只要使用合适的 Loader,Webpack 就可以将所有文件都当做模块来进行处理,输出你想要的结果。而在此将使用Vue-loader(Vue-cli 已在 Webpack 脚手架中已配置好)使得项目的开发更清晰,更符合组件化的特点。
所以我们在该脚手架中看到的 App.vue 的写法会是:
这和首个 Hello World 的例子看起来并不一样,在 .vue 文件中,HTML、JS 和 CSS 分别被包含在 template、script、style 标签中,这和我们之前说的组件化相当契合,独立的模板和样式,以及 JS 代码。当然,这样的写法直接放到浏览器中当然是无法运行的,所以在此配置了 Webpack + Vue-loader,可以将这样写法的代码编译成浏览器可执行的 HTML、JS 和 CSS 代码。
以上大致介绍了 Vue.js 中的数据绑定和组件化两大重要概念,实现了第一个 Vue.js 的 Hello World。Vue.js 可以接受一个选项对象,创建实例,每个实例包含自己的生命周期。在编写大型项目的时候,我们往往会使用 vue-cli 来构建项目,并且通过 Webpack 和 Vue-loader 可以用组件化的方式来开发 Vue.js 项目。
阅读全文: http://gitbook.cn/gitchat/column/5a3765c9d7fd13649973a41d