vue根據後端選單資料生成動態路由

2021-10-23 13:49:55 字數 2259 閱讀 8791

動態路由初體驗,存在不足,歡迎點評指正~

前言:在之前的專案中,選單是動態獲取的,而路由是寫死的,配置路由的時候只要保證路由的path與選單的index(elementui的el-menu元件)相同就可以實現路由跳轉,只是選單改了的話,路由也得相應修改,否則就會找不到頁面。當時之所以沒有研究動態路由是覺得跳轉的頁面是路由指定的,如果路由變成動態獲取的話,前端的頁面檔案命名和目錄結構都得根據後端的資料調整,也不是很靈活,但是…最近後端調整了資料,發現好多路由沒有匹配到,都跳轉到了乙個重定向/redirect頁面,所以最終還是決定動手研究動態路由!

component -> 由上級選單的componentname加上本級選單的componentname組成檔案路徑

meta的title -> menuname

具體**:

/*

* @author: wushiqi

* @descripttion: 獲取路由:遍歷傳入的選單列表,拿取拼接路由所需的資料(path、name、title、component)

* @date: 2020-08-19 10:44:15

* @lasteditor: wushiqi

* @lastedittime: 2020-08-25 16:07:33

*/// layout元件是專案中的主頁面,切換路由時,僅切換layout中的元件

import layout from '@/layout'

export function getasyncroutes(routes) `], resolve),

meta:

})})

res.push()}})

return res

}

邏輯:首次登入時獲取選單,同時執行getasyncroutes方法獲取路由表,將得到的路由資料使用addroutes新增到路由表,並且將每一項路由push到路由的options。注意乙個坑:f5重新整理頁面時,會執行路由的跳轉的操作,而再次獲取選單和路由這個操作是在路由跳轉之後的,所以在重新整理的時候就找不到起始的路由(除了寫死的路由之外),解決辦法是讓再次獲取選單和路由的操作在路由跳轉之前,我這邊的思路是在第一次獲取選單時,將選單存到sessionstorage,之後重新整理的時候不再訪問介面重新獲取。

這是寫死的路由(未新增動態資料):

這是新增了動態資料之後的路由: 

獲取選單部分**:

async created() )

console.log(this.$router);

sessionstorage.setitem('menu', json.stringify(data)) // 將選單列表存到sessionstorage

}} else )}}

根據下面拼接的結果調整目錄

比如使用者管理拼接完成是@/views/basedata/user,則目錄是這個樣子的 

我的預設路由有一項是重定向,所有匹配不到的路由都會跳轉到重定向頁面。

改為動態路由之後發現,重新整理的時候路由會跳轉到重定向頁面,所以要在重定向頁面讓路由跳轉回原來的頁面。

,]},

重定向頁面**:

重定向頁面的sessionstorage.topage存的是重新整理前訪問的頁面,相關**新增在router.beforeeach裡面

if (!to.redirectedfrom && to.path !== '/redirect')
這樣就完成動態路由啦~ 只是這樣以後,重新整理頁面會先跳轉至redirect頁面,然後再跳轉回原先的頁面,重新整理的速度變慢了,視覺上也會看見一閃的白屏,尋求更好的方法~

根據後端返回列表資料動態生成後台管理系統許可權選單

專案需求 後端返回許可權陣列,前端通過js操作,生成一棵許可權樹,並將這棵樹動態加入路由route中,從而實現動態生成後台管理系統左側選單欄 後端返回的資料 第一步 將後端返回的列表資料轉換成一棵樹tree 實現 生成許可權樹 const createtree arr arr.map item ma...

Vue 動態新增路由及生成選單

寫後台管理系統,估計有不少人遇過這樣的需求 根據後台資料動態新增路由和選單。為什麼這麼做呢?因為不同的使用者有不同的許可權,能訪問的頁面是不一樣的。在網上找了好多資料,終於想到了解決辦法。利用 vue router 的addroutes方法可以動態新增路由。先看一下官方介紹 router.addro...

Vue 動態新增路由及生成選單

寫後台管理系統,估計有不少人遇過這樣的需求 根據後台資料動態新增路由和選單。為什麼這麼做呢?因為不同的使用者有不同的許可權,能訪問的頁面是不一樣的。在網上找了好多資料,終於想到了解決辦法。利用 vue router 的addroutes方法可以動態新增路由。先看一下官方介紹 router.addro...