Vue.js——60分钟快速入门

 

Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。相比于Angular.js,Vue.js提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js。

本文摘自:http://www.cnblogs.com/keepfool/p/5619070.html

如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM。它通过一些特殊的HTML语法,将DOM和数据绑定起来。一旦你创建了绑定,DOM将和数据保持同步,每当变更了数据,DOM也会相应地更新。

当然了,在使用Vue.js时,你也可以结合其他库一起使用,比如jQuery。

本文的Demo和源代码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或在GitHub上加个星星!

v-for Demo v-bind Demo Page Demo GitHub Source

MVVM模式

下图不仅概括了MVVM模式(Model-View-ViewModel),还描述了在Vue.js中ViewModel是如何和View以及Model进行交互的。

ViewModel是Vue.js的核心,它是一个Vue实例。Vue实例是作用于某一个HTML元素上的,这个元素可以是HTML的body元素,也可以是指定了id的某个元素。

当创建了ViewModel后,双向绑定是如何达成的呢?

首先,我们将上图中的DOM Listeners和Data Bindings看作两个工具,它们是实现双向绑定的关键。
从View侧看,ViewModel中的DOM Listeners工具会帮我们监测页面上DOM元素的变化,如果有变化,则更改Model中的数据;
从Model侧看,当我们更新Model中的数据时,Data Bindings工具会帮我们更新页面中的DOM元素。

Hello World示例

了解一门语言,或者学习一门新技术,编写Hello World示例是我们的必经之路。
这段代码在画面上输出"Hello World!"。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7.  
  8. <body>
  9. <!--这是我们的View-->
  10. <div id="app">
  11. {{ message }}
  12. </div>
  13. </body>
  14. <script src="js/vue.js"></script>
  15. <script>
  16. // 这是我们的Model
  17. var exampleData = {
  18. message: 'Hello World!'
  19. }
  20.  
  21. // 创建一个 Vue 实例或 "ViewModel"
  22. // 它连接 View 与 Model
  23. new Vue({
  24. el: '#app',
  25. data: exampleData
  26. })
  27. </script>
  28. </html>

使用Vue的过程就是定义MVVM各个组成部分的过程的过程。

  1. 定义View
  2. 定义Model
  3. 创建一个Vue实例或"ViewModel",它用于连接View和Model

在创建Vue实例时,需要传入一个选项对象,选项对象可以包含数据、挂载元素、方法、模生命周期钩子等等。

在这个示例中,选项对象el属性指向View,el: '#app'表示该Vue实例将挂载到<div id="app">...</div>这个元素;data属性指向Model,data: exampleData表示我们的Model是exampleData对象。
Vue.js有多种数据绑定的语法,最基础的形式是文本插值,使用一对大括号语法,在运行时{{ message }}会被数据对象的message属性替换,所以页面上会输出"Hello World!"。

Vue.js已经更新到2.0版本了,但由于还不是正式版,本文的代码都是1.0.25版本的。

双向绑定示例

MVVM模式本身是实现了双向绑定的,在Vue.js中可以使用v-model指令在表单元素上创建双向数据绑定。

  1. <!--这是我们的View-->
  2. <div id="app">
  3. <p>{{ message }}</p>
  4. <input type="text" v-model="message"/>
  5. </div>

将message绑定到文本框,当更改文本框的值时,<p>{{ message }}</p> 中的内容也会被更新。

反过来,如果改变message的值,文本框的值也会被更新,我们可以在Chrome控制台进行尝试。

Vue实例的data属性指向exampleData,它是一个引用类型,改变了exampleData对象的属性,同时也会影响Vue实例的data属性。

Vue.js的常用指令

上面用到的v-model是Vue.js常用的一个指令,那么指令是什么呢?

Vue.js的指令是以v-开头的,它们作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,我们可以将指令看作特殊的HTML特性(attribute)。

Vue.js提供了一些常用的内置指令,接下来我们将介绍以下几个内置指令:

  • v-if指令
  • v-show指令
  • v-else指令
  • v-for指令
  • v-bind指令
  • v-on指令

