Vue路由应用详细讲解
作者:一杆老狙 发布时间:2024-05-05 09:24:03
介绍
vue-router相当于vue内部跳转链接,将需要切换的页面在vue-router里注册,在项目里配置就能完成页面的切换,它不仅能完成项目的切换,还能实现参数的传递,它还有个很重要的功能路由导航守卫(导航守卫分为前置导航守卫,后置导航守卫,组件内置导航守卫,常用就是前置导航守卫,设置用户登录可访问的界面和未登录可访问的界面,也相当于二次拦截,(axios请求 * 是第一次拦截))。
路由跳转和传参
重点:
在vue-router中,有两大对象被挂载到了实例this
;
$route
(只读、具备信息的对象);
$router
(具备功能的函数);
1.router-link(类似a标签)
路由配置:
// 路由配置
{
path: '/pkproperties', // 路径
name:'pkproperties', // 路由名,path路径必写,用name跳转的时候是根据name名找到path进行跳转
component: () => import('@/views/pkproperties'), // 组件(组件文件名为index的可省略),路由懒加载写法
redirect: '', // 路由重定向,就是当一个页面需要切换多个路由的时候,这里面填的是首次进入页面展示的路由组件地址
hidden: true,
children: [] // 嵌套路由,当一页有很多路由需要切换的时候,就需要用到嵌套路由
},
// 组件内使用
<router-link to="/pkproperties">点击跳转</router-link> // path路径跳转
<router-link to="{name:'pkproperties',query:{id:1}}">点击跳转</router-link> // 使用命名路由name跳转
传参配置:
{
path: '/pkproperties', // 路径
name:'pkproperties', // 路由名,path路径必写,用name跳转的时候是根据name名找到path进行跳转
component: () => import('@/views/pkproperties'), // 组件(组件文件名为index的可省略)
hidden: true
},
// 使用命名路由传参,可以传递基本数据类型和数组和对象
<router-link to="{name:'pkproperties',query:{id:1}}">点击跳转</router-link> // name名跳转,query传递参数
<router-link to="{name:'pkproperties',params:{id:1}}">点击跳转</router-link> // name名跳转,params传递参数
this.$route.query.id // 获取传递的参数(.传递参数的键名)
this.$route.params.id // 获取传递的参数(.传递参数的键名)
2.编程式路由跳转(最常用的,不受时机、条件的限制)
路由配置:
{
path: '/pkproperties', // 路径
name:'pkproperties', // 路由名,path路径必写,用name跳转的时候是根据name名找到path进行跳转
component: () => import('@/views/pkproperties'), // 组件(组件文件名为index的可省略)
hidden: true
},
传参配置:
methods:{
onSkipTransferParameters(){
// params传参
this.$router.push({
name: "pkproperties",
params: {
name: '小明',
id: 1,
},
});
onSkipTransferParameters(){
// query传参
this.$router.push({
name: "pkproperties",
query: {
name: '小明',
id: 1,
},
});
}
// 获取传递的参数
this.$route.params.name // 获取就是在当前跳转的组件内调用$route实例,是用params就.params.键名获取值
this.$route.query.name // 获取就是在当前跳转的组件内调用$route实例,是用query就.query.键名获取值
query
传参在刷新界面后传递的数据不会丢失,params
传递的参数刷新界面后会丢失参数。
3.路由重定向redirect
需要用到传参的业务
{ path:"/", redirect: {path:"pkproperties", query:{Pid:'1'}} },
{ path:"pkproperties", component: ()=>import("../views/pkproperties") }
解决路由重复点击路由沉积的问题
// 把这段代码直接粘贴到router/index.js中的Vue.use(VueRouter)之前
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function (location) {
return originalPush.call(this, location).catch(err => { })
};
注意:一定要写在 Vue.use(VueRouter)
之前否则无效
解决路由跳转后不能回到顶部的页面顶部的问题
在跳转到的组件里配置下面的代码即可
mounted() {
/**
* 路由跳转回到顶部
*/
// chrome
document.body.scrollTop = 0;
// firefox
document.documentElement.scrollTop = 0;
// safari
window.pageYOffset = 0;
},
路由导航守卫和案例展示
路由前置导航守卫(beforeEach
)
// 全局导航守卫beforeEach
router.beforeEach((to, from, next) => {
// to要到哪个路由去
// from从哪个路由来
// next下一步(无论失败与否都要调用,否则会阻止程序继续执行)
}
案例1中使用(拦截未登录用户和白名单设置):
permission.js文件下配置(permission文件最好和main文件在同一目录下创建)
import router from './router'
import { getToken } from '@/common/TokenStore'
const whiteList = ['/login', '/register'] // 白名单登录注册界面无需验证Token是否登录直接放行
// 全局导航守卫beforeEach
router.beforeEach((to, from, next) => {
// 白名单中路由直接放行
if (whiteList.indexOf(to.path) !== -1) {
next()
return
}
// 判断需要登录身份认证的路由
const token = getToken() // 获取token
if (token) {
next()
} else {
next(`/login`) // 如果登录不存在,重定向到登录界面
}
})
main.js文件下引入即可
import './permission' // 引入即可
案例2中使用(设置Tokne失效实现拦截,Tokne失效就导航会登录界面重新登录,未失效就不执行操作)
login.vue(登录组件登录成功后保存Token和保存获取Token的当前时间戳在本地)
methods: {
// 登录
handleLogin() {
this.$axios.post('/api/Login',{
username: this.loginForm.username, // 用户名
password: this.loginForm.password // 密码
}).then(res => {
if(res.data.code != 0) return this.$message.error(res.data.message) // code 不等于0,返回失败的结果,(这的判断参数是根据后端返回的数据进行的,不是固定的)
if(res.data.code == 0){
this.$message.success('登录成功')
// 存储token开始时间
window.localStorage.setItem('tokenStartTime',new Date().getTime())
// 存储token
window.localStorage.setItem('token',res.data.data.token)
this.$router.push('/home/ks')
}else {
this.$message.error('登录失败')
}
})
}
}
permission.js(将保存的Token获取时间和当前时间进行一个差值的比较,如果小于我们设定的Token失效时间,就证明登录没有过期可继续访问,如果大于就登录过期Token失效需要重新登录获取。)
// 导入element提示语的组件可以去element-ui查看用法,这是按需引入的
import {
Message
} from 'element-ui'
// 添加请求 *
// * 的第二部分,第一部分在main.js里面
router.beforeEach((to, from, next) => {
// 获取存储localStorage的token
let token = window.localStorage.getItem('token')
// 获取存储token的开始时间
const tokenStartTime = window.localStorage.getItem('tokenStartTime')
// 后台给出的token有效时间为一天,这个是后端给的时间以后端为准
const timeOver = 86400000
// 获取当前时间
let date = new Date().getTime()
// 当前时间减去获取Token的时间如果大于说明是token过期了
if(date - tokenStartTime > timeOver) {
token = null // Token过期赋值为null
}
// 如果token过期了
if (!token) {
if (to.path == '/login') return next()
// 注意要import element的Message组件
Message.error("登录状态过期,请重新登录")
return next('/login')
// 如果token没有过期,又是选择了登录页面就直接重定向到首页,不需要重新输入账户密码
} else if (to.path == '/login') {
return next('/home/ks')
}
next()
})
export default router
全局后置守卫(afterEach
)
router.afterEach((to,from)=>{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->})
组件内守卫(相当于给组件增加生命周期)
beforeRouteEnter 进入组件之前
beforeRouterEnter(to,from,next){}beforeRouteUpdate 组件被复用时调用
beforeRouterUpdate(to,from,next){}beforeRouteLeave 离开组件时调用
beforeRouteLeave(to,from,next){}
访问外部链接
vue内部跳转可以通过vue-router中的this.$router.push(
)和rout-link
来实现,这里在说一下想要访问外部链接的方法
1.window.location.href = url(不新开一个页面,直接在当前页面跳转)
methods:{
onSkip(){
window.location.href = "http://xxx.xxx.xxx"
}
}
2.window.open(“url”, “_blank”)(打开一个新页面跳转)
methods:{
onSkip(){
window.open("https://xxx.xxx.xxx/", "_blank");
}
}
3.手动创建a标签,然后默认点击
var a = document.createElement("a");
a.setAttribute("href", "www.baidu.com");
a.setAttribute("target", "_blank");
a.click();
来源:https://blog.csdn.net/AKindofo/article/details/127964154


猜你喜欢
- type指示type要使用的验证器。可识别的类型值为:string:类型必须为string。type 默认是 string// 校验stri
- 本文实例分析了Go语言中关闭带缓冲区的频道。分享给大家供大家参考。具体分析如下:Go语言提供了两种频道,带缓冲区和不带缓冲区的。不带缓冲区的
- 用过一段时间的caffe后,对caffe有两点感受:1、速度确实快; 2、 太不灵活了。深度学习技术一直在发展,但是caffe的更新跟不上进
- 目录一、索引类型1.B+树2.MyISAM和InnoDB的B+树索引实现方式的区别(聚簇索引和非聚簇索引)?3.非聚簇索引4.聚簇索引的优缺
- Python OpenCV存储图像使用的是Numpy存储,所以可以将Numpy当做图像类型操作,操作之前还需进行类型转换,转换到int8类型
- 使用ASP处理XSLT转换XML比较简单,思路如下:创建一个XSLTemplate的对象,再创建一个XMLDOM对象,然后在家Xml文件和X
- 可以使用 Application 对象在给定的应用程序的所有用户之间共享信息。基于 ASP 的应用程序同所有的 .asp 文件一样在一个虚拟
- 注:答案一般在网上都能够找到。1.对if __name__ == 'main'的理解陈述2.python是如何进行内存管理的
- Windows 7下IE9安全级别设置项如下表示。(留空代表同前一列的值,无变化)类别属性中中-高高.NET FrameworkXAML 浏
- 像素误差看自己设计好上线的网站,偶尔会发觉像素行间出现了弹性空间,总在不经意间蹦出一定的差距。有些页面很难发现,比如活动类页面,这类页面多呈
- 1.什么是标准库(Standard Library)标准库指的是js的标准内置对象,是js这门语言本身初始时提供的在全局范围的对象2.Obj
- 本文实例为大家分享了python实现聊天小程序的具体代码,供大家参考,具体内容如下我这里实现的是客户端与服务端进行通信的功能,比较简单,与上
- HAVE_VFORK 是一个宏定义,用于表示当前 Python 解释器是否支持 vfork() 系统调用。vfork() 是一个类似于 fo
- 自从看了蒋鑫的《Git权威指南》之后就开始使用Git Submodule功能,团队也都熟悉了怎么使用,多个子系统(模块)都能及时更新到最新的
- Python的全局变量:int string, list, dic(map) 如果存在global就能够修改它的值。而不管这个global是
- 在设计网页时,经常遇到某些页面需限权访问的情况。比如,一个公司的某些产品只让某一或某些供应商或客户浏览。那么,我们如何实现这一功能呢?本文,
- 今天学习到python的读取文件部分。还是以一段代码为例:filename='programming.txt'with op
- 前言:数据的排序是比较常用的操作,DataFrame 的排序分为两种,一种是对索引进行排序,另一种是对值进行排序,接下来就分别介绍一下。1.
- 如下所示:# -*- coding: utf-8 -*-# 简述:话说有一对可爱的兔子,出生后的第三个月开始,每一月都会生一对小兔子。# 当
- 一、Python pass语句在实际开发中,有时候我们会先搭建起程序的整体逻辑结构,但是暂时不去实现某些细节,而是在这些地方加一些注释,方面