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 混淆加密收藏
Jan 16 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
JQuery给元素绑定click事件多次执行的解决方法
May 29 Javascript
使用jQuery仿苹果官网焦点图特效
Dec 23 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
Jun 20 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
JS中with的替代方法与String中的正则方法详解
Dec 23 Javascript
vue组件watch属性实例讲解
Nov 07 Javascript
js中this对象用法分析
Jan 05 Javascript
原生JS实现简单的无缝自动轮播效果
Sep 26 Javascript
小程序绑定用户方案优化小结
May 15 Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 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
实现获取http内容的php函数分享
2014/02/16 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
Angular排序实例详解
2017/06/28 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
Python Queue模块详细介绍及实例
2016/12/27 Python
python2.7到3.x迁移指南
2018/02/01 Python
python实现任意位置文件分割的实例
2018/12/14 Python
Python assert关键字原理及实例解析
2019/12/13 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Python sublime安装及配置过程详解
2020/06/29 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
毕业生在校学习的自我评价分享
2013/10/08 职场文书
肯尼迪就职演说稿
2013/12/31 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
前台文员职责范本
2014/03/07 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
采购内勤岗位职责
2015/04/13 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书