Vue.js具有良好的扩展性,我们也可以开发一些自定义的指令,后面的文章会介绍自定义指令。

v-if指令

v-if是条件渲染指令,它根据表达式的真假来删除和插入元素,它的基本语法如下:

  1. v-if="expression"

expression是一个返回bool值的表达式,表达式可以是一个bool属性,也可以是一个返回bool的运算式。例如:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <div id="app">
  9. <h1>Hello, Vue.js!</h1>
  10. <h1 v-if="yes">Yes!</h1>
  11. <h1 v-if="no">No!</h1>
  12. <h1 v-if="age >= 25">Age: {{ age }}</h1>
  13. <h1 v-if="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
  14. </div>
  15. </body>
  16. <script src="js/vue.js"></script>
  17. <script>
  18.  
  19. var vm = new Vue({
  20. el: '#app',
  21. data: {
  22. yes: true,
  23. no: false,
  24. age: 28,
  25. name: 'keepfool'
  26. }
  27. })
  28. </script>
  29. </html>

注意:yes, no, age, name这4个变量都来源于Vue实例选项对象的data属性。

这段代码使用了4个表达式:

  • 数据的yes属性为true,所以"Yes!"会被输出;
  • 数据的no属性为false,所以"No!"不会被输出;
  • 运算式age >= 25返回true,所以"Age: 28"会被输出;
  • 运算式name.indexOf('jack') >= 0返回false,所以"Name: keepfool"不会被输出。

注意:v-if指令是根据条件表达式的值来执行元素的插入或者删除行为。

这一点可以从渲染的HTML源代码看出来,面上只渲染了3个<h1>元素,v-if值为false的<h1>元素没有渲染到HTML。

为了再次验证这一点,可以在Chrome控制台更改age属性,使得表达式age >= 25的值为false,可以看到<h1>Age: 28</h1>元素被删除了。

age是定义在选项对象的data属性中的,为什么Vue实例可以直接访问它呢?
这是因为每个Vue实例都会代理其选项对象里的data属性。

v-show指令

v-show也是条件渲染指令,和v-if指令不同的是,使用v-show指令的元素始终会被渲染到HTML,它只是简单地为元素设置CSS的style属性。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <div id="app">
  9. <h1>Hello, Vue.js!</h1>
  10. <h1 v-show="yes">Yes!</h1>
  11. <h1 v-show="no">No!</h1>
  12. <h1 v-show="age >= 25">Age: {{ age }}</h1>
  13. <h1 v-show="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
  14. </div>
  15. </body>
  16. <script src="js/vue.js"></script>
  17. <script>
  18.  
  19. var vm = new Vue({
  20. el: '#app',
  21. data: {
  22. yes: true,
  23. no: false,
  24. age: 28,
  25. name: 'keepfool'
  26. }
  27. })
  28. </script>
  29. </html>

在Chrome控制台更改age属性,使得表达式age >= 25的值为false,可以看到<h1>Age: 24</h1>元素被设置了style="display:none"样式。

v-else指令

可以用v-else指令为v-ifv-show添加一个“else块”。v-else元素必须立即跟在v-ifv-show元素的后面——否则它不能被识别。

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <title></title>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <h1 v-if="age >= 25">Age: {{ age }}</h1>
  11. <h1 v-else>Name: {{ name }}</h1>
  12. <h1>---------------------分割线---------------------</h1>
  13. <h1 v-show="name.indexOf('keep') >= 0">Name: {{ name }}</h1>
  14. <h1 v-else>Sex: {{ sex }}</h1>
  15. </div>
  16. </body>
  17. <script src="js/vue.js"></script>
  18. <script>
  19. var vm = new Vue({
  20. el: '#app',
  21. data: {
  22. age: 28,
  23. name: 'keepfool',
  24. sex: 'Male'
  25. }
  26. })
  27. </script>
  28. </html>

v-else元素是否渲染在HTML中,取决于前面使用的是v-if还是v-show指令。
这段代码中v-if为true,后面的v-else不会渲染到HTML;v-show为tue,但是后面的v-else仍然渲染到HTML了。

