91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue3嵌套路由中怎么使用keep-alive緩存多層

發布時間:2023-04-18 09:49:08 來源:億速云 閱讀:259 作者:iii 欄目:開發技術

本篇內容主要講解“Vue3嵌套路由中怎么使用keep-alive緩存多層”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Vue3嵌套路由中怎么使用keep-alive緩存多層”吧!

前言

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

解決思路

  • 路由層級扁平化,在路由守衛中執行一個拍平的函數,將需要緩存的路由提升到第一層,這樣處理會影響到路由層級,最直白的影響如對 面包屑 等功能有直接影響

  • 把所有的 router-view 都通過 keep-alive 包裹起來, 通過keep-aliveinclude, exclude 來判斷是否需要緩存。

Demo項目結構

router.ts

Vue3嵌套路由中怎么使用keep-alive緩存多層

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

路由層級扁平化

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

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方法中去移除,弊端很明顯, 路由的結構受到了影響

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

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

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>

這樣就可以實現嵌套路由的緩存了。

到此,相信大家對“Vue3嵌套路由中怎么使用keep-alive緩存多層”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铅山县| 灌南县| 新巴尔虎左旗| 肥乡县| 囊谦县| 岳阳县| 安多县| 绵阳市| 峡江县| 游戏| 灵宝市| 崇明县| 手机| 鄂托克旗| 德保县| 廊坊市| 汉寿县| 买车| 汾西县| 胶州市| 道孚县| 北川| 喀喇沁旗| 盘山县| 建湖县| 肥城市| 襄樊市| 雅江县| 鱼台县| 大英县| 夏邑县| 崇明县| 新民市| 运城市| 中江县| 莆田市| 大兴区| 西畴县| 怀远县| 岑巩县| 台中市|