本篇将简单介绍一下Vue.js,并在Node.js环境下搭建一个简单的Demo。

一、简介

我个人理解,Vue.js是一套前端视图层的框架,它只关心视图展示和数据绑定,它的一些语法与Angular 1非常相似,如果有Angular 1相关的使用经验,上手会非常快。

相比较其他的React、Angular 2等MVVM框架,它更加的轻量,效率也更高,也能更好的与其他库集成。

它拥有以下几个出色的特性:

    • 数据双向绑定
    • 指令
    • 模板
    • 组件

当前最新的版本为2.1.4。后续也会在这个版本下演示Demo。

二、环境准备

下载安装Node.js环境,安装成功后在命令行窗口依次执行以下命令:

  1. > npm install bower -g
  2. > npm install express-generator -g

安装完成后进入工程目录(随意新建一个目录),依次执行以下命令,创建一个名为vue-demo的项目:

  1. > express vue-demo --view=ejs
  2. > cd vue-demo
  3. > npm install
  4. > bower init
  5. > bower install requirejs --save
  6. > bower install vue --save

所有命令执行成功后,在项目根目录手动增加一个名为.bowerrc文件,内容如下

  1. {
  2. "directory": "public/plugins/"
  3. }

为了后面显示的demo页面好看一点,再引入bootstrap。这步不是必须的

  1. > bower install bootstrap --save

最终的目录结构如下

三、Hello World

按照惯例,学习一个新的语言,都要先问候一下我们这个精彩的世界。修改 views/index.ejs 文件内容

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3.  
  4. <head>
  5. <meta charset="utf-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1">
  8. <title>Index</title>
  9.  
  10. <!-- Bootstrap -->
  11. <link href="plugins/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
  12. </head>
  13.  
  14. <body>
  15. <div id="app" class="container">
  16. <input type="text" v-model="message" />
  17. <p>{{message}}</p>
  18. </div>
  19.  
  20. <!-- requirejs main -->
  21. <script src="plugins/requirejs/require.js" data-main="javascripts/index.js"></script>
  22. </body>
  23.  
  24. </html>

在 public/javascrips 目录里新建一个文件 index.js ,内容如下

  1. /// <reference path="../plugins/requirejs/require.js" />
  2.  
  3. require.config({
  4. baseUrl: "plugins",
  5. paths: {
  6. jquery: "jquery/dist/jquery.min",
  7. bootstrap: "bootstrap/dist/js/bootstrap.min",
  8. vue: "vue/dist/vue.min"
  9. }
  10. });
  11.  
  12. require(['jquery', 'bootstrap', 'vue'], function ($, bootstrap, Vue) {
  13. var vm = new Vue({
  14. el: "#app",
  15. data: {
  16. message: "Hello world!"
  17. }
  18. });
  19. });

在命令行窗口的项目目录下执行命令 npm start ,访问 http://localhost:3000/

修改文本框里的内容,下方文字也会跟着变化

这是一个简单的双向数据绑定的例子。通过Vue类型构造了一个根实例,分别给 el 属性赋值需要绑定的页面元素ID,给 data 属性赋值需要绑定的数据。在页面里,通过给 input 元素添加指令 v-model ,绑定到数据的message属性。在 p 元素里通过表达式 {{message}} 绑定message属性。这样页面就能直接展示绑定的数据内容,在改变 input 的内容时,也能同步改变下方文本内容。

四、属性、方法

通过Vue实例可以直接访问绑定的数据的属性。修改 index.js 文件内容:

  1. require(['jquery', 'bootstrap', 'vue'], function ($, bootstrap, Vue) {
  2. var d = {
  3. message: "Hello world!"
  4. };
  5.  
  6. var vm = new Vue({
  7. el: "#app",
  8. data: d
  9. });
  10.  
  11. // 属性代理
  12. console.log('vm.message = ' + vm.message);
  13. console.log('vm.message === d.message? ' + (vm.message === d.message));
  14. });

访问页面,查看浏览器控制台显示如下:

从上面的例子可以看到, vm 实例“代理”了绑定的数据对象,通过实例可以直接访问数据对象里的属性。

除了能“代理”数据对象, vm 实例也有一些内置属性和方法,这些属性和方法都有 $ 前缀。再修改 index.js 内容:

  1. require(['jquery', 'bootstrap', 'vue'], function ($, bootstrap, Vue) {
  2. var d = {
  3. message: "Hello world!"
  4. };
  5.  
  6. var vm = new Vue({
  7. el: "#app",
  8. data: d
  9. });
  10.  
  11. // 属性代理
  12. console.log('vm.message = ' + vm.message);
  13. console.log('vm.message === d.message? ' + (vm.message === d.message));
  14.  
  15. console.log('vm.$data = ' + JSON.stringify(vm.$data));
  16. console.log('vm.$data === d? ' + (vm.$data === d));
  17.  
  18. console.log('vm.$el = ' + vm.$el);
  19. console.log('vm.$el === div.#app? ' + (vm.$el === document.getElementById('app')));
  20.  
  21. // 内置方法
  22. vm.$watch('message', function (oldVal, newVal) {
  23. console.log('oldVal is: ' + oldVal);
  24. console.log('newVal is: ' + newVal);
  25. });
  26. });

