Vue單頁及多頁應(yīng)用全局配置404頁面實(shí)踐記錄
前后端分離后,控制路由跳轉(zhuǎn)的責(zé)任轉(zhuǎn)移到了前端,后端只負(fù)責(zé)給前端返回一個(gè)html文檔以及提供各種接口。下面我們用作例子的兩個(gè)項(xiàng)目,均采用vue作為基礎(chǔ)框架,一個(gè)是SPA應(yīng)用,另一個(gè)是多頁應(yīng)用,均由前端進(jìn)行路由控制及渲染的。
總體思路
無論單頁還是多頁,我的實(shí)現(xiàn)思路是總體配置404頁面的思路就是在前端路由表中添加一個(gè) path: '/404' 的路由,渲染相應(yīng)的404頁面。同時(shí),配置一個(gè)規(guī)則,當(dāng)在用戶可訪問的路由表中的所有路由都無法匹配的時(shí)候,自動(dòng)跳轉(zhuǎn)重定向至該404頁面。下面來說一下針對(duì)單頁和多頁,我不同的實(shí)現(xiàn)方式。
SPA的404路由配置
單頁應(yīng)用配置404頁面,也區(qū)分兩種情況:
路由表固定的情況
如果SPA的路由表是固定的,那么配置404頁面就變得非常的簡單。只需要在路由表中添加一個(gè)路徑為 404 的路由,同時(shí) 在路由表的最底部 配置一個(gè)路徑為 * 的路由,重定向至404路由即可。
(由于路由表是由上至下匹配的,一定要將任意匹配規(guī)則至于最底部,否則至于此路由規(guī)則下的路由將全部跳轉(zhuǎn)至404,無法正確匹配。)
// router.js export default new Router({ mode: 'history', routes: [ // ... { name: '404', path: '/404', component: () => import('@/views/notFound.vue') }, { path: '*', // 此處需特別注意至于最底部 redirect: '/404' } ], })
路由表動(dòng)態(tài)生成的情況
路由表是動(dòng)態(tài)生成的情況下,也就是說路由表分為兩部分,一部分為基礎(chǔ)路由表,另一部分是需要根據(jù)用戶的權(quán)限信息動(dòng)態(tài)生成的路由表。
本項(xiàng)目中動(dòng)態(tài)生成路由采用vue-router自帶的addRoutes方法,該方法是會(huì)將新的路由規(guī)則在原路由表數(shù)組的尾部注入的。由于任意匹配重定向至404頁面的規(guī)則必須至于路由表的最底部,所以此處我將重定向至404頁面的規(guī)則抽出,在動(dòng)態(tài)路由注入后,再注入重定向規(guī)則,以確保該規(guī)則至于路由表最底部。
// 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(() => { // 根據(jù)用戶權(quán)限生成可訪問的路由表 router.addRoutes(store.getters.addRouters) // 動(dòng)態(tài)添加可訪問路由表 router.addRoutes(NotFoundRouterMap) // 添加404及重定向路由規(guī)則 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) })
多頁應(yīng)用的404路由配置
多頁應(yīng)用區(qū)別于SPA的不同點(diǎn)是每個(gè)頁面有自己的一套路由,并且每個(gè)頁面可能有自己的一套404頁面風(fēng)格,當(dāng)然也可能沒有。這時(shí)候,就不能再采用動(dòng)態(tài)添加路由規(guī)則的方法了。
我采用的方案是在全局導(dǎo)航守衛(wèi)beforeEach中對(duì)路由匹配的情況進(jìn)行判斷,這時(shí)候就需要用到vue導(dǎo)航守衛(wèi)中的 matched 數(shù)組了。如果沒有一個(gè)匹配上的,那么就重定向至404頁面。當(dāng)然,這個(gè)404頁面也單獨(dú)設(shè)置為一個(gè)頁面。
// 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) })
這個(gè)方案就允許每個(gè)頁面有自己的404頁面路由規(guī)則,并且為沒有配置404頁面的路由統(tǒng)一配置了默認(rèn)的404頁面,感覺還是比較友好的。
總結(jié)
以上所述是小編給大家介紹的Vue單頁及多頁應(yīng)用全局配置404頁面實(shí)踐記錄,希望對(duì)大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- vue 單頁應(yīng)用和多頁應(yīng)用的優(yōu)劣
- vue-cli單頁應(yīng)用改成多頁應(yīng)用配置詳解
- webpack4.0+vue2.0利用批處理生成前端單頁或多頁應(yīng)用的方法
- 詳解vue-cli3多頁應(yīng)用改造
- Vue CLI3基礎(chǔ)學(xué)習(xí)之pages構(gòu)建多頁應(yīng)用
- 詳解Vue CLI3 多頁應(yīng)用實(shí)踐和源碼設(shè)計(jì)
- 手把手教你vue-cli單頁到多頁應(yīng)用的方法
- 詳解如何使用 vue-cli 開發(fā)多頁應(yīng)用
- vue 如何從單頁應(yīng)用改造成多頁應(yīng)用
相關(guān)文章
vue3語法中使用vscode打開滿屏紅線報(bào)錯(cuò)的完美解決方法
這篇文章主要介紹了vue3語法中使用vscode打開滿屏紅線報(bào)錯(cuò)的完美解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Vue數(shù)據(jù)表格增刪改查與表單驗(yàn)證代碼詳解
這篇文章主要給大家介紹了關(guān)于Vue數(shù)據(jù)表格增刪改查與表單驗(yàn)證的相關(guān)資料,Vue可以通過使用組件化的方式來實(shí)現(xiàn)表格的增刪改查功能,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10一文詳細(xì)了解Vue?3.0中的onMounted和onUnmounted鉤子函數(shù)
Vue3.0引入了新的組件生命周期鉤子函數(shù)onMounted和onUnmounted,分別用于組件掛載后和卸載前的操作,這些鉤子函數(shù)為開發(fā)者提供了更多靈活性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10vue選項(xiàng)卡Tabs組件實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了vue選項(xiàng)卡Tabs組件實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11vue-cli創(chuàng)建項(xiàng)目時(shí)由esLint校驗(yàn)導(dǎo)致報(bào)錯(cuò)或警告的問題及解決
這篇文章主要介紹了vue-cli創(chuàng)建項(xiàng)目時(shí)由esLint校驗(yàn)導(dǎo)致報(bào)錯(cuò)或警告的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05C#實(shí)現(xiàn)將一個(gè)字符轉(zhuǎn)換為整數(shù)
下面小編就為大家分享一篇C#實(shí)現(xiàn)將一個(gè)字符轉(zhuǎn)換為整數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12