Vue

特点

  • 一个轻量级的mvvm框架,双向绑定,数据动态更新,gzip后大小只有20k+
  • 是一个渐进式框架,其核心思想是数据驱动、组件化的前端开发
  • 原生html页面是通过js 操作的是dom,而vue.js操作的是数据。
  • 和传统前端开发开发的关注点完全不同,传统方式关注的是都像的document结构的api,而vue关注的是数据。
  • 优点显而易见,从而屏蔽了使用复杂晦涩难记的dom结构api。

Vue的使用

导入Vue.js,准备数据渲染区,创建vue对象

创建vue对象的两种方式:

1、先定义变量,在创建对象

  1. var a = {
  2. msg: "Hello World!"
  3. // 此处为Moudel
  4. }
  5. var com = {
  6. el: "#app1",
  7. data: a
  8. }
  9. // 此处用于连接View和Moudel为VM
  10. var v = new Vue(com)

2.直接创建对象

  1. new Vue({
  2. //el属性用于描述元素(挂载点),data属性是具体要展示的数据
  3. el : "#app",//使用id选择器将data中的数据渲染在挂载点
  4. data : {
  5. msg:"Hello Vue!"
  6. }
  7. })

示例代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>入门案例</title>
  6. <script src="js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!-- 插入值表达式 -->
  11. {{msg}}
  12. <!-- 挂载点 -->
  13. </div>
  14. <div id="app1">
  15. {{msg}}
  16. </div>
  17. <!-- 此处为view -->
  18. </body>
  19. <script>
  20. var a = {
  21. msg: "Hello World!"
  22. // 此处为Moudel
  23. }
  24. var com = {
  25. el: "#app1",
  26. data: a
  27. }
  28. // 此处用于连接View和Moudel为VM
  29. var v = new Vue(com)
  30. new Vue({
  31. //el属性用于描述元素(挂载点),data属性是具体要展示的数据
  32. el : "#app",//使用id选择器将data中的数据渲染在挂载点
  33. data : {
  34. msg:"Hello Vue!"
  35. }
  36. })
  37. /*
  38. MVVM
  39. M--Model---数据
  40. V--View ---页面
  41. VM--ViewMoudle---vue中的对象
  42. */
  43. </script>
  44. </html>

MVVM框架

M--Model—-数据

V--View —-页面

VM--ViewMoudle—-vue中的对象

MVVM.png

基础语法

运算符

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>vue运算符</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="operation">
  10. <p>a = {{a}}</p>
  11. <p>b = {{b}}</p>
  12. <p>加法:{{a + b}}</p>
  13. <p>减法:{{a - b}}</p>
  14. <p>乘法:{{a * b}}</p>
  15. <p>除法:{{a / b}}</p>
  16. <p>取余:{{a % b}}</p>
  17. <p>自增a++:{{a++}}</p>
  18. <p>自减a--:{{a--}}</p>
  19. <p>自增++a:{{++a}}</p>
  20. <p>自减--a:{{--a}}</p>
  21. <p>三元运算符:{{a > b ? a : b}}</p>
  22. <p>字符串操作:</p>
  23. <p>str = {{str}}</p>
  24. <p>字符串长度为:{{str.length}}</p>
  25. <p>字符串拼接---李白:{{str.concat("---李白")}}</p>
  26. <p>字符串剪切8:{{str.substr(8)}}</p>
  27. <h1>{{name}}</h1>
  28. <h2>{{overview}}</h2>
  29. <p>{{json}}</p>
  30. </div>
  31. </body>
  32. <script>
  33. new Vue({
  34. el: "#operation",
  35. data: {
  36. a: 22,
  37. b: 24,
  38. str: "仰天大笑出门去,我辈岂是蓬蒿人。",
  39. name : "我是老马钊",
  40. overview : "我有十年脑血栓",
  41. json : '"name" : "马钊"'
  42. }
  43. })
  44. </script>
  45. </html>

