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 相关文章推荐
js 字符串操作函数
Jul 25 Javascript
javascript 传统事件模型构造的事件监听器实现代码
May 31 Javascript
15个款优秀的 jQuery 图片特效插件推荐
Nov 21 Javascript
JS的replace方法介绍
Oct 20 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
js+css实现超简洁的二级下拉菜单效果代码
Sep 07 Javascript
整理Javascript数组学习笔记
Nov 29 Javascript
Javascript基础教程之比较null和undefined值
May 16 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
Dec 21 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 Javascript
使用angularjs.foreach时return的问题解决
Sep 30 Javascript
微信小程序全局变量功能与用法详解
Jan 22 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引用的调用方法分析
2016/04/25 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
Python 多线程实例详解
2017/03/25 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
Python工厂函数用法实例分析
2018/05/14 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
校园游戏活动新闻稿
2014/10/15 职场文书
小学教代会开幕词
2016/03/04 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis
Go并发4种方法简明讲解
2022/04/06 Golang