詳解vue-template-admin三級路由無法緩存的解決方案

1. 為什么三級會緩存不了

創新互聯公司專注于銅官網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供銅官營銷型網站建設,銅官網站制作、銅官網頁設計、銅官網站官網定制、微信平臺小程序開發服務,打造銅官網絡公司原創品牌,更為您提供銅官網站排名全網營銷落地服務。

在src/layout/AppMain組件:

詳解vue-template-admin三級路由無法緩存的解決方案

keep-alive的組件依賴cachedViews,cachedViews是store中的一個狀態,cachedViews的邏輯在src/layout/TagView

詳解vue-template-admin三級路由無法緩存的解決方案

當路由變更時就會調用addViewTags,addViewTag會根據匹配的路由name屬性進行緩存。而用到三級路由的時候,拿到name只能時第三級路由的name,二級路由組件的名字會丟失,keep-alive就不會進行緩存。
知道原因之后,第一個想法就是把二級路由的name也加上去就好了。要實現這個也很簡單,只需要獲取到matched屬性就可以拿到匹配到的路由組件,把它加入到cachedViews數組就好了。但是有個問題就是,假設這里有個二級路由1-1,三級路由1-1-1,1-1-2,當要關掉1-1-1組件時,你到底要不要把1-1給刪了,如果刪了,緩存能順利失效,但是如果你之前是打開了1-1-2,緩存的路由就會失效,因為它是依賴1-1的。如果不刪的話,在側邊欄打開1-1-1的鏈接的時候,它又會重新復用回原本的組件。

2 把三級(概念上的)轉化為二級(真實)

在這里想來,如果1-1-1,1-1-2,其實只是因為分在同類別里,兩者如果沒有實際共享的數據,那可以考慮把1-1的路由組件關掉,在我實踐的項目就是如此,1-1-1和1-1-2只是同屬在二級菜單下,并沒有共享數據。但是生成菜單的時候是用router表的,那么生成菜單的用原本的,生成路由的時候用替換的。

下面是demo代碼:

將要被替換的路由加上noCompoent屬性。

function delteFakeParent(router,prefix) {
 var newRouter = { ...router }
 if(prefix){
 newRouter.path = prefix + '/' + router.path
 }
 if (!router.children) return newRouter
 var children = []
 if (router.noCompoent) {
 for (let i = 0; i < router.children.length; i++) {
  const item = delteFakeParent(router.children[i], newRouter.path)
  if (Array.isArray(item)) {
  item.forEach(el => {
   children.push(el)
  })
  }else{
  children.push(item)
  }
 }
 newRouter = children
 } else {
 for (let i = 0; i < router.children.length; i++) {
  const item = delteFakeParent(router.children[i])
  if (Array.isArray(item)) {
  item.forEach(el => {
   children.push(el)
  })
  }
 }
 newRouter.children = children
 }
 
 return newRouter
}

var backendManageRouter1 = {
 name: 'BackendManage',
 meta: {
 title: '后臺管理',
 icon: 'index-management'
 },
 children: [{
 path: 'user-manage',
 name: 'UserManage',
 noCompoent: true,
 meta: {
  title: '用戶管理',
  icon: 'rule-definition'
 },
 alwaysShow: true,
 children: [{
  path: 'user',
  name: 'User',
  meta: {
  title: '用戶管理',
  icon: 'quality-control'
  },
  noCompoent: true,
  children: [
  {
   path: 'a',
   name: 'ad',
   meta: {
   title: 'ad管理',
   icon: 'quality-control'
   },
  }
  ]
 }, {
  path: 'role',
  name: 'Role',
  meta: {
  title: '角色管理',
  icon: 'rule-task-monitor'
  }
 }]
 }]
}

delteFakeParent這個函數做的就是創建一個router副本,遍歷它的children,當這個路由被標記為noCompoent: true,就把它替換成它的children,回溯的過程中如果router是一個數組就代表這個router是被替換過,那么就遍歷它,把它每一項放到router.children里面,這樣就可以做到跟它其他children平級。
修改了這個之后要記著把真實router和菜單router同時暴露出去,菜單的項目是讀取store中的permission.js的routers,那么這里set-router一方面要處理真是router和菜單router,需要增加一個state

3. 使用vuex存儲數據

上面那個方案也只是針對二級路由組件不需要顯示出來,那么可以放到一級路由的children里面,但是如果是有需要的話,還是使用vuex來存儲數據比較好。

到此這篇關于vue-template-admin三級路由無法緩存的解決方案的文章就介紹到這了,更多相關vue-template-admin三級路由緩存內容請搜索創新互聯以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持創新互聯!

本文名稱:詳解vue-template-admin三級路由無法緩存的解決方案
瀏覽路徑:http://m.kartarina.com/article18/gecggp.html

成都網站建設公司_創新互聯,為您提供網站策劃品牌網站制作、做網站、響應式網站、企業建站虛擬主機

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站建設網站維護公司
主站蜘蛛池模板: 狼人无码精华AV午夜精品| 亚洲精品无码日韩国产不卡av| 亚州AV综合色区无码一区| 亚洲va成无码人在线观看| 无码人妻丰满熟妇精品区| 69久久精品无码一区二区| 无码一区18禁3D| 内射无码专区久久亚洲| 伊人久久无码中文字幕| 久久久g0g0午夜无码精品| 久久久精品人妻无码专区不卡| 无码乱人伦一区二区亚洲一 | 亚洲AV无码成人精品区大在线| 国产在线无码不卡影视影院 | 亚洲精品无码久久久| 无码人妻精品一区二区三区久久 | 无码国产69精品久久久久孕妇| 国产成人无码18禁午夜福利p| 中文字幕无码成人免费视频| 国产午夜无码精品免费看动漫| 免费VA在线观看无码| 少妇久久久久久人妻无码| 无码国产精品一区二区免费vr| 无码免费又爽又高潮喷水的视频 | 国产成人无码AV片在线观看| 日韩乱码人妻无码中文字幕| 国产精品无码久久久久久| 日韩精品无码永久免费网站| 无码亚洲成a人在线观看| 亚洲Av综合色区无码专区桃色| 丰满少妇人妻无码| 日韩中文无码有码免费视频| 无码国产激情在线观看| 亚洲最大天堂无码精品区| 无码人妻精品中文字幕免费| 久久亚洲AV成人无码软件| 亚洲国产精品无码久久九九大片| 亚洲AV成人噜噜无码网站| 亚洲人成网亚洲欧洲无码| 一夲道dvd高清无码| 久久无码av亚洲精品色午夜 |