【vue2】路由之 Vue Router

文章目录

  • 一、安装
  • 二、基础使用
    • 1、简单的示例
    • 2、动态路由
      • 2.1 定义动态路径参数
      • 2.2 获取动态路径的参数
      • 2.3 捕获所有路由
    • 3、嵌套路由
    • 4、编程式的导航
      • 4.1 router.push
      • 4.2 router.replace
      • 4.3 router.go(n)
    • 5、命名路由
    • 6、重定向
  • 三、进阶
    • 1、导航守卫
      • 1.1 全局前置守卫
      • 1.2 全局后置钩子
      • 1.3 路由独享的守卫
      • 1.4 组件内的守卫
      • 完整的导航解析流程
    • 2、路由懒加载

一、安装

NPM
注意:vue2中需使用 v.3x 版本

npm install vue-router@3.0.0 --save

vue-router v3.x 文档:文档链接

二、基础使用

1、简单的示例

src/main.js

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'// 1. 定义 (路由) 组件。
// 可以从其他文件 import 进来
const Foo = {template: '<div>Foo</div>'
}
const Bar = {template: '<div>Bar</div>'
}// 2. 定义路由
// 每个路由应该映射一个组件
const routes = [{ path: '/foo', component: Foo },{ path: '/bar', component: Bar }
]// 3. 创建 router 实例,然后传 `routes` 配置
const router = new VueRouter({routes
})// 4. 通过 Vue.use() 明确地安装路由功能
Vue.use(VueRouter);// 5. 创建和挂载根实例。
// 通过 router 配置参数注入路由,让整个应用都有路由功能
new Vue({router,render: h => h(App),
}).$mount('#app')

src/App.vue

<template><div id="app"><p><!-- 使用 router-link 组件来导航. --><!-- 通过传入 `to` 属性指定链接. --><!-- <router-link> 默认会被渲染成一个 `<a>` 标签 --><router-link to="/foo">Foo</router-link><br /><router-link to="/bar">Bar</router-link></p><!-- 路由出口,路由匹配到的组件将渲染在这里 --><router-view></router-view></div>
</template><script>
export default {name: "App",components: {},
};
</script>

2、动态路由

2.1 定义动态路径参数

动态路径参数以冒号开头