v-for指令

v-for指令基于一个数组渲染一个列表,它和JavaScript的遍历语法相似:

  1. v-for="item in items"

items是一个数组,item是当前被遍历的数组元素。

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <title></title>
  7. <link rel="stylesheet" href="styles/demo.css" />
  8. </head>
  9.  
  10. <body>
  11. <div id="app">
  12. <table>
  13. <thead>
  14. <tr>
  15. <th>Name</th>
  16. <th>Age</th>
  17. <th>Sex</th>
  18. </tr>
  19. </thead>
  20. <tbody>
  21. <tr v-for="person in people">
  22. <td>{{ person.name }}</td>
  23. <td>{{ person.age }}</td>
  24. <td>{{ person.sex }}</td>
  25. </tr>
  26. </tbody>
  27. </table>
  28. </div>
  29. </body>
  30. <script src="js/vue.js"></script>
  31. <script>
  32. var vm = new Vue({
  33. el: '#app',
  34. data: {
  35. people: [{
  36. name: 'Jack',
  37. age: 30,
  38. sex: 'Male'
  39. }, {
  40. name: 'Bill',
  41. age: 26,
  42. sex: 'Male'
  43. }, {
  44. name: 'Tracy',
  45. age: 22,
  46. sex: 'Female'
  47. }, {
  48. name: 'Chris',
  49. age: 36,
  50. sex: 'Male'
  51. }]
  52. }
  53. })
  54. </script>
  55.  
  56. </html>

我们在选项对象的data属性中定义了一个people数组,然后在#app元素内使用v-for遍历people数组,输出每个person对象的姓名、年龄和性别。

View Demo

v-bind指令

v-bind指令可以在其名称后面带一个参数,中间放一个冒号隔开,这个参数通常是HTML元素的特性(attribute),例如:v-bind:class

  1. v-bind:argument="expression"

下面这段代码构建了一个简单的分页条,v-bind指令作用于元素的class特性上。
这个指令包含一个表达式,表达式的含义是:高亮当前页。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <link rel="stylesheet" href="styles/demo.css" />
  7. </head>
  8. <body>
  9. <div id="app">
  10. <ul class="pagination">
  11. <li v-for="n in pageCount">
  12. <a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a>
  13. </li>
  14. </ul>
  15. </div>
  16. </body>
  17. <script src="js/vue.js"></script>
  18. <script>
  19. var vm = new Vue({
  20. el: '#app',
  21. data: {
  22. activeNumber: 1,
  23. pageCount: 10
  24. }
  25. })
  26. </script>
  27. </html>

注意v-for="n in pageCount"这行代码,pageCount是一个整数,遍历时n从0开始,然后遍历到pageCount –1结束。

View Demo

v-on指令

v-on指令用于给监听DOM事件,它的用语法和v-bind是类似的,例如监听<a>元素的点击事件:

  1. <a v-on:click="doSomething">

有两种形式调用方法:绑定一个方法(让事件指向方法的引用),或者使用内联语句。
Greet按钮将它的单击事件直接绑定到greet()方法,而Hi按钮则是调用say()方法。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <div id="app">
  9. <p><input type="text" v-model="message"></p>
  10. <p>
  11. <!--click事件直接绑定一个方法-->
  12. <button v-on:click="greet">Greet</button>
  13. </p>
  14. <p>
  15. <!--click事件使用内联语句-->
  16. <button v-on:click="say('Hi')">Hi</button>
  17. </p>
  18. </div>
  19. </body>
  20. <script src="js/vue.js"></script>
  21. <script>
  22. var vm = new Vue({
  23. el: '#app',
  24. data: {
  25. message: 'Hello, Vue.js!'
  26. },
  27. // 在 `methods` 对象中定义方法
  28. methods: {
  29. greet: function() {
  30. // // 方法内 `this` 指向 vm
  31. alert(this.message)
  32. },
  33. say: function(msg) {
  34. alert(msg)
  35. }
  36. }
  37. })
  38. </script>
  39. </html>

v-bind和v-on的缩写