方法

  • 方法必须写在methods代码段中
  • 方法体中访问数据代码段中声 明的变量,前面加this
  • 方法和属性声明方式的差异在于 function(){}
  • 方法和属性调用的差异是 {{msg}} {{sayHello()}},名称后加小括号
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue方法</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="fun">
  10. <button onclick="alert('你被发现了')">点点看</button>
  11. <!-- vue的事件,使用v-on调用指定函数 -->
  12. <button v-on:click = "show">你是谁</button>
  13. <p>
  14. 调用无参函数{{show()}}
  15. </p>
  16. <p>
  17. 调用有参函数{{output("马钊")}}
  18. </p>
  19. <!-- v-for 动态渲染列表或数组中的数据 -->
  20. <p v-for="i in activity">{{i}}</p>
  21. </div>
  22. </body>
  23. <script>
  24. new Vue({
  25. el : "#fun",
  26. data :{
  27. name:"马钊",
  28. age : 22,
  29. address : "淄博",
  30. person:{
  31. name : "余来",
  32. age : 24,
  33. address : "淄博"
  34. },
  35. activity:["吃","喝","睡"],
  36. },
  37. //vue中的函数必须写在methods中
  38. methods : {
  39. show:function(){
  40. console.log("我是" + this.person.name)
  41. },
  42. output:function(name){
  43. console.log(name)
  44. },
  45. geturl:function(){
  46. return this.url
  47. }
  48. }
  49. })
  50. </script>
  51. </html>

获取对象和数组中的信息

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue方法</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="fun">
  10. <!-- 解析对象中的信息 -->
  11. <p>person = {{person}}</p>
  12. <p>person中的name值 = {{person.name}}</p>
  13. <p>person中的age值 = {{person.age}}</p>
  14. <p>person中的address值 = {{person.address}}</p>
  15. <!-- 渲染数组中的信息 -->
  16. <p v-for = "i in activity">{{i}}</p>
  17. <!-- 直接使用数组下标和key来进行数据渲染 -->
  18. <p>{{ json[0].name }}</p>
  19. <!-- 使用 v-for 来进行动态渲染 -->
  20. <ul v-for = "i in json" :key = "i.name">
  21. <li>{{ i.name }}</li>
  22. </ul>
  23. </div>
  24. </body>
  25. <script>
  26. new Vue({
  27. el : "#fun",
  28. data :{
  29. //对象名:对象信息
  30. person:{
  31. name : "余来",
  32. age : 24,
  33. address : "淄博"
  34. },
  35. activity:["吃","喝","睡"],
  36. json : [
  37. {"name" : "马钊" , "age" : "22"},
  38. {"name" : "赵彪" , "age" : "22"},
  39. {"name" : "余来" , "age" : "24"}
  40. ]
  41. }
  42. })
  43. </script>
  44. </html>

Vue中三种data值的写法

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>三种data值的写法</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <p id="p1">{{ msg }}</p>
  10. <p id="p2">{{ msg }}</p>
  11. <p id="p3">{{ msg }}</p>
  12. </body>
  13. <script>
  14. // 1.标准写法
  15. new Vue({
  16. el: "#p1",
  17. data: {
  18. msg: "我是赵彪"
  19. }
  20. })
  21. // 2.定义函数,返回对象
  22. new Vue({
  23. el: "#p2",
  24. data: function () {
  25. return {
  26. msg: "我是马钊"
  27. }
  28. }
  29. })
  30. // 3.定义函数,es6的简写法
  31. new Vue({
  32. el: "#p3",
  33. data() {
  34. return {
  35. msg: "我是余来"
  36. }
  37. }
  38. })
  39. </script>
  40. </html>

高级语法 v-命令

概述:

指令是带有 v- 前缀的特殊属性,以表示它们是 Vue 提供的特殊特性。

指令用于在表达式的值改变时,将某些行为应用到 DOM 上。

常见的Vue指令:v-if v-for v-on v-bind v-model v-cloak等

v-model——双向绑定

v-model,实现双向绑定,修改一方同时修改相同的另一方,达到数据同时更新。

