1. 程式人生 > 程式設計 >keep-alive不能快取多層級路由選單問題解決

keep-alive不能快取多層級路由選單問題解決

這出現的原因是多級路由導致的,就是router-view巢狀 在層級不同的router-view中切換tag會出現快取資料失效的問題。目前keep-alive可以有效快取一級,二級的路由選單,3級以上選單並不能做到快取,這裡提供一個解決方案:

在cachedViews中手動加上一級選單和三級選單之間,缺失的二級選單的名字,這樣二級選單下的元件就會快取了

實列程式碼如下:

keep-alive不能快取多層級路由選單問題解決

const _import = require('@/router/_import_prodection');//獲取元件的方法
import {tree} from '@/utils/treeDate'
import Layout from '@/views/layout'
import EmptyTemplate from '@/views/layout/EmptyTemplate'

export function filterAsyncRouter(routerlist) {
  const routerlists=tree(routerlist )
  //獲取路由資訊
  function getRouter(routerlists){
    routerlists.forEach(e => {
    // 刪除無用屬性
    delete e.catalogCode
    delete e.catalogOrder
    delete e.endpoints
    delete e.fullOrder
    
    // delete e.permName
    // delete e.id
    // delete e.parentId
    e.name=e.catalogName
    
    if (e.parentId === 0||e.children) {//Layout元件特殊處理
      //路徑為空時會因為undefind報錯,給個預設值來解決
      e.path = e.url||'nopath'
      if(e.url.split('/').length>2){
      //處理多層級路的時候給了一個空模板
        e.component = EmptyTemplate
      }else{
        e.component = Layout
      }
      e.icon='setting-fill'
      
    } else {
      e.icon='circle'
      e.component = _import(e.url)
      //路徑為空時會因為undefind報錯,給個預設值來解決
      e.path = e.url.split('/')[2]||'nopath'
    }
    // delete e.parentId
    delete e.url
    // if (e.redirect === '') {
    //  delete e.redirect
    // }
    
    if (e.icon !== '' && e.title !== '') { // 配置 選單標題 與 圖示
      e.meta = {
        // title: e.catalogName 中文名稱
         // catalogEngName 英文名稱
        title: e.catalogEngName,titleZh:e.catalogName,icon: e.icon
      }
    }
    delete e.catalogName
    delete e.icon
    delete e.title
    // delete e.name//由於名字的存在導致named 錯誤 刪掉
    if (e.children != null) {
      // 存在子路由就遞迴
      getRouter(e.children)
    }
    })
    return routerlists
  }
  const getRouters=getRouter(routerlists)
    // return asyncRouterMap
    
  return getRouters
}

空模板的程式碼如下:

<template>
<div>
  <app-main/>
</div>
</template>
<script>
import { AppMain} from './components'
export default {
  name:'EmptyTemplate',components:{AppMain}
  
}
</script>

tagsViewd.js關鍵程式碼,在cachedViews中加入空模板的name

const state = {
 visitedViews: [],cachedViews: ['EmptyTemplate']
}

到此這篇關於keep-alive不能快取多層級路由選單問題解決的文章就介紹到這了,更多相關keep-alive不能多層快取內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!