刷新页面,查看控制台:

  • $data:Vue实例的数据对象。通过这个属性可以访问到原始数据对象。
  • $el:Vue实例挂载的DOM元素对象。

修改页面文本框的内容,查看控制台:

$watch:Vue实例监视属性变化的内置方法。当被监视的属性改变时,将会触发这个方法。

五、生命周期钩子

Vue也提供了在实例化时各个状态变化过程中触发的事件方法。修改 index.js 内容:

  1. require(['jquery', 'bootstrap', 'vue'], function ($, bootstrap, Vue) {
  2. var d = {
  3. message: "Hello world!"
  4. };
  5.  
  6. var vm = new Vue({
  7. el: "#app",
  8. data: d,
  9. beforeCreate: function () {
  10. console.log('beforeCreate is triggered.')
  11. },
  12. created: function () {
  13. console.log('created is triggered.')
  14. },
  15. beforeMount: function () {
  16. console.log('beforeMount is triggered.')
  17. },
  18. mounted: function () {
  19. console.log('mounted is triggered.')
  20. },
  21. beforeUpdate: function () {
  22. console.log('beforeUpdate is triggered.')
  23. },
  24. updated: function () {
  25. console.log('updated is triggered.')
  26. },
  27. beforeDestroy: function () {
  28. console.log('beforeDestroy is triggered.')
  29. },
  30. destroyed: function () {
  31. console.log('destroyed is triggered.')
  32. }
  33. });
  34. });

刷新页面,查看控制台:

修改文本框内容,查看控制台:

  • beforeCreate:在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。
  • created:实例已经创建完成之后被调用。这个时候数据观测(data observer),属性和方法的运算,watch/event 事件回调已经完成。
  • beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。
  • mounted: el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。
  • beforeUpdate:数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
  • updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。这个时候DOM已经更新完成。
  • beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
  • destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

下面是完整的生命周期图示:

Vue.js学习笔记(一) - 起步的更多相关文章

  1. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  2. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  3. Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

    f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  4. Vue.js——学习笔记(一)

    Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...

  5. Vue.js——学习笔记

    Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...

  6. Vue.js 学习笔记之二:数据驱动开发

    在 Vue.js 框架中,与 HTML 页面元素的交互方式没有像原生 JavaScript 接口那么直接,它是通过先在 HTML 元素标签中嵌入一系列类似于普通标签属性的 Vue 指令属性来绑定数据, ...

  7. Vue.js 学习笔记之三:与服务器的数据交互

    显而易见的,之前的02_toDoList存在着一个很致命的缺陷.那就是它的数据只存在于浏览器端,一但用户关闭或重新载入页面,他之前加入到程序中的数据就会全部丢失,一切又恢复到程序的初始状态.要想解决这 ...

  8. Vue.js 学习笔记之四:Vue 组件基础

    到目前为止,这个系列的笔记所展示的都是一些极为简单的单页面 Web 应用程序,并且页面上通常只有几个简单的交互元素.但在实际生产环境中,Web 应用程序的用户界面往往是由多个复杂的页面共同组成的.这时 ...

  9. Vue.js 学习笔记之五:编译 vue 组件

    正如上一篇笔记中所说,直接使用 ES6 标准提供的模块规范来编写 Vue 组件在很多情况下可能并不是最佳实践.主要原因有两个,首先是市面上还有许多并没有对 ES6 标准提供完全支持的 Web 浏览器, ...

随机推荐

  1. Java基础-面向对象第一特性之封装(Encapsulation)

    Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...

  2. HTTP协议(1)-------- 网络编程

    1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...

  3. 新建springboot项目启动出错 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

    错误信息入下: 2018-06-23 01:48:05.275 INFO 7104 --- [ main] o.apache.catalina.core.StandardService : Stopp ...

  4. 六、强大的 Stream API

    一.了解 Stream Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*).Stream 是 Java8 中处 ...

  5. spring框架学习(五)整合JDBCTemplate

    1.导包 2.JdbcTemplate package cn.cnki.JdbcTemplate; import java.util.List; import org.junit.Test; impo ...

  6. 三个你不知道的CSS技巧

    各种浏览器之间的竞争的白热化意味着越来越多的人现在开始使用那些支持最新.最先进的W3C Web标准的设备,以一种更具交互性的方式来访问互联网.这意味着我们终于能够利用更强大更灵活的CSS来创造更简洁, ...

  7. asp.net后台操作javascript:confirm返回值

    在asp.net中使用confirm可以分为两种: 1.没有使用ajax,confirm会引起也面刷新 2.使用了ajax,不会刷新 A.没有使用ajax,可以用StringBuilder来完成. ( ...

  8. 天梯赛 L2-023. (模拟) 图着色问题

    题目链接 题目描述 图着色问题是一个著名的NP完全问题.给定无向图 G = (V, E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解决这 ...

  9. 2016.5.19——vector型的输入输出

    vector型的输入输出 在上节2015.5.18——leetcode:Majority Element中纠结vector的动态输入输出问题,但是发现vector传参型的不可以动态输入输出,但是vec ...

  10. python装饰器三种装饰模式的简单理解

    学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了! 这里就简单讨论下python的几种装饰模式: 一 无参装饰器: # 装饰器 import time ...