前言:
在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)
(1)go方法
(2)replace:用新的路径替换错误路径,同时创建错误页面的组件
a——b(不存在的路径)——c(用c取代了b);所以路径中就是a——c
(3)push:a——b(不存在的路径)——c(在b后面添加了c);所以路径就是a——b——c
以上这篇vue 项目中当访问路由不存在的时候默认访问404页面操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?