Vue.js为最常用的两个指令v-bindv-on提供了缩写方式。v-bind指令可以缩写为一个冒号,v-on指令可以缩写为@符号。

  1. <!--完整语法-->
  2. <a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a>
  3. <!--缩写语法-->
  4. <a href="javascripit:void(0)" :class="activeNumber=== n + 1 ? 'active' : ''">{{ n + 1 }}</a>
  5.  
  6. <!--完整语法-->
  7. <button v-on:click="greet">Greet</button>
  8. <!--缩写语法-->
  9. <button @click="greet">Greet</button>

综合示例

现在我们已经介绍了一些Vue.js的基础知识了,结合以上知识我们可以来做个小Demo。

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <title></title>
  7. <link rel="stylesheet" href="styles/demo.css" />
  8. </head>
  9.  
  10. <body>
  11. <div id="app">
  12.  
  13. <fieldset>
  14. <legend>
  15. Create New Person
  16. </legend>
  17. <div class="form-group">
  18. <label>Name:</label>
  19. <input type="text" v-model="newPerson.name"/>
  20. </div>
  21. <div class="form-group">
  22. <label>Age:</label>
  23. <input type="text" v-model="newPerson.age"/>
  24. </div>
  25. <div class="form-group">
  26. <label>Sex:</label>
  27. <select v-model="newPerson.sex">
  28. <option value="Male">Male</option>
  29. <option value="Female">Female</option>
  30. </select>
  31. </div>
  32. <div class="form-group">
  33. <label></label>
  34. <button @click="createPerson">Create</button>
  35. </div>
  36. </fieldset>
  37. <table>
  38. <thead>
  39. <tr>
  40. <th>Name</th>
  41. <th>Age</th>
  42. <th>Sex</th>
  43. <th>Delete</th>
  44. </tr>
  45. </thead>
  46. <tbody>
  47. <tr v-for="person in people">
  48. <td>{{ person.name }}</td>
  49. <td>{{ person.age }}</td>
  50. <td>{{ person.sex }}</td>
  51. <td :class="'text-center'"><button @click="deletePerson($index)">Delete</button></td>
  52. </tr>
  53. </tbody>
  54. </table>
  55. </div>
  56. </body>
  57. <script src="js/vue.js"></script>
  58. <script>
  59. var vm = new Vue({
  60. el: '#app',
  61. data: {
  62. newPerson: {
  63. name: '',
  64. age: 0,
  65. sex: 'Male'
  66. },
  67. people: [{
  68. name: 'Jack',
  69. age: 30,
  70. sex: 'Male'
  71. }, {
  72. name: 'Bill',
  73. age: 26,
  74. sex: 'Male'
  75. }, {
  76. name: 'Tracy',
  77. age: 22,
  78. sex: 'Female'
  79. }, {
  80. name: 'Chris',
  81. age: 36,
  82. sex: 'Male'
  83. }]
  84. },
  85. methods:{
  86. createPerson: function(){
  87. this.people.push(this.newPerson);
  88. // 添加完newPerson对象后,重置newPerson对象
  89. this.newPerson = {name: '', age: 0, sex: 'Male'}
  90. },
  91. deletePerson: function(index){
  92. // 删一个数组元素
  93. this.people.splice(index,1);
  94. }
  95. }
  96. })
  97. </script>
  98.  
  99. </html>

在我的GitHub Pages查看该Demo:

View Demo

总结

本文简单介绍了Vue.js的MVVM模型和它的双向绑定机制,然后以一个Hello World示例开始了我们的Vue.js之旅,接着我们了解了几个比较常用的指令,最后根据这些知识我们构建了一个简单的示例。

本文出自:無雄 http://www.cnblogs.com/rik28/p/6024425.html

