最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3嵌套路由中使用keep-alive緩存多層的實現(xiàn)

 更新時間:2023年04月18日 08:34:55   作者:劉圣凱  
本文介紹了Vue3 嵌套路由中使用?keep-alive緩存多層的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

keep-alive是Vue中的緩存標(biāo)簽, 組件在標(biāo)簽中的內(nèi)容會被緩存下來;但是在多層嵌套的router-view中, 只能緩存到該層下的router-view, 由于路由嵌套比較常見,所以這里提供兩種我覺得OK的解決方案。

解決思路

  • 路由層級扁平化,在路由守衛(wèi)中執(zhí)行一個拍平的函數(shù),將需要緩存的路由提升到第一層,這樣處理會影響到路由層級,最直白的影響如對 面包屑 等功能有直接影響
  • 把所有的 router-view 都通過 keep-alive 包裹起來, 通過keep-aliveinclude, exclude 來判斷是否需要緩存。

Demo項目結(jié)構(gòu)

router.ts

路由的結(jié)構(gòu)大概是這樣的 Layout > TableManage > (List, Detail, Add...)

路由層級扁平化

在路由的 afterEach 執(zhí)行一個扁平化方法, 舉例:

import router from '@/router/index'
import PageTitleUtils from '@/utils/PageTitleUtils'
import { ElMessage } from 'element-plus'
import useStore from '@/store/index'
import type { RouteLocationNormalized, NavigationGuardNext } from 'vue-router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const { user, routeStore } = useStore()

const whiteList = ['/login'] // no redirect whitelist

router.beforeEach(async (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
  NProgress.start()
  if (user.hasToken()) {
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    } else {
      if (user.hasUserInfo()) {
        next()
        NProgress.done()
      } else {
        try {
          await user.getUserInfo()
          await routeStore.setRoutes()
          next({ ...to, replace: true })
          NProgress.done()
        } catch (error: any) {
          routeStore.resetRoutes()
          user.resetUserInfo()
          ElMessage.error(error || 'Has Error')
          next(`/login?redirect=${to.fullPath}`)
          NProgress.done()
        }
      }
    }
  } else {
    /* has no token */
    if (whiteList.indexOf(to.path) !== -1) {
      // in the free login whitelist, go directly
      next()
      NProgress.done()
    } else {
      // other pages that do not have permission to access are redirected to the login page.
      next(`/login?redirect=${to.fullPath}`)
      NProgress.done()
    }
  }
})

router.afterEach((to: any) => {
  NProgress.done()
  // set page title
  const { meta }: any = to
  document.title = PageTitleUtils.getPageTitle(meta.title)
  // delayering router
  delayeringRoute(to)
})


/**
 * 遞歸處理多余的 layout : <router-view>,
 * 讓需要訪問的組件保持在第一層 index : <router-view> 之下
 */
function delayeringRoute(to: RouteLocationNormalized) {
  if (to.matched && to.matched.length > 2) {
    for (let i = 0; i < to.matched.length; i++) {
      const element = to.matched[i]
      // 移除多余的 layout, 也許你項目中并不叫 layout ,自行修改此處
      if (element.components?.default.name === 'layout') {
        to.matched.splice(i, 1)
        handleKeepAlive(to)
      }
    }
  }
}

以上代碼示例中, delayeringRoute 是移除多余 layout 的方法, 在路由的afterEach方法中去移除,弊端很明顯, 路由的結(jié)構(gòu)受到了影響

給所有的 router-view 都嵌套上 keep-alive

這是我比較推薦的一種方法, 沒什么副作用,也不麻煩, 畢竟所有的 router-view 都一樣,如果你使用的IDE是vscode,可以直接把這段代碼寫進(jìn)項目中的代碼片段, 方便使用。

Layout的Main

<script lang="ts" setup name="AppMain">
  import { useRoute } from 'vue-router'
  import useStore from '@/store';
  import { storeToRefs } from 'pinia';

  const route = useRoute()
  const { tagview } = useStore()
  const { cacheList } = storeToRefs(tagview)
</script>

<template>
  <div class="app-main">
    <router-view v-slot="{ Component }">
      <keep-alive :include="cacheList">
        <component :is="Component" :key="route.fullPath" />
      </keep-alive>
    </router-view>
  </div>
</template>

<style scoped lang="scss">
</style>