MVVM是将”数据模型双向绑定”的思想作为核心,在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此View视图的数据的变化会同时修改Model数据源,而Model数据源数据的变化也会立即反应到View视图上。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>v-model 双向绑定</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <!-- v-model 双向绑定 -->
  10. <div id="testModel">
  11. <p>{{ msg }}</p>
  12. <p>{{ msg }}</p>
  13. <p>{{ msg }}</p>
  14. <p>{{ msg }}</p>
  15. <p>{{ msg }}</p>
  16. <input v-model="msg" type="text" />
  17. <input v-model="msg" type="text" />
  18. <input v-model="msg" type="text" />
  19. </div>
  20. </body>
  21. <script>
  22. new Vue({
  23. el: "#testModel",
  24. data: {
  25. msg: "李白乘舟将欲行"
  26. }
  27. })
  28. </script>
  29. </html>

v-cloak—-与css组合可以隐藏标签

闪现:浏览器上有时会显示插值表达式,使用v-cloak属性+css可以隐藏标签

  • 在标签中增加指令:v-cloak
  • 增加style标签,[v-cloak]属性选择器,设置不展示display:none;
  1. <style>
  2. /* 不展示闪现的效果 */
  3. [v-cloak]{
  4. display: none;
  5. }
  6. </style>
  7. </head>
  8. <body>
  9. <!-- 闪现:浏览器上有时会显示插值表达式,使用v-cloak属性+css可以隐藏标签
  10. v-cloak 使用css来隐藏插值表达式 -->
  11. <div id="testModel" v-cloak>
  12. <p>{{ msg }}</p>
  13. <p>{{ msg }}</p>
  14. <p>{{ msg }}</p>
  15. <p>{{ msg }}</p>
  16. <p>{{ msg }}</p>
  17. <!-- v-model 双向绑定 -->
  18. <input v-model="msg" type="text" />
  19. <input v-model="msg" type="text" />
  20. <input v-model="msg" type="text" />
  21. </div>
  22. </body>

v-if—-判断

v-if指令将根据表达式 seen 的值( true 或 false )来决定是否插入元素

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>v-if</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="test" v-cloak>
  10. <!-- v-if 不满足条件不会被网页加载 -->
  11. <p v-if="age >= 18">成年人</p>
  12. <p v-if="age<18">未成年人</p>
  13. <!-- v-show 不满足条件也会被网页加载,只是不显示 -->
  14. <p v-show="age < 18">未成年人</p>
  15. <!-- v-if v-else-if v-else 组合判断条件 -->
  16. <p v-if="age < 18">少年</p>
  17. <p v-else-if="age >= 18 && age < 35 ">青年</p>
  18. <p v-else-if="age >= 35 && age < 50 ">青年</p>
  19. <p v-else>老年</p>
  20. </div>
  21. </body>
  22. <script>
  23. new Vue({
  24. el: "#test",
  25. data: {
  26. age: 18,
  27. msg: "李白乘舟将欲行"
  28. }
  29. })
  30. </script>
  31. </html>

v-for—-循环

v-ifv-for 一起使用时,v-for 具有比 v-if 更高的优先级。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="fun">
  10. <h3>{{name}}的业余活动</h3>
  11. <ol>
  12. <li v-for="arr in activate">
  13. {{arr}}
  14. </li>
  15. </ol>
  16. <ul>
  17. <li v-for="(item, index) in activate" :key="index">
  18. {{index}}:{{item}}
  19. </li>
  20. </ul>
  21. <ul>
  22. <li v-for="(item, index) in json" :key="item.name">
  23. 姓名:{{item.name}},
  24. 年龄:{{item.age}}
  25. </li>
  26. </ul>
  27. </div>
  28. </body>
  29. <script>
  30. new Vue({
  31. el: "#fun",
  32. data: {
  33. activate: ["吃了喝", "喝了睡", "睡了吃"],
  34. name: "马钊",
  35. json: [{
  36. "name": "马钊",
  37. "age": "22"
  38. },
  39. {
  40. "name": "赵彪",
  41. "age": "22"
  42. },
  43. {
  44. "name": "余来",
  45. "age": "24"
  46. }
  47. ]
  48. }
  49. })
  50. </script>
  51. </html>