不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门的更多相关文章

  1. 不会几个框架,都不好意思说搞过前端: Node.js & angular.js

    Node.js  菜鸟教程 :http://www.runoob.com/nodejs/nodejs-install-setup.html angular.js  菜鸟教程 :http://www.r ...

  2. 不会几个框架,都不好意思说搞过前端: React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  3. Web前端-Vue.js必备框架(三)

    Web前端-Vue.js必备框架(三) vue是一款渐进式javascript框架,由evan you开发.vue成为前端开发的必备之一. vue的好处轻量级,渐进式框架,响应式更新机制. 开发环境, ...

  4. Web前端-Vue.js必备框架(二)

    Web前端-Vue.js必备框架(二) vue调式工具vue-devtools 过滤器:vue.js允许你自定义过滤器,可被用作一些常见的文本格式化. mustache插值和v-bind表达式. vu ...

  5. Web前端-Vue.js必备框架(一)

    Web前端-Vue.js必备框架(一) <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  6. Web前端-Vue.js必备框架(五)

    Web前端-Vue.js必备框架(五) 页面组件,商品列表组件,详情组件,购物车清单组件,结算页组件,订单详情组件,订单列表组件. vue-router 路由 vuex 组件集中管理 webpack ...

  7. Web前端-Vue.js必备框架(四)

    Web前端-Vue.js必备框架(四) 计算属性: <div id="aaa"> {{ message.split('').reverse().join('') }} ...

  8. 用Vue.js开发微信小程序:开源框架mpvue解析

    前言 mpvue 是一款使用 Vue.js 开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程 ...

  9. 终于 Vue.js 成为世界一流的框架

    终于 Vue.js 成为世界一流的框架 随着美团开源基于 Vue.js 的微信小程序框架 mpvue, Vue.js 在微信小程序端的能力被补齐,于是 Vue.js 成为了一个唯一能在 Web, H5 ...

随机推荐

  1. [Linux]几个armhf的ubuntu源

    摘自百度贴吧,留存 http://mirrors.ustc.edu.cn/ubuntu-ports/http://ftp.ubuntu-tw.org/mirror/ubuntu-ports/http: ...

  2. 程序员MAC必备

    排名不分先后 • iTerm 2 终端工具(建议配合oh-my-zsh使用) • Shadowsocks     ***工具 (可用于FQ) • Foxmail 邮箱工具 (适用于企业邮箱登陆) • ...

  3. C#——调用C++的DLL 数据类型转换

    /C++中的DLL函数原型为        //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsig ...

  4. 记录一下获取浏览器可视区域的大小的js

    function GetPageSize() { var xScroll, yScroll; if (window.innerHeight && window.scrollMaxY) ...

  5. winform中控件的简单数据绑定

    是因为在学习组件开发过程中有个Bindable的属性,不明白意义,然后才接触到winform的数据绑定,想着先把数据绑定这块看一下,然后去测试下是否Bindable属性设为false,就不能绑定该属性 ...

  6. VS2017集成FastReport.Net并将模板保存到数据库

    本着开发与实施分离的思想,设计一个通用的报表设计窗体显得尤为重要(下图为图一): 要求与优点: I.报表设计窗体支持所有单据调用,一种单据支持多个打印模板. II.报表模板存储在数据库中.一是支持客户 ...

  7. 先装VS2008之后,又装了2013,然后启动VS2008提示“Tools Version”有问题?

    这个网上资料一搜很多,我就是按照下面这个链接去解决的,删除 “14.0” 整个键值文件夹之后重启VS2008就好了, 注意:上面第一张图是我在网上找的08和10版本弹出的错误,我自己弹出的是提示14. ...

  8. C#如何关闭指定进程

    public static void KillProcess(string strProcessesByName)//关闭线程 { foreach (Process p in Process.GetP ...

  9. 关于win10 链接安卓设备报错winusb.sys未经签名的解决办法

    很简单,各位,我找了一个签过名的winusb.sys替换原来的文件即可. 操作系统win10 64位专业版(更新到最新版本了) 网盘地址 安装好以后,就没有那个惊叹号咯!

  10. ifnull是个好东西

    在进行数据与服务器的数据运算的时候(或者直接在sql中运算的时候),在新插入值的时候,可能会有null,这时如果进行运算,会报错,比如后台字段有totalminute,无论初始值怎么设置,在新建的时候 ...