其他嵌套的路由, 不管幾層,都可以這樣處理

<script lang="ts" setup name="TableManage">
  import { useRoute } from 'vue-router'
  import useStore from '@/store';
  import { storeToRefs } from 'pinia';
  import { onMounted } from 'vue';

  const route = useRoute()
  const { tagview } = useStore()
  const { cacheList } = storeToRefs(tagview)

  onMounted(() => {
    tagview.addCacheList('TableManage')
  })

</script>

<template>
  <router-view v-slot="{ Component }">
    <keep-alive :include="cacheList">
      <component :is="Component" :key="route.fullPath" />
    </keep-alive>
  </router-view>
</template>

這樣就可以實現(xiàn)嵌套路由的緩存了。 附上演示

到此這篇關(guān)于Vue3嵌套路由中使用keep-alive緩存多層的實現(xiàn)的文章就介紹到這了,更多相關(guān)Vue3 keep-alive緩存多層內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在vue中更換字體,本地存儲字體非引用在線字體庫的方法

    在vue中更換字體,本地存儲字體非引用在線字體庫的方法

    今天小編就為大家分享一篇在vue中更換字體,本地存儲字體非引用在線字體庫的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue-cli打包后本地運行dist文件中的index.html操作

    vue-cli打包后本地運行dist文件中的index.html操作

    這篇文章主要介紹了vue-cli打包后本地運行dist文件中的index.html操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue關(guān)于頁面刷新的幾個方式解讀

    vue關(guān)于頁面刷新的幾個方式解讀

    這篇文章主要介紹了vue關(guān)于頁面刷新的幾個方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue?codemirror實現(xiàn)在線代碼編譯器效果

    vue?codemirror實現(xiàn)在線代碼編譯器效果

    這篇文章主要介紹了vue-codemirror實現(xiàn)在線代碼編譯器?,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 如何封裝Vue Element的table表格組件

    如何封裝Vue Element的table表格組件

    這篇文章主要介紹了如何封裝Vue Element的table表格組件,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-02-02
  • Vue生命周期和鉤子函數(shù)的詳解與經(jīng)典面試題

    Vue生命周期和鉤子函數(shù)的詳解與經(jīng)典面試題

    Vue生命周期是指vue實例對象從創(chuàng)建之初到銷毀的過程,vue所有功能的實現(xiàn)都是圍繞其生命周期進(jìn)行的,下面這篇文章主要給大家介紹了關(guān)于Vue生命周期和鉤子函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • vue cli3適配所有端方案的實現(xiàn)

    vue cli3適配所有端方案的實現(xiàn)

    這篇文章主要介紹了vue cli3適配所有端方案的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Vue3的7種種組件通信詳情

    Vue3的7種種組件通信詳情

    Vue3兼容大部分Vue2的特性,用Vue2代碼開發(fā)Vue3都可以,性能上面打包大小減少 41%,初次渲染快 55%,更新快 133%,內(nèi)存使用減少 54%,本篇文章主要介紹Vue3的7種種組件通信,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Vue中設(shè)置el-select的高度不生效問題及解決方案

    Vue中設(shè)置el-select的高度不生效問題及解決方案

    文章介紹了如何使用ElementUI框架中的el-select組件,并解決設(shè)置其高度不生效的問題,在Vue2.x中,使用/deep/關(guān)鍵字可以穿透組件作用域修改樣式;在Vue2.6+到Vue3初期,推薦使用::v-deep關(guān)鍵字;在最新的Vue3和構(gòu)建工具中,推薦使用:deep()偽類來代替::v-deep
    2025-01-01
  • Vue中的生命周期介紹

    Vue中的生命周期介紹

    這篇文章介紹了Vue中的生命周期,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論

莆田市| 永仁县| 邳州市| 隆子县| 疏勒县| 镇江市| 盐源县| 阿克| 德保县| 图木舒克市| 镇巴县| 东乡县| 游戏| 山西省| 静宁县| 喀什市| 霍山县| 左权县| 朝阳市| 运城市| 偃师市| 临潭县| 西乡县| 林甸县| 开远市| 萍乡市| 米易县| 新安县| 辰溪县| 兴宁市| 绥中县| 洛浦县| 青神县| 陕西省| 庆元县| 克什克腾旗| 钟山县| 万安县| 马尔康县| 新丰县| 巍山|