事件 v-on

@clickv-on:click的缩写,单击事件

@dblclickv-on:dblclick的简写,双击事件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="fun">
  10. <button v-on:click="out()">点点看</button>
  11. <button v-on:dblclick="out1()">双击试试看</button>
  12. <button @click="out()">点点看</button>
  13. <button @dblclick="out1()">双击试试看</button>
  14. </div>
  15. </body>
  16. <script>
  17. new Vue({
  18. el: "#fun",
  19. data: {
  20. name: "马钊",
  21. json: [{
  22. "name": "马钊",
  23. "age": "22"
  24. },
  25. {
  26. "name": "赵彪",
  27. "age": "22"
  28. },
  29. {
  30. "name": "余来",
  31. "age": "24"
  32. }
  33. ],
  34. },
  35. methods: {
  36. out: function () {
  37. console.log(this.json[0].name)
  38. },
  39. out1: function () {
  40. console.log(this.json[1].name)
  41. }
  42. },
  43. })
  44. </script>
  45. </html>

绑定 v-bind

当属性的值是变量而不是字符串时,通过v-bind进行标识,vue会自动处理

  • 全称: v-bind:href
  • 简称: :href 冒号开头就说明后面跟的是变量
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>测试v-bind</title>
  8. <script src="./js/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="test">
  12. <p>
  13. <a v-bind:href="url" target="_blank">{{ uname }}</a>
  14. </p>
  15. <p>
  16. <!-- 无法跳转至正常网址 -->
  17. <a href="url">{{ uname }}</a>
  18. </p>
  19. </div>
  20. </body>
  21. <script>
  22. new Vue({
  23. el: "#test",
  24. data: {
  25. url: "https://www.baidu.com",
  26. uname: "百度一下,你就知道"
  27. }
  28. })
  29. </script>
  30. </html>

vue双向绑定常用属性

  1. @click.prevent

    vue点击事件中的一个方法,可以取消标签的默认行为
    应用场景:
    1.form表单,阻止action提交
    2.a标签,阻止href跳转 ```java <!DOCTYPE html>

用户名:

  1. 2. v-model.number
  2. 数据转换,将输入内容转换为数值类型
  3. 3. v-model.trim
  4. 去除多余的空格
  5. 4. v-model.lazy
  6. 懒加载,失去焦点触发
  7. ```java
  8. <!DOCTYPE html>
  9. <html lang="en">
  10. <head>
  11. <meta charset="UTF-8">
  12. <title>数据双向绑定属性</title>
  13. <script src="../js/vue.js"></script>
  14. </head>
  15. <body>
  16. <div id="app">
  17. <!--
  18. 数据转换,将输入内容转换为数值类型
  19. v-model.number
  20. -->
  21. 年龄:<input v-model.number="ageTest" type="text" />
  22. <button @click="addNum">加法</button>
  23. <!--
  24. 去除多余的空格
  25. v-model.trim
  26. -->
  27. <p>
  28. 用户名:<input type="text" v-model.trim="username">
  29. {{username.length}}
  30. </p>
  31. <!--
  32. 懒加载,失去焦点触发
  33. v-model.lazy
  34. -->
  35. 信息:<input v-model.lazy="msg" type="text" />
  36. {{msg}}
  37. </div>
  38. </body>
  39. <script>
  40. const app = new Vue({
  41. el: "#app",
  42. data: {
  43. ageTest: '',
  44. username: '',
  45. msg: '',
  46. },
  47. methods: {
  48. addNum() {
  49. this.ageTest = this.ageTest + 1
  50. }
  51. },
  52. })
  53. </script>
  54. </html>

Vue生命周期