const User = {template: '<div>User</div>'
}const router = new VueRouter({routes: [// 动态路径参数 以冒号开头{ path: '/user/:id', component: User }]
})

现在像 /user/123 和 /user/456 都将映射到相同的路由

2.2 获取动态路径的参数

当匹配到一个路由时,参数值会被设置到 this.$route.params,可以在每个组件内使用

const User = {template: '<div>User {{ $route.params.id }}</div>'
}

可以通过 $route.params 查看所有的参数信息
$route 对象还提供了其它有用的信息

const User = {template: '<div>User {{ $route.params.id }}</div>',created: function () {console.log(this.$route)}
}

当路由是 /user/101 时,$route 示例:
在这里插入图片描述

2.3 捕获所有路由

可以使用通配符 (*):

{// 会匹配所有路径path: '*'
}
{// 会匹配以 `/user-` 开头的任意路径path: '/user-*'
}

3、嵌套路由

要在嵌套的出口中渲染组件,需要在 VueRouter 的参数中使用 children 配置:
src/main.js

import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'import UserView from './components/UserView.vue'
import FooView from './components/FooView.vue'
import BarView from './components/BarView.vue'const routes = [{path: '/user',component: UserView,children: [{// 当 /user/foo 匹配成功,// FooView 会被渲染在 User 的 <router-view> 中path: 'foo',component: FooView},{// 当 /user/bar 匹配成功,// BarView 会被渲染在 User 的 <router-view> 中path: 'bar',component: BarView},]},
]const router = new VueRouter({routes
})Vue.use(VueRouter);new Vue({router,render: h => h(App),
}).$mount('#app')

顶层 <router-view> 出口,App.vue

<template><div id="app"><p><router-link to="/user/foo">Foo</router-link><br /><router-link to="/user/bar">Bar</router-link><br /></p><!-- 这个是顶层的 router-view --><router-view></router-view></div>
</template><script>
export default {name: "App",components: {},
};
</script>

组件同样可以包含自己的嵌套 <router-view>
组件 UserView.vue

<template><div class="user"><h2>User</h2><router-view></router-view></div>
</template>

组件 BarView.vue

<template><div>bar</div>
</template>

组件 FooView.vue

<template><div>foo</div>
</template>

要注意,以 / 开头的嵌套路径会被当作根路径

4、编程式的导航

4.1 router.push

这个方法会向 history 栈添加一个新的记录
代码实现路由跳转:

router.push(location, onComplete?, onAbort?)
声明式编程式
<router-link :to="..." >router.push(...)

该方法的参数可以是一个字符串路径,或者一个描述地址的对象,示例:

<template><div id="app"><div><button @click="routeUser">字符串跳转user</button><button @click="routeFoo">对象跳转foo</button><button @click="routeBarParams">对象跳转带参数Params</button><button @click="routeBarQuery">对象跳转带参数Query</button></div><!-- 这个是顶层的 router-view --><router-view></router-view></div>
</template><script>
export default {name: "App",components: {},methods: {routeUser() {// 字符串this.$router.push("/user");},routeFoo() {// 对象this.$router.push({path: "/foo"});},routeBarParams() {// 命名的路由(带name属性)this.$router.push({ name: 'bar', params: { id: '123' }})},routeBarQuery() {// 带查询参数,变成 /bar?id=456this.$router.push({ path: '/bar', query: { id: '456' }})// 注意:如果提供了 path,params 会被忽略// 下面的 params 不生效// this.$router.push({ path: '/bar', params: { id }}) // -> /user},},
};
</script>

4.2 router.replace

跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录

router.replace(location, onComplete?, onAbort?)
声明式编程式
<router-link :to="..." replace>router.replace(...)

4.3 router.go(n)

这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。
示例:

// 在浏览器记录中前进一步,等同于 history.forward()
router.go(1)// 后退一步记录,等同于 history.back()
router.go(-1)// 前进 3 步记录
router.go(3)

5、命名路由

可以在创建 Router 实例的时候,在 routes 配置中使用 name 给某个路由设置名称:

const router = new VueRouter({routes: [{path: '/user/:userId',name: 'user',component: User}]
})

6、重定向

重定向也是通过 routes 配置来完成,使用 redirect
下面例子是从 /a 重定向到 /b:

const router = new VueRouter({routes: [{ path: '/a', redirect: '/b' }]
})

三、进阶

1、导航守卫

1.1 全局前置守卫

使用 router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ...
})

每个守卫方法接收三个参数:

  • to: Route: 即将要进入的目标 路由对象
  • from: Route: 当前导航正要离开的路由
  • next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
    • next(): 进行管道中的下一个钩子
    • next(false): 中断当前的导航
    • next(‘/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址

确保 next 函数在任何给定的导航守卫中都被严格调用一次。它可以出现多于一次,但是只能在所有的逻辑路径都不重叠的情况下,否则钩子永远都不会被解析或报错

身份时重定向到 /login 的示例:

router.beforeEach((to, from, next) => {if (to.name !== 'Login' && !isAuthenticated) {next({ name: 'Login' })} else {next()}
})

1.2 全局后置钩子

也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from) => {// ...
})

1.3 路由独享的守卫

可以在路由配置上直接定义 beforeEnter 守卫:

const router = new VueRouter({routes: [{path: '/foo',component: Foo,beforeEnter: (to, from, next) => {// ...}}]
})

1.4 组件内的守卫

可以在路由组件内直接定义以下路由导航守卫:
beforeRouteEnter
beforeRouteUpdate
beforeRouteLeave

const Foo = {template: `...`,beforeRouteEnter(to, from, next) {// 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当守卫执行前,组件实例还没被创建},beforeRouteUpdate(to, from, next) {// 在当前路由改变,但是该组件被复用时调用// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 `this`},beforeRouteLeave(to, from, next) {// 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`}
}

完整的导航解析流程

  1. 导航被触发。
  2. 在失活的组件里调用 beforeRouteLeave 守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
  5. 在路由配置里调用 beforeEnter。
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter。
  8. 调用全局的 beforeResolve 守卫 (2.5+)。
  9. 导航被确认。
  10. 10.调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入

2、路由懒加载

就是当路由被访问的时候才加载对应的组件
示例:

const Foo = () => import('./Foo.vue')const router = new VueRouter({routes: [{ path: '/foo', component: Foo }]
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/248807.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无需 Root 卸载手机预装软件,精简过的老年机又行了

基础准备 准备目标手机、USB 数据线、以及一台电脑。手机 USB 连接电脑&#xff0c;开发者选项中打开 USB 调试。&#xff08;开发者选项默认隐藏&#xff0c;需要在关于手机中多次点击版本号才能调出&#xff09;。 安装手机驱动&#xff0c;下载安装 ADB 工具包。 开始操作…

ChatGPT 官方中文页面上线

根据页面显示&#xff0c;OpenAI 现已推出 ChatGPT 的多语言功能 Alpha 版测试&#xff0c;允许用户选择不同语言的界面进行交互。 如下图所示&#xff0c;ChatGPT 会检测系统当前所使用的语言&#xff0c;并提示用户进行语言切换。 用户也可通过设置页面选择其他语言。目前&a…

使用Promethues+Grafana监控Elasticsearch

PromethuesGrafana监控Elasticsearch 监控选用说明指标上报流程说明实现监控的步骤搭建elasticsearch-exporter服务搭建promethues和grafana服务 监控选用说明 虽然用Kibana来监控ES&#xff0c;能展示一些关键指标&#xff0c;但ES本身收集的指标并不全面&#xff0c;还需要在…

MicrosoftEdge浏览器打开网页出现“此网站被人举报不安全”问题时解决办法

1&#xff1a;有时候不知怎么回事用电脑自带的微软浏览器进行搜索会出现以下的问题 这可能是由于我们的浏览器安全审查过于严格引起的 Windows10正式版系统下&#xff0c;使用Edge浏览器浏览网页时候&#xff0c;发现整个页面突然变成了红色&#xff0c;显示“已有人举报此网站…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-5 Canvas 绘制三角形

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>Canvas 绘制三角形</title> </head><body><canvas id"cavsElem">您的浏览器不支持Canvas&#xff0c;请升级浏览器</canvas…

Android App开发-简单控件(1)——文本显示

本章介绍了App开发常见的几类简单控件的用法&#xff0c;主要包括&#xff1a;显示文字的文本视图、容纳视图的常用布局、响应点击的按钮控件、显示图片的图像视图等。然后结合本章所涉及的知识&#xff0c;完成一个实战项目“简单计算器”的设计与实现。 1.1 文本显示 本节介绍…

QWT开源库使用

源代码地址&#xff1a;Qwt Users Guide: Qwt - Qt Widgets for Technical Applications Qwt库包含GUI组件和实用程序类&#xff0c;它们主要用于具有技术背景的程序。除了2D图的框架外&#xff0c;它还提供刻度&#xff0c;滑块&#xff0c;刻度盘&#xff0c;指南针&#xf…

STM32F407移植OpenHarmony笔记6

继上一篇笔记&#xff0c;编译好STM32的裸机程序&#xff0c;能点亮LED灯了。 下一步就是启动liteos_m内核了。 不过为了更好的调试代码&#xff0c;需要先把printf重定向到串口&#xff0c;基于gcc的printf重定向和Keil不一样。 直接新建printf.c&#xff0c;在里面重写printf…

Gin 框架之jwt 介绍与基本使用

文章目录 一.JWT 介绍二.JWT认证与session认证的区别2.1 基于session认证流程图2.2 基于jwt认证流程图 三. JWT 的构成3.1 header : 头部3.2 payload : 负载3.2.1 标准中注册的声明 (建议但不强制使用)3.2.2 公共的声明3.2.3 私有的声明3.2.4 定义一个payload 3.3 signatrue : …

linux平台 LED情报板网关项目总结

LED情报板目前已经基本稳定 主要存在两个版本LED1.5 和LED2 两个版本的主要差别是 &#xff1a; 1.1.5的配置文件存在本地 2.0的存在平台 需要通过接口从平台获取 2.1.5的下发消息的时候需要同步返回 2.0的是异步返回&#xff0c;所以1.5的要尽可能完成 不然会导致发 布平台…

确认项目范围基准 常见的5大问题

确认项目范围基准的过程中&#xff0c;经常会遇到一些问题&#xff0c;如经常出现项目范围不明确、范围变更频繁等问题&#xff0c;往往会导致项目延期、超预算、质量下降等问题&#xff0c;严重的话可能会导致项目失败。 因此&#xff0c;我们在进行项目范围基准确认时&#x…

MySQL数据库基础合集

MySQL数据库基础合集 目录 MySQL数据库基础合集SQL关键字DDL关键字DML关键字DQL关键字DCL关键字约束关键字 SQL基础数据类型整数类型字符类型浮点类型时间类型 数据定义语言DDL1.查看数据库2.创建库3.删除库4.切换库5.创建表6.删除表7.查看表8.查看表属性9.插入列10.修改列11.设…

2023年数学大事件盘点

目录 ChatGPT驱动数学变革提速2023年阿贝尔奖花落得克萨斯大学奥斯汀分校教授路易斯卡法雷利一个全新的更紧的拉姆齐数的上界埃尔德什-图兰猜想新突破几何学家卡拉比逝世中国科学院院士、数学家杨乐逝世参考文献悄悄地,春节马上来临,在这辞旧迎新的日子里也是我们三行数学总结…

Adobe Camera Raw forMac/win:掌控原始之美的秘密武器

Adobe Camera Raw&#xff0c;这款由Adobe开发的插件&#xff0c;已经成为摄影师和设计师们的必备工具。对于那些追求完美、渴望探索更多创意可能性的专业人士来说&#xff0c;它不仅仅是一个插件&#xff0c;更是一个能够释放无尽创造力的平台。 在数字摄影时代&#xff0c;R…

github官网连接超时解决方案(图解版,亲测成功)

目录 一、521github镜像站1.1、521github镜像站访问地址 二、Github520镜像站2.1、Github520镜像站访问地址地址 三、UsbEAm Hosts Editor加速器3.1、UsbEAm加速器下载、安装及使用 四、SwitchHosts加速器4.1、SwitchHosts加速器下载、安装及使用 五、原名&#xff08;Steam)目…

blender 画笔的衰成曲线Falloff Curve

Blender画笔是用来在雕刻模式或绘画模式下对物体进行修改的工具。画笔有不同的类型和设置&#xff0c;可以影响画笔的效果和外观。你提到的选项是画笔的衰减曲线&#xff08;Falloff Curve&#xff09;的预设&#xff0c;它们决定了画笔的强度如何随着距离中心的距离而变化。 …

计算机设计大赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

【pdf密码】怎么打印加密的PDF文件?

PDF文件是可以打开查看的&#xff0c;但是现在不能编辑、不能打印&#xff0c;功能栏中的功能都是灰色的&#xff0c;这种设置了加密的PDF文件该如何加密&#xff1f; 如果PDF中的大多数功能按钮以及打印按钮都是灰色的状态&#xff0c;那就证明是文件的问题导致不能打印的。 …

Sentinel之力:解锁@SentinelResource注解的神奇威力

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Sentinel之力&#xff1a;解锁SentinelResource注解的神奇威力 前言SentinelResource注解基础&#xff1a;数字法术的咒语SentinelResource 注解的基本概念和作用&#xff1a;在方法上添加 SentinelRe…

Linux 入门基础知识(一)—— Linux的基本使用

Linux 入门基础知识 一、Linux的基本使用和配置1.1、终端1.2、消耗内存1.3、运行级别1.6、登录前欢迎语1.5、登录后欢迎语1.6、shell1.7、ps aux1.8、设置主机名1.9、whoami和who am i1.10、命令提示符 二、Linux执行命令的过程详解和命令类型2.1、命令执行2.2、hash缓存表2.3、…