一、快速入门

1. VUE 概述

Vue (读音 /vju/,类似于 view) 是中国的大神尤雨溪开发的,为数不多的国人开发的世界顶级开源软件。
是一套用于构建用户界面的渐进式框架(“渐进式框架” 非常简单,就是用你想用或者能用的功能特性,你不想用的部分功能可以先不用。VUE不强求你一次性 接受并使用它的全部功能特性。Vue 被设计为可以自底向上逐层应用。
MVVM响应式编程模型,避免直接操作DOM , 降低DOM操作的复杂性。

2. MVVM编程思想

image.png
MVVM:页面输入改变数据,数据改变影响页面数据展示与渲染M(model):普通的javascript数据对象
V(view):前端展示页面
VM(ViewModel):用于双向绑定数据与页面,对于我们的课程来说,就是vue的实例

至此,我们就明白了,Vue.js 就是一个MVVM的实现者,他的核心就是实现了DOM监听与数据绑定

3. VUE核心功能

基础功能:页面渲染、表单处理提交、帮我们管理DOM(虚拟DOM)节点
组件化开发:增强代码的复用能力,复杂系统代码维护更简单
image.png
前端路由:更流畅的的用户体验、灵活的在页面切换已渲染组件的显示,不需与后端做多余的交互
状态集中管理:MVVM响应式模型基础上实现多组件之间的状态数据同步与管理
前端工程化:结合webpack等前端打包工具,管理多种静态资源,代码,测试,发布等,整合前端大型项目。

二、第一个Vue程序

官网:https://cn.vuejs.org/v2/guide/

1. HelloWorld

  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 v-once>{{name}},非常帅!!</h1>
  10. </div>
  11. </body>
  12. <script src="js/vue.js"></script>
  13. <script>
  14. // 1.new vue实例 每个Vue应用都是通过Vue函数创建一个新的Vue实例开始的
  15. let vm=new Vue({
  16. el: "#app", // 挂载的模板
  17. data: { // 绑定的数据 当数据属性的值发生改变时,视图会进行重新渲染, 响应式的
  18. name: "张三"
  19. }
  20. });
  21. </script>
  22. </html>

Vue在线cdn:

  1. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

三、Vue基本语法

1. v-bind

现在数据和DOM已经被建立了关联,所有的东西都是响应式的。我们在控制台操作对象的属性,界面可以实时更新。
我们可以使用v-bind来绑定元素属性!

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <p>Vue</p>
  9. <!--view层 模板-->
  10. <div id="app">
  11. <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span>
  12. <button vbind:disabled="disabled">禁用按钮</button>
  13. </div>
  14. </body>
  15. <!--导入js-->
  16. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
  17. <script>
  18. var vm = new Vue({
  19. el: "#app",
  20. data: {
  21. message: "hello,vue",
  22. disabled: true
  23. }
  24. })
  25. </script>
  26. </html>

vue 还提供了指令 v­bind 的简写方式,可以直接通过:属性名的方式。

2. v-if v-else

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <p>Vue</p>
  9. <!--view层 模板-->
  10. <div id="app">
  11. <h1 v-if="type==='A'">A</h1>
  12. <h1 v-else-if="type==='B'">B</h1>
  13. <h1 v-else>C</h1>
  14. </div>
  15. </body>
  16. <!--导入js-->
  17. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
  18. <script>
  19. var vm = new Vue({
  20. el: "#app",
  21. data: {
  22. type: "A"
  23. }
  24. })
  25. </script>
  26. </html>

3. v-for

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <p>Vue</p>
  9. <!--view层 模板-->
  10. <div id="app">
  11. <li v-for="item in items">
  12. 姓名:{{item.name}},年龄:{{item.age}}
  13. </li>
  14. </div>
  15. </body>
  16. <!--导入js-->
  17. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
  18. <script>
  19. var vm = new Vue({
  20. el: "#app",
  21. data: {
  22. items: [
  23. {name: "zhangsan", age: 12},
  24. {name: "lisi", age: 10},
  25. {name: "wangwu", age: 16}
  26. ]
  27. }
  28. })
  29. </script>
  30. </html>

4. v-on 事件绑定

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <p>Vue</p>
  9. <!--view层 模板-->
  10. <div id="app">
  11. <button v-on:click="sayHi">Click Me</button>
  12. </div>
  13. </body>
  14. <!--导入js-->
  15. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
  16. <script>
  17. var vm = new Vue({
  18. el: "#app",
  19. data: {
  20. message: "你点我干嘛?"
  21. },
  22. methods: {
  23. //方法必须绑定在Vue的Methods对象中,v-on:事件
  24. sayHi: (function (event) {
  25. alert(this.message)
  26. })
  27. }
  28. })
  29. </script>
  30. </html>

5. 计算属性和侦听器

计算属性 VS 方法
如果不使用计算属性,在 methods 里定义了一个方法,也可以实现相同的效果,甚至该方法还可以接受参数,使用起来 更灵活。
既然 methods 同样可以解决模板中复杂逻辑计算的问题,那么为什么还需要使用计算属性呢?
原因就是:计算属性是基于它的依赖缓存的。前面我们介绍过,计算属性的改变取决于其所依赖数据的变化,所以只要 依赖数据不发生改变,计算属性就不会更新。当我们重复获取计算属性时它也不会重复计算,只会获取缓存的值。而我 们每次调用 methods 都会重新计算一遍,这样将会消耗一部分性能。当然,如何你不希望对数据进行缓存,那么可以用方法来代替。
侦听器
通过侦听器来监听数据的变化,进行相应的逻辑处理。
如何监听对象类型数据的某个属性进行侦听。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>计算属性和侦听器</title>
  8. </head>
  9. <body>
  10. <div id="app">
  11. <!-- 实现一个购物车功能
  12. 1. 数据初始化处理
  13. 2.计算商品总价
  14. 3.选择商品数量:当商品数量超过库存做提示
  15. -->
  16. <ul>
  17. <li v-for="(item, index) in car" >
  18. {{item.pname}} --- 商品价格:{{item.price}} --- 库存:{{item.stock}}
  19. 数量:<input type="number" v-model="item.num" style="width: 30px;" />
  20. </li>
  21. <li><strong>总价:</strong>{{calcSum}}</li>
  22. <li v-html="message"></li>
  23. <li v-html="warn()"></li>
  24. </ul>
  25. </div>
  26. <script src="js/vue.js"></script>
  27. <script>
  28. new Vue({
  29. el:"#app",
  30. data:{
  31. car:[
  32. {pname:'Iphone 12',price:7999,stock:10,num:1},
  33. {pname:'小米11',price:3599,stock:3,num:4},
  34. ],
  35. message:"",
  36. },
  37. // methods : 当方法中使用的数据发生改变,方法会自动调用
  38. methods: {
  39. // calcSum(){
  40. // let sum=0;
  41. // this.car.forEach(item => {
  42. // sum+=item.price*item.num;
  43. // });
  44. // return sum;
  45. // }
  46. warn(){
  47. let message="";
  48. this.car.forEach(item => {
  49. if(item.num>item.stock){
  50. message+=`${item.pname}的库存超出限制<br/>`
  51. }
  52. });
  53. return message;
  54. }
  55. },
  56. // 计算属性: 当方法中使用的数据发生改变,方法会自动调用
  57. computed:{
  58. calcSum(){
  59. let sum=0;
  60. this.car.forEach(item => {
  61. sum+=item.price*item.num;
  62. });
  63. return sum;
  64. }
  65. },
  66. // 侦听器 专门用于侦听数据的变化,当数据发生变化会自动调用方法
  67. watch:{
  68. // 要侦听的数据: 数组
  69. car:{
  70. handler(newvalue,oldvalue){
  71. this.message="";
  72. this.car.forEach(item => {
  73. if(item.num>item.stock){
  74. this.message+=`${item.pname}的库存超出限制<br/>`
  75. }
  76. });
  77. },
  78. deep:true //深度侦听器
  79. },
  80. // 基础类型的侦听, 将侦听数据作为函数就可以了
  81. message(newvalue,oldvalue){
  82. console.info(newvalue,oldvalue)
  83. }
  84. }
  85. });
  86. /*
  87. 方法和计算属性的区别:
  88. 声明发生不一样,调用不一样方法要用(), 计算属性调用不要加()
  89. */
  90. /*
  91. 方法和侦听器的区别:
  92. 方法: 方法中任意数据发生了改变就会自动调用方法
  93. 可以调用,进行返回值
  94. 侦听器:需要指定具体的侦听数据,只有被具体指定的侦听数据发生了改变才会触发
  95. 不能像方法那样去调用, 而是靠vue自动触发
  96. */
  97. </script>
  98. </body>
  99. </html>

6. 过滤器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>过滤器</title>
  8. </head>
  9. <body>
  10. <div id="app">
  11. <ul>
  12. <li v-for="user in userList">
  13. 姓名:{{user.name}};性别:{{formateGender(user.gender)}}
  14. {{user.gender | filterGender}}
  15. </li>
  16. </ul>
  17. </div>
  18. <script src="../node_modules/vue/dist/vue.js"></script>
  19. <script>
  20. let vm = new Vue({
  21. el: "#app",
  22. data: {
  23. userList: [
  24. { id: 1, name: 'xushu', gender: 1 },
  25. { id: 2, name: 'zhuge', gender: 0 }
  26. ]
  27. },
  28. methods: {
  29. formateGender(gender){
  30. if(gender==1){
  31. return "~男"
  32. }else{
  33. return "~女"
  34. }
  35. }
  36. },
  37. // 专门针对数据过滤
  38. filters:{
  39. filterGender(gender){
  40. if(gender==1){
  41. return "!男"
  42. }else{
  43. return "!女"
  44. }
  45. }
  46. }
  47. })
  48. </script>
  49. </body>
  50. </html>

四、Vue双向绑定 v-model

1. 什么是双向绑定

Vue.js是一个MVVM框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是Vue.js的精髓之处了。
值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用vuex,那么数据流也是单项的,这时就会和双向数据绑定有冲突。

2. 为什么要实现数据的双向绑定

在Vue.js 中,如果使用vuex ,实际上数据还是单向的,之所以说是数据双向绑定,这是用的UI控件来说,对于我们处理表单,Vue.js的双向数据绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项,方便跟踪;局部性数据流使用双向,简单易操作。

3. 在表单中使用双向数据绑定

你可以用v-model指令在表单