Vue生命周期共有八个方法:[beforeCreate](https://cn.vuejs.org/v2/api/#beforeCreate)、[created](https://cn.vuejs.org/v2/api/#created)、[beforeMount](https://cn.vuejs.org/v2/api/#beforeMount)、[mounted](https://cn.vuejs.org/v2/api/#mounted)、[beforeUpdate](https://cn.vuejs.org/v2/api/#beforeUpdate)、[updated](https://cn.vuejs.org/v2/api/#updated)、``[beforeDestro](https://cn.vuejs.org/v2/api/#beforeDestroy)、[destroyed](https://cn.vuejs.org/v2/api/#destroyed)

  1. 生命周期函数的方法名称必须固定
  2. 生命周期函数是Vue对象特有的函数,应在根目录

当页面渲染成功后,共执行了4个生命周期方法
第一类:Vue对象的创建
1.beforeCreate,创建前,在实例初始化之后,数据观测 (data observer) 和 event/watcher事件配置之前被调用。
2.created,Vue对象创建完成后立即调用
第二类:Vue对象的挂载(创建)
1.beforeMount,在挂载开始之前被调用:相关的 render 函数首次被调用,在服务器端渲染期间不被调用。
2.mounted,挂载完成(渲染完成),用户看到页面数据之后调用该函数
数据更新:
第三类:
1.beforeUpdate,用户修改数据时,确认修改数据后调用该函数。数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。
过渡阶段:数据被修改
2.updated,数据被修改完成后调用该函数
销毁阶段:
第四类:销毁函数,Vue默认不会调用,可以用户手动调用
1.beforeDestroy:销毁之前调用,在此时实例仍然完全可用。
2.destroyed:标志Vue对象已经被销毁

组件

概述

组件是将HTML与CSS以及JS进行整合的一个标签,使得引入js与css不在会引起结构混乱,便于开发,并且组件可以复用,简化了代码编写。组件采用树形结构,可以将功能小型化单独维护。

组件分为全局组件和局部组件,全局组件可以在任何div中引入,局部组件只可以在该组件做所在的vue对象绑定的div中使用。

组件体定义:

组件体使用template标签进行标记,template中可以写入与该组件所要实现的功能与信息,id为组件的唯一标识。

  1. <template id="testCom">
  2. <div>
  3. <h1 align="center">{{msg}}</h1>
  4. </div>
  5. </template>

组件定义:

全局组件定义使用Vue.component(args1,args2)定义,args1为组件名,args2为组件实体内容,可以写入方法,属性。 局部组件在vue对象中使用components定义,使用key-value结构进行定义,若key-value相同可以简化只写key。局部组件只可以在该对象挂载点中使用。

  1. //全局组件
  2. Vue.component("addNumCom", {
  3. data() {
  4. return {
  5. //自定义属性
  6. num: 100,
  7. }
  8. },
  9. //页面标记
  10. template: "#numTem",
  11. //方法
  12. methods: {}
  13. })
  14. //局部组件
  15. const app = new Vue({
  16. el: "#app",
  17. components: {
  18. testCom: testCom
  19. }
  20. })
  21. let testCom = {
  22. data() {
  23. return {
  24. msg: "Hello World!",
  25. }
  26. },
  27. template: "#testCom"//与组件体进行绑定
  28. };

组件使用:

组件使用只需要在vue对象挂载的div中使用组件名称即key-value即可。 vue中组件标签名称默认全小写,若需要引入驼峰规则,需要使用“-“连接

  1. <div id="app">
  2. <test-com></test-com>
  3. <test-com></test-com>
  4. <test-com></test-com>
  5. </div>

示例代码:

局部组件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>局部组件</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  7. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  8. <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <test-com></test-com>
  13. <test-com></test-com>
  14. <test-com></test-com>
  15. </div>
  16. <template id="testCom">
  17. <div>
  18. <h1 align="center">{{msg}}</h1>
  19. </div>
  20. </template>
  21. </body>
  22. <script>
  23. let testCom = {
  24. data() {
  25. return {
  26. msg: "Hello World!",
  27. }
  28. },
  29. template: "#testCom"
  30. };
  31. const app = new Vue({
  32. el: "#app",
  33. components: {
  34. testCom: testCom
  35. }
  36. })
  37. </script>
  38. </html>

全局组件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>全局组件</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  7. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  8. <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  9. </head>
  10. <body>
  11. <!--定义模板标签-->
  12. <template id="numTem">
  13. <div>
  14. <h1>Hello World!</h1>
  15. <p>获取组件数据:{{num}}</p>
  16. </div>
  17. </template>
  18. <div id="app">
  19. <!-- vue中组件标签名称默认全小写,若需要引入驼峰规则,需要使用"-"连接 -->
  20. <add-num-com></add-num-com>
  21. <add-num-com></add-num-com>
  22. </div>
  23. </body>
  24. <script>
  25. /*参数
  26. 1.组件名
  27. 2.组件实体内容
  28. */
  29. Vue.component("addNumCom", {
  30. //属性
  31. data() {
  32. return {
  33. //自定义属性
  34. num: 100,
  35. }
  36. },
  37. //页面标记
  38. template: "#numTem",
  39. //方法
  40. methods: {}
  41. })
  42. const app = new Vue({
  43. el: "#app"
  44. })
  45. </script>
  46. </html>

路由

路由可以根据用户的请求URL地址,展现特定的组件(页面)信息. (控制用户程序跳转过程)

vue中路由跳转链接使用 router-link标签,而HTML中链接跳转标签使用a标签。

1.a标签:超链接标签 href:请求跳转的地址 2.router-link标签,解析为a标签 to:解析之后为href

vue路由创建:

  1. 创建路由跳转链接

    1. <router-link to="/home">主页</router-link>
    2. <router-link to="/test">测试</router-link>
  2. 指定路由填充位

    1. <router-view></router-view>
  3. 封装路由对象

    1. let HomeCom = {
    2. template: "#homeTem"
    3. }
    4. let TestCom = {
    5. template: "#testTem"
    6. }
    7. <template id="homeTem">
    8. <div>
    9. <h1>马钊一号</h1>
    10. </div>
    11. </template>
    12. <template id="testTem">
    13. <div>
    14. <h1>马钊二号</h1>
    15. </div>
    16. </template>
  4. 定义请求与组件的映射关系

    1. const router = new VueRouter({
    2. //routes:定义请求与组件的映射关系
    3. routes: [{
    4. path: "/home",
    5. component: HomeCom
    6. }, {
    7. path: "/test",
    8. component: TestCom
    9. }]
    10. })
  5. vue对象绑定路由

    1. //实现路由对象绑定
    2. const app = new Vue({
    3. el: "#app",
    4. router
    5. })

详细代码实现:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>路由入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  7. <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  8. </head>
  9. <body>
  10. <div id="app">
  11. <div>
  12. <!--
  13. 1.a标签:超链接标签
  14. href:请求跳转的地址
  15. 2.router-link标签,解析为a标签
  16. to:解析之后为href
  17. -->
  18. <router-link to="/home">主页</router-link>
  19. <router-link to="/test">测试</router-link>
  20. <!--
  21. 指定路由填充位(占位符),需要给组件一个展现的位置,需要提前定义
  22. -->
  23. <router-view>
  24. </router-view>
  25. </div>
  26. </div>
  27. <template id="homeTem">
  28. <div>
  29. <h1>马钊一号</h1>
  30. </div>
  31. </template>
  32. <template id="testTem">
  33. <div>
  34. <h1>马钊二号</h1>
  35. </div>
  36. </template>
  37. </body>
  38. <script>
  39. //封装路由对象
  40. let HomeCom = {
  41. template: "#homeTem"
  42. }
  43. let TestCom = {
  44. template: "#testTem"
  45. }
  46. const router = new VueRouter({
  47. //routes:定义请求与组件的映射关系
  48. routes: [{
  49. path: "/home",
  50. component: HomeCom
  51. }, {
  52. path: "/test",
  53. component: TestCom
  54. }]
  55. })
  56. //实现路由对象绑定
  57. const app = new Vue({
  58. el: "#app",
  59. router
  60. })
  61. </script>
  62. </html>

嵌套路由

嵌套路由需在进行路由与组件绑定时需要使用childen来声明子级路由

  1. const router = new VueRouter({
  2. //routes:定义请求与组件的映射关系
  3. routes: [{
  4. path: "/tiger",
  5. component: tigerCom,
  6. children: [{
  7. path: "/tiger/tigerSon",
  8. component: tigerSonCom
  9. },
  10. {
  11. path: "/tiger/tigerDau",
  12. component: tigerDauCom
  13. },
  14. ]
  15. }]
  16. })

其组件需要在template标签中定义为子级路由

  1. <template id="lionTem">
  2. <div>
  3. <h1>欢迎观赏马钊二号</h1>
  4. <img src="https://gravatar.cat.net/avatar/14da87633624e835fd718e0fa3936be8?s=96&d=mp&r=g">
  5. <p>
  6. <router-link to="/lion/lionSon">赵彪一号</router-link>
  7. <router-link to="/lion/lionDau">赵彪二号</router-link>
  8. <router-view></router-view>
  9. </p>
  10. </div>
  11. </template>

重定向与转发

重定向:重定向是指当浏览器请求一个URL时,服务器返回一个重定向指令,浏览器接受这个指令后,会知道所请求的已发生改变,将会自动使用新的URL再重新发送新请求。

vue中重定向需要使用redirect关键字。

  1. const router = new VueRouter({
  2. //routes:定义请求与组件的映射关系
  3. routes: [{
  4. path: "/",
  5. redirect: "/tiger"
  6. }, {
  7. path: "/tiger",
  8. component: tigerCom,
  9. children: [{
  10. path: "/tiger/tigerSon",
  11. component: tigerSonCom
  12. },
  13. {
  14. path: "/tiger/tigerDau",
  15. component: tigerDauCom
  16. },
  17. ]
  18. }]
  19. })

特点:
1.请求多次,对象多个
2.由于是多个请求,所以不可以传递参数
3.浏览器的地址会变化
4.重i定向也是服务器端行为

转发:
转发是指当一个服务器接受请求后无法处理,但知道哪个服务器可以处理此请求,会将请求转发给另一个服务器处理,另一个服务器处理完毕请求后将会返回响应到页面。

特点:
1请求一次同一个对象
2转发时,参数可以携带。
3.转发时,浏览器的地址不变
4.转发是服务器行为

路由导航守卫

路由导航守卫用于当用户访问没有权限的页面时进行拦截,在访问有权限的页面时进行放行的控制。

vue中路由导航守卫使用beforeEach((to,from,next) => {})来定义,to表示路由跳转网址,from表示请求的路由来处,next表示路由被重定向或者放行。

  1. /*
  2. 路由导航守卫
  3. to:路由跳转网址
  4. from:路由从哪来
  5. next:函数,可以重定向或者放行
  6. next()表示放行
  7. next('路由地址'),表示要重定向指定网址
  8. */
  9. router.beforeEach((to, from, next) => {
  10. if (to.path === '/login') {
  11. return next();
  12. }
  13. let token = window.sessionStorage.getItem('token');
  14. // if (token !== null && token.length > 0) 等同于 if (token) 表示token不为null为true反之为false
  15. if (token) {
  16. return next();
  17. } else {
  18. alert("请登陆后访问该页面。")
  19. return next('/login');
  20. }
  21. })

过滤器

定义语法

动作函数的参数为”|”号左侧的数据
过滤器必须有返回值。
js定义语法:

  1. Vue.filter("过滤器名称",过滤器动作函数(参数){
  2. return 返回值.
  3. })

ui使用过滤器语法:

  1. <template slot-scope="scope">
  2. {{scope.row.price | priceFormat}}
  3. </template>