vue 项目中当访问路由不存在的时候默认访问404页面操作


Posted in Javascript onAugust 31, 2020

前言:

在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中用户输入无效地址,跳转到错误提示页面

1. 在动态路由中,有的路径是无效路径,可以让无效的路劲跳转到错误提示页面

组件的$router属性的原型上有一些方法(this.$router)

vue 项目中当访问路由不存在的时候默认访问404页面操作

(1)go方法

(2)replace:用新的路径替换错误路径,同时创建错误页面的组件

a——b(不存在的路径)——c(用c取代了b);所以路径中就是a——c

(3)push:a——b(不存在的路径)——c(在b后面添加了c);所以路径就是a——b——c

vue 项目中当访问路由不存在的时候默认访问404页面操作

以上这篇vue 项目中当访问路由不存在的时候默认访问404页面操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript之bind使用介绍
Oct 09 Javascript
JS中Iframe之间传值的方法
Mar 11 Javascript
js点击更换背景颜色或图片的实例代码
Jun 25 Javascript
jquery 快速回到页首的方法
Dec 05 Javascript
javascript生成随机数方法汇总
Nov 12 Javascript
jQuery实现手机自定义弹出输入框
Jun 13 Javascript
jQuery插件实现文件上传功能(支持拖拽)
Aug 27 Javascript
深入理解Webpack 中路径的配置
Jun 17 Javascript
Vue2.0如何发布项目实战
Jul 27 Javascript
在Vue项目中使用d3.js的实例代码
May 01 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 Javascript
js实现的订阅发布者模式简单示例
Mar 14 Javascript
详解vue v-model
Aug 31 #Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
Aug 31 #Javascript
vue路由结构可设一层方便动态添加路由操作
Aug 31 #Javascript
element-ui tree结构实现增删改自定义功能代码
Aug 31 #Javascript
vue elementui tree 任意级别拖拽功能代码
Aug 31 #Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
Aug 31 #Javascript
JS遍历树层级关系实现原理解析
Aug 31 #Javascript
You might like
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
php不用正则采集速度探究总结
2008/03/24 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
初学JavaScript第二章
2008/09/30 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
医学类个人求职信范文
2014/02/05 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
小学语文复习计划
2015/01/19 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP