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 相关文章推荐
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
Jun 19 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
Sep 01 Javascript
javascript制作的简单注册模块表单验证
Apr 13 Javascript
javascript拖拽应用实例
Mar 25 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
Apr 13 Javascript
购物车前端开发(jQuery和bootstrap3)
Aug 27 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
JavaScript数据结构学习之数组、栈与队列
May 02 Javascript
利用vue和element-ui设置表格内容分页的实例
Mar 02 Javascript
Vue数据绑定简析小结
May 07 Javascript
在vue中使用Echarts画曲线图的示例
Oct 03 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
php正则表达式(regar expression)
2011/09/10 PHP
php算法实例分享
2015/07/14 PHP
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
python格式化字符串实例总结
2014/09/28 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
python实现的简单抽奖系统实例
2015/05/22 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
Python如何转换字符串大小写
2020/06/04 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
师范应届生语文教师求职信
2013/10/29 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
中学教师教育感言
2014/02/21 职场文书
房产公证书范本
2014/04/10 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis