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

前言:

  在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的尴尬了!

原文地址:https://www.cnblogs.com/mmzuo-798/p/10413888.html

时间: 2024-08-13 13:51:06

vue 项目中当访问路由不存在的时候默认访问404页面的相关文章

如何在Vue项目中给路由跳转加上进度条

1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大减轻用户的等待压力,提升用户体验.本篇文章就来教你如何在Vue项目中实现这样的进度条. 2.安装Nprogress 虽然我们也可以自己手动实现这样的功能,但是,nprogress.js已经帮我们把进度条的样式呀,功能呀都已经封装的很好了,既然有现成的轮子,我们就直接使用轮子就好啦! npm inst

vue 项目中访问出现 Invalid Host header

使用vue-cli 构建vue项目,使用了nginx 做了反向代理,访问项目出现 原因:webpack-dev-server 检查 host,如果不是配置的内容,将不能访问 解决:在webpack.dev.conf.js 中,添加如下代码 1 devServer: { 2 disableHostCheck: true 3 } 添加此内容可绕过主机检查. 原文地址:https://www.cnblogs.com/amy2017/p/10356536.html

如何去除vue项目中的 # --- History模式

使用vue-cli搭建的环境,在配置好路由之后,可以看到下面的情况: 但是不难发现#的出现真的很丑陋,并且也不知道这是什么作用? 所以就去Stack Overflow上搜索了,果然还有~  看来Stack Overflow是真的强大,你在项目中遇到的问题实际上在so上都已经被问过并且解决了,这不:    这是最高票的回答,即在vue2中将mode模式设置为history,试过之后确实奏效! 但是知道这样可以解决问题,却不知道为什么,这是不行的, 随着连接,我们看到了文档. 所以这篇文章也就是引申

vue项目中遇到的那些事。

前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vue2 + vuex + vue-router + webpack + ES6/7 + element-ui + vue-baidu-map + i18n + vue-awesome-swiper 做项目时总是有一些思考和踩过的坑,对以后有一定的帮助,今天就来写写做vue项目遇到的那些事. 假如你正准

在vue项目中 如何定义全局变量 全局函数

如题,在项目中,经常有些函数和变量是需要复用,比如说网站服务器地址,从后台拿到的:用户的登录token,用户的地址信息等,这时候就需要设置一波全局变量和全局函数 定义全局变量 原理: 设置一个专用的的全局变量模块文件,模块里面定义一些变量初始状态,用export default 暴露出去,在main.js里面使用Vue.prototype挂载到vue实例上面或者在其它地方需要使用时,引入该模块便可. 全局变量模块文件: Global.vue文件: <script> const serverSr

Vue项目中遇到的一些问题总结

一.开发环境使用Ajax请求,报错 网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 changeOrigin:true, pathRewrite:{ '^/api':'' //这里理解为用api代替target中的地址 } } } 配置完后,请求依然报错,大致是https证书的问题 [HPM] Error occured while trying to proxy request /xxx/

Vue 项目中使用 jsPlumb

jsPlumb 介绍 jsPlumb 是一个强大的 JavaScript 连线库,它可以将 html中 的元素用箭头.曲线.直线等连接起来,适用于开发 Web 上的图表.建模工具.流程图.关系图等. jsPlumb 参考网站 博客园:http://www.cnblogs.com/leomYili/p/6346526.html?utm_source=itdadao&utm_medium=referral 官网:https://www.jsplumbtoolkit.com/ 安装 jsPlumb v

vue项目中使用阿里iconfont图标

在上一篇文章中介绍了如何在vue项目中使用vue-awesome,如果你想了解,请移步<vue项目中使用vue-awesome> 这里介绍一下vue项目中如何使用阿里的iconfont图标库,先看一下官网 可以看到有将近两百万的图标量,可以说我们想要的矢量图图标这里大部分都是有的,下面直接开始如何在vue项目中使用,方法有两种 方法一:简单粗暴法 1.打开 iconFont官网 选择自己喜欢的图标,并且添加购物车 例如我现在选择三个图标 点击购物车,添加至项目 为了方便可以给项目起一个名字 选

如何在Vue项目中使用vw实现移动端适配

https://www.w3cplus.com/mobile/vw-layout-in-vue.html  原文网址 如何在Vue项目中使用vw实现移动端适配 作者:大漠 日期:2018-01-25 点击:10362 vw Layout 布局 Vue mobile 编辑推荐:使用 Coding.net 搭建静态博客,自定义域名,全站 HTTPS 加密,自动实时部署, 立即托管您的网站! 有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flexible实现手淘H5页