中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么使用vue3?keep-alive實現tab頁面緩存功能

發布時間:2023-04-24 17:37:01 來源:億速云 閱讀:207 作者:iii 欄目:開發技術

本篇內容介紹了“怎么使用vue3 keep-alive實現tab頁面緩存功能”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

先上圖

怎么使用vue3?keep-alive實現tab頁面緩存功能

如何在我們切換tab標簽的時候,緩存標簽最后操作的內容,簡單來說就是每個標簽頁中設置的比如搜索條件及結果、分頁、新增、編輯等數據在切換回來的時候還能保持原樣。

看看keep-alive是如何實現該功能的。

首先我們要了解keep-alive的基本使用。

這里有幾個問題需要注意一下:

1、需要考慮頁面共用的問題,如“新增/編輯”不是彈窗而是跳轉頁面,打開新增頁面返回列表點擊編輯頁面,如果不做緩存清理跳轉的將還是新增頁面。

2、當頁面關閉時再次打開如何清理之前的緩存。

廢話不多說,上代碼:

先創建一個處理緩存路由的文件 useRouteCache.ts

import { ref, nextTick, watch } from 'vue'
import store from '../store'

const caches = ref<string[]>([])
let collect = false

export default function useRouteCache() {
  const route = store.state

  // 收集當前路由相關的緩存
  function collectRouteCaches() {
    route.visitedView.forEach((routeMatch) => {
      const componentName: any = routeMatch?.name

      // 已打開的路由組件添加到緩存
      if (!componentName) {
        return
      }
      addCache(componentName)
    })
  }

  // 收集緩存(通過監聽)
  function collectCaches() {
    if (collect) {
      return
    }
    collect = true
    watch(() => route.path, collectRouteCaches, {
      immediate: true
    })
  }

  // 添加緩存的路由組件
  function addCache(componentName: string | string[]) {
    if (Array.isArray(componentName)) {
      componentName.forEach(addCache)
      return
    }

    if (!componentName || caches.value.includes(componentName)) return
    caches.value.push(componentName)
  }

  // 移除緩存的路由組件
  function removeCache(componentName: string | string[]) {
    if (Array.isArray(componentName)) {
      componentName.forEach(removeCache)
      return
    }

    const index = caches.value.indexOf(componentName)
    //
    if (index > -1) {
      return caches.value.splice(index, 1)
    }
  }

  // 移除緩存的路由組件的實例
  async function removeCacheEntry(componentName: string) {
    if (removeCache(componentName)) {
      await nextTick()
      addCache(componentName)
    }
  }

  return {
    collectCaches,
    caches,
    addCache,
    removeCache,
    removeCacheEntry
  }
}

然后在動態路由頁面進行引入:

<template>
  <router-view v-slot="{ Component }">
    <keep-alive :include="caches" :max="10">
      <component :is="Component" />
    </keep-alive>
  </router-view>
</template>

<script lang="ts">
import { defineComponent, onMounted } from 'vue'
import useRouteCache from './hooks/useRouteCache'
export default defineComponent({
  name: 'Main',
  setup() {
    const { caches } = useRouteCache()
    // 收集已打開路由tabs的緩存
    const { collectCaches } = useRouteCache()
    onMounted(collectCaches)

    return {
      caches
    }
  }
})
</script>

這里做的是菜單可配置的,也就是從后臺讀取的。如果是本地路由更簡單,只需要在路由對象meta中加入keep屬性,true表示當前路由需要緩存,false則不需要緩存

之前說的兩個問題,這里說下解決辦法:

在我們的tabbar(也就是tab標簽)組件中,監聽路由變化時進行判斷,新增頁面是不帶參數的,編輯頁帶參數,通過這個進行緩存清除

watch: {
      const findItem: any = this.state.visitedView.find(
        (it) => it.name === newVal.name
      )
      if (
        findItem &&
        newVal.name === findItem?.name &&
        newVal.fullPath !== findItem?.fullPath
      ) {
        // 同一個路由,但是新舊路徑不同時,需要清除路由緩存。例如route.path配置為 '/detail/:id'時路徑會不同
        removeCacheEntry(newVal.name)
      } else {
        addCache(newVal.name)
      }
    }
  }

還有就是當我們關閉tab頁時清除路由緩存

removeTab(name) {
      const findItem: any = this.state.visitedView.find(
        (it) => it.fullPath === name
      )
      if (findItem) {
        store.removeVisitedView(findItem).then((_) => {
          if (this.currentTab === name) {
            this.currentTab =
              this.state.visitedView[this.state.visitedView.length - 1].fullPath
            this.$router.push(this.currentTab)
          }
        })
        // 同時移除tab緩存
        removeCache(findItem.name || '')
      }
    }

這里的路由都是保存在store中,可根據自己項目進行相應的修改即可完成頁面的緩存功能。

“怎么使用vue3 keep-alive實現tab頁面緩存功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

沁源县| 丘北县| 澳门| 博湖县| 宁波市| 和顺县| 石柱| 治县。| 新昌县| 休宁县| 青海省| 延长县| 涿鹿县| 通城县| 翼城县| 诸城市| 石楼县| 福安市| 天门市| 阳江市| 荔波县| 石河子市| 邯郸县| 卫辉市| 桃江县| 祥云县| 昭觉县| 富源县| 荆州市| 竹山县| 望江县| 洛浦县| 临沂市| 建德市| 祁连县| 汝阳县| 若羌县| 沅陵县| 门源| 张家川| 泽普县|