Vue单页及多页应用全局配置404页面实践记录


Posted in Javascript onMay 22, 2018

前后端分离后,控制路由跳转的责任转移到了前端,后端只负责给前端返回一个html文档以及提供各种接口。下面我们用作例子的两个项目,均采用vue作为基础框架,一个是SPA应用,另一个是多页应用,均由前端进行路由控制及渲染的。

总体思路

无论单页还是多页,我的实现思路是总体配置404页面的思路就是在前端路由表中添加一个 path: '/404' 的路由,渲染相应的404页面。同时,配置一个规则,当在用户可访问的路由表中的所有路由都无法匹配的时候,自动跳转重定向至该404页面。下面来说一下针对单页和多页,我不同的实现方式。

SPA的404路由配置

单页应用配置404页面,也区分两种情况:

路由表固定的情况

如果SPA的路由表是固定的,那么配置404页面就变得非常的简单。只需要在路由表中添加一个路径为 404 的路由,同时 在路由表的最底部 配置一个路径为 * 的路由,重定向至404路由即可。

(由于路由表是由上至下匹配的,一定要将任意匹配规则至于最底部,否则至于此路由规则下的路由将全部跳转至404,无法正确匹配。)

// router.js
export default new Router({
 mode: 'history',
 routes: [
 // ...
 {
 name: '404',
 path: '/404',
 component: () => import('@/views/notFound.vue')
 },
 {
 path: '*', // 此处需特别注意至于最底部
 redirect: '/404'
 }
 ],
})

路由表动态生成的情况

路由表是动态生成的情况下,也就是说路由表分为两部分,一部分为基础路由表,另一部分是需要根据用户的权限信息动态生成的路由表。

本项目中动态生成路由采用vue-router自带的addRoutes方法,该方法是会将新的路由规则在原路由表数组的尾部注入的。由于任意匹配重定向至404页面的规则必须至于路由表的最底部,所以此处我将重定向至404页面的规则抽出,在动态路由注入后,再注入重定向规则,以确保该规则至于路由表最底部。

// router.js
export default new Router({
 mode: 'history',
 routes: [
 // ...
 {
 name: '404',
 path: '/404',
 component: () => import('@/views/notFound.vue')
 },
 // ...other codes
 ],
})
// notFoundRouterMap.js
export default [
 {
 name: '404',
 path: '/404',
 component: () => import('@/views/notFound.vue')
 },
 },
 {
 path: '*',
 redirect: '/404'
 }
]
// main.js
//...other codes
router.beforeEach((to, from, next) => {
 new Promise((resolve, reject) => {
 if (getCookie(tokenName)) {
 if (!getInfo()) {
 Promise.all([store.dispatch('getBasicInfo'), store.dispatch('getUserDetail')]).then(res => {
 store.dispatch('GenerateRoutes', { roles }).then(() => { 
 // 根据用户权限生成可访问的路由表
 router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
 router.addRoutes(NotFoundRouterMap) // 添加404及重定向路由规则
 resolve({ ...to, replace: true }) // 重新加载一次路由,让路由表更新成功后走下面else的判断
 })
 
 })
 } else {
 // ...other codes
 }
 } else {
 window.location.href = '/login.html'
 }
 }).then(res => {
 if (res) {
 next(res)
 } else {
 next()
 }
 }).catch(err => {
 new Error(err)
 next(false)
 })

多页应用的404路由配置

多页应用区别于SPA的不同点是每个页面有自己的一套路由,并且每个页面可能有自己的一套404页面风格,当然也可能没有。这时候,就不能再采用动态添加路由规则的方法了。

我采用的方案是在全局导航守卫beforeEach中对路由匹配的情况进行判断,这时候就需要用到vue导航守卫中的 matched 数组了。如果没有一个匹配上的,那么就重定向至404页面。当然,这个404页面也单独设置为一个页面。

// permission.js
//...other codes
router.beforeEach((to, from, next) => {
 new Promise((resolve, reject) => {
 // ...other codes
 }).then(res => {
 if (!to.matched.length) {
 window.location = '/error.html#/404'
 return
 } 
 if (res) {
 next(res)
 } else {
 next()
 }
 }).catch(err => {
 new Error(err)
 next(false)
 })

这个方案就允许每个页面有自己的404页面路由规则,并且为没有配置404页面的路由统一配置了默认的404页面,感觉还是比较友好的。

总结

以上所述是小编给大家介绍的Vue单页及多页应用全局配置404页面实践记录,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript修改css样式style
Apr 15 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
jquery实现可拖拽弹出层特效
Jan 04 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 Javascript
javascript 解决浏览器不支持的问题
Sep 24 Javascript
微信小程序  自定义创建详细介绍
Oct 27 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
Oct 30 Javascript
Vue2递归组件实现树形菜单
Apr 10 Javascript
Angular 封装并发布组件的方法示例
Apr 19 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
vue实现输入框自动跳转功能
May 20 Javascript
Vue页面骨架屏的实现方法
May 22 #Javascript
Angular网络请求的封装方法
May 22 #Javascript
vue input输入框模糊查询的示例代码
May 22 #Javascript
vue 中swiper的使用教程
May 22 #Javascript
vue配置多页面的实现方法
May 22 #Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
May 22 #Javascript
详解js类型判断
May 22 #Javascript
You might like
用PHP实现验证码功能
2006/10/09 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
cookie中的path与domain属性详解
2013/12/18 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
react-native 封装选择弹出框示例(试用ios&android)
2017/07/11 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
python 字符串格式化代码
2013/03/17 Python
Python定时任务sched模块用法示例
2018/07/16 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
python语言元素知识点详解
2019/05/15 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
打架检讨书400字
2014/01/17 职场文书
单身联谊活动方案
2014/01/29 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers
Redis基本数据类型String常用操作命令
2022/06/01 Redis