vue 项目中当访问路由不存在的时候默认访问404页面
前言:
在Vue项目中,当访问的页面路由不存在或错误时,页面显示为一片空白。然而,通常我们需要对访问url不存在或者错误的情况下添加默认的404页面,即not found页面。
一般的处理方法是:
在最后添加一个path: * ,优先级从上到下查找路由,都没有的时候全部指向 404页面 ,代码如下:
- const baseRoute = [
- { path: '/login', name: 'login', component: Login },
- {path: '/', redirect: '/index', component: Layout, name: 'dashboard'},
- // 404page
- { path: '/404', name: 'page404', component: page404 },
- {
- path: '/',
- redirect: '/index',
- component: Layout,
- children: [
- {
- path: 'index',
- name: 'index',
- component: ModeIndex,
- meta: {
- title: '', // 设备建模
- icon: ''
- }
- },
- {
- path: 'project',
- name: 'project',
- component: Project,
- meta: {
- dynamic: true, // 动态面包屑标题
- title: ''
- }
- }
- ]
- }
- {
- path: '*', // 页面不存在的情况下会跳到404页面
- redirect: '/404',
- name: 'notFound',
- hidden: true
- }
- ]
- const router = new Router({
- routes: baseRoute
- })
问题:
这样做好处是简单,方便,但是因为我代码里面添加了如下代码,用于页面token失效跳出登录的时候记住当前路由,当下次再登录的时候直接跳到指定路由
- if (to.path.slice(1) !== '') {
- router.push({
- path: '/login',
- query: {
- redirect: to.path.slice(1)
- }
- })
- } else {
- router.push({
- path: '/login'
- })
- }
就是因为加了所有找不到都指向404,导致了第一次不知道网址的人输错后,redirect就指向了404,这样用户第一次登录成功后页面就进入404,体验很差,产品和测试也一直以为是页面出bug了,为了解决这个问题,查找了相关资料,下面是优化后的方法。
优化后的设置方式:
1、route --> index.js
末尾去掉 * --> 404
- const baseRoute = [
- { path: '/login', name: 'login', component: Login },
- {path: '/', redirect: '/index', component: Layout, name: 'dashboard'},
- // 404page
- {path: '/404', component: page404, name: 'page404'},
- {
- path: '/',
- redirect: '/index',
- component: Layout,
- children: [
- {
- path: 'index',
- name: 'index',
- component: ModeIndex,
- meta: {
- title: '', // 设备建模
- icon: ''
- }
- },
- {
- path: 'project',
- name: 'project',
- component: Project,
- meta: {
- dynamic: true, // 动态面包屑标题
- title: ''
- }
- }
- ]
- },
- // {
- // path: '*', // 页面不存在的情况下会跳到404页面
- //redirect: '/404',
- //name: 'notFound',
- //hidden: true
- //}
- ]
- const router = new Router({
- routes: baseRoute
- })
2、在router.beforeEach 里面使用 to.matched 匹配出的路由个数来作为判断条件,匹配不到路由就跳转到404页面,代码如下
pemmision.js
代码如下:
- import router from './router'
- import { getCookie } from './utils/auth'
- // 通过beforeEach钩子来判断用户是否登陆过 有无token
- const whiteList = ['/login'] // 不重定向白名单
- // const userInfo = getUserInfo()
- router.beforeEach((to, from, next) => {
- console.log(to.matched)
- // 判断是否有登录过
- if (getCookie('userId_dev')) {
- // 如果包含userId_dev 从登录页面跳转 直接跳转到首页 /
- if (to.path === '/login') {
- next()
- } else {
- if (to.matched.length === 0) {
- next('/404') // 判断此跳转路由的来源路由是否存在,存在的情况跳转到来源路由,否则跳转到404页面
- }
- next() // 如果匹配到正确跳转
- }
- // 没有登录
- } else {
- if (whiteList.indexOf(to.path) !== -1) {
- next()
- } else {
- // 还没有登录过 则跳转到登录界面
- // next('/login')
- if (to.path.slice(1) !== '') {
- if (to.matched.length === 0) {
- router.push({
- path: '/login'
- })
- } else {
- router.push({
- path: '/login',
- query: {
- redirect: to.path.slice(1)
- }
- })
- }
- } else {
- router.push({
- path: '/login'
- })
- }
- }
- }
- })
这样就解决了一开始输错就跳到404的尴尬了!
vue 项目中当访问路由不存在的时候默认访问404页面的更多相关文章
- 如何去除vue项目中的 # — vue路由的History模式
前言 在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头. 添加 mode: 'history' 之后将使用 HTML5 his ...
- 如何在Vue项目中给路由跳转加上进度条
1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大 ...
- vue项目中路由验证和相应拦截的使用
详解Vue路由钩子及应用场景(小结):https://www.jb51.net/article/127678.htm vue项目中路由验证和相应拦截的使用:https://blog.csdn.net/ ...
- 去除vue项目中的#及其ie9兼容性
一.如何去除vue项目中访问地址的# vue2中在路由配置中添加mode(vue-cli创建的项目在src/router/index.js) export default new Router({ m ...
- vue项目中遇到的那些事。
前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...
- 如何去除vue项目中的 # --- History模式
来自:https://www.cnblogs.com/zhuzhenwei918/p/6892066.html 侵删 使用vue-cli搭建的环境,在配置好路由之后,可以看到下面的情况: 但是不难发现 ...
- vue项目微信分享之后路由链接被破坏怎么办
异常现象: 多页面应用,路由采用hash模式,链接带有"#". 在微信中分享到朋友圈或好友时,分享出去的路由被破坏,打开分享的链接,路由中的“#”会被去掉并追加?fromTimel ...
- vue项目中遇到的一些问题
或访问:https://github.com/littleHiuman/experiences-about-vue 欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...
- Vue项目中遇到的一些问题总结
一.开发环境使用Ajax请求,报错 网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 chan ...
随机推荐
- Golang随机数生成
需求:10以内随机生成2个幸运数字 package main import ( "fmt" "math/rand" ) func main() { fmt.Pr ...
- 通信(二):进程间通信之socket
一.为什么要学习socket? 我们打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?我们用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket.本地的进程间通 ...
- Error:"Java patch PatchPasswordEncryption_J10001 is being applied by some other process" when starting Ranger Admin
SupportKB Problem Description: When starting Ranger admin, it fails to start up with the following e ...
- css块级元素和行内元素详细解析
块级元素和行内元素是布局中常见的两种基本元素,但是未必有很多人深入的研究它们的细微差别. 常见块级元素:div p form ul ol li 等: 常见的行内元素:span stronh em; ...
- windows的80端口被占用时的处理方法
1.利用jfinal极速开发时,显示异常,80端口被占用. 2.win+R输入cmd打开黑窗口. netstat -ano | findstr 3.发现进程被占用,输入以下指令停止http服务 net ...
- 《IDEO,设计改变一切》(Change By Design)- 读书笔记
一.关于IDEO与设计思维 IDEO是一家世界顶级创意公司,而作者蒂姆布朗是IDEO的CEO.当然,在未阅读本书之前,我都是不知道的,也不会主动去了解IDEO和蒂姆布朗的.那么,我为什么要去读这样一本 ...
- Linux 用户与组的基本操作及文件权限位的设置方法
用户的基本操作 添加用户: useradd xxx 查看所有的用户: cat /etc/passwd 用户更改组: usermod -G groups loginname 将用户从组中删除: gpas ...
- Js-函数式编程
前言 JavaScript是一门多范式语言,即可使用OOP(面向对象),也可以使用FP(函数式),由于笔者最近在学习React相关的技术栈,想进一步深入了解其思想,所以学习了一些FP相关的知识点,本文 ...
- DS控件库 在Combobox中嵌入远程桌面
本示例演示DS开放式下拉列表控件中加入一个RDP远程桌面控件. 先在VS工具箱中添加COM控件Microsoft RDP Client Control,后面的Version版本可以适当高点. 然后将R ...
- 校园生活app结对开发第一天
今天刚开始开发,要安装android studio及熟悉软件操作