欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

可控制緩存銷(xiāo)毀的?keepAlive?組件實(shí)現(xiàn)詳解

 更新時(shí)間:2022年10月14日 08:53:35   作者:我的代碼果然有問(wèn)題  
這篇文章主要為大家介紹了可控制緩存銷(xiāo)毀的?keepAlive?組件實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

簡(jiǎn)介

關(guān)于 Vue 的 KeepAlive

<KeepAlive> 是一個(gè)內(nèi)置組件,它的功能是在多個(gè)組件間動(dòng)態(tài)切換時(shí) 緩存 被移除的組件實(shí)例

我們可以利用這一特性來(lái)解決當(dāng)路由切換時(shí)頁(yè)面組件被銷(xiāo)毀的問(wèn)題,常見(jiàn)的業(yè)務(wù)場(chǎng)景有表單緩存,列表緩存定位,返回時(shí)保持狀態(tài)等,網(wǎng)上有很多教程涉及,但是對(duì)如何自主控制緩存的組件銷(xiāo)毀這一塊大多講的不是很清晰。

本文會(huì)以初學(xué)者的角度出發(fā),一步一步帶你了解 keepAlive 的特性并實(shí)現(xiàn)一個(gè)可以自主控制什么時(shí)候銷(xiāo)毀緩存頁(yè)面的 keepAlive 組件 —— app-router-view

思路

在編寫(xiě)這一組件時(shí)我們的思路是先在路由配置中加入緩存標(biāo)識(shí),然后在<router-view> 組件里加上<KeepAlive>標(biāo)簽,然后通過(guò)緩存標(biāo)識(shí)判斷是否緩存該組件,為了操作緩存的銷(xiāo)毀,我們會(huì)用到 include 屬性,通過(guò)操作 include 里的組件名實(shí)現(xiàn)自主銷(xiāo)毀組件,以下是具體實(shí)現(xiàn)步驟。

在 Routes 中添加 keepAlive 緩存標(biāo)識(shí)

const routes = [
    {
        path: '/index',
        name: 'index',
        component: () => import('@/views/index.vue'),
        meta: {
            title: '首頁(yè)',
            keepAlive: false // 緩存標(biāo)識(shí)
        }
    }
]

創(chuàng)建 app-router-view 組件

<template>
    <router-view v-slot="{ Component, route }">
        <keep-alive>
            <component :is="Component" v-if="route.meta.keepAlive"/>
        </keep-alive>
        <component :is="Component" v-if="!route.meta.keepAlive"/>
    </router-view>
</template>

這就是大家平時(shí)看教程比較常見(jiàn)的模式了,也能實(shí)現(xiàn)一些簡(jiǎn)單的需求,但還存在問(wèn)題,就是當(dāng)我們不需要緩存時(shí)候無(wú)法手動(dòng)清除緩存,等會(huì)繼續(xù)完善,這里先給大家簡(jiǎn)單介紹下<router-view> 的 v-slot 和標(biāo)簽里的 :is 是做什么的,這兩個(gè)東西工作中并不常用,新同學(xué)可能比較陌生,這里也簡(jiǎn)單科普下。

router-view 中的 v-slot

簡(jiǎn)單說(shuō) v-slot 可以讓我們方便的拿到路由標(biāo)簽包裹的組件和路由對(duì)象

主要用于方便我們使用 <transition><keep-alive> 組件來(lái)包裹我們自己的組件

標(biāo)簽里的 :is

官網(wǎng)介紹是用于綁定動(dòng)態(tài)組件,簡(jiǎn)單說(shuō)就是可以讓標(biāo)簽轉(zhuǎn)化為我們指定的 vue 組件

實(shí)現(xiàn)手動(dòng)清除頁(yè)面緩存

這里簡(jiǎn)單說(shuō)下思路,<keep-alive> 標(biāo)簽上有 include 屬性,會(huì)接收一個(gè)數(shù)組,數(shù)組里的值是我們要緩存頁(yè)面的組件名,我們可以通過(guò)操作 include 的值來(lái)手動(dòng)銷(xiāo)毀我們的緩存頁(yè)面。

這里需要特別注意這個(gè)組件名,沒(méi)有理解好這一塊實(shí)踐中就會(huì)出現(xiàn)各種奇奇怪怪的問(wèn)題?。?!

組件名指的是 vue 組件定義時(shí)的那個(gè)命名,同時(shí)我們 routes 里定義的 name 需要與之對(duì)應(yīng),否則找不到關(guān)系,以下圖為例,默認(rèn)情況下,我們 vue 的文件名就是我們最終引入的組件名,即 list-one 與 list-two 就是需要我們維護(hù)在 routes 中的名字

了解了這一點(diǎn)后我們來(lái)開(kāi)始代碼實(shí)現(xiàn)

定義組件名的方法

一般情況下我們可以通過(guò)文件名稱來(lái)做組件名,但是很多時(shí)候我們會(huì)遇到文件名稱一樣的問(wèn)題,這時(shí)候就需要我們自定義組件名了,這里推薦兩種方法原生模式和插件模式

  • 原生模式
<script> 
export default { 
    name: 'component-name' // 你的組件名 
} 
</script>
  • 插件模式

使用 vite-plugin-vue-setup-extend 插件擴(kuò)展語(yǔ)法糖

// 安裝插件
npm i unplugin-vue-components -D     
// 在頁(yè)面 script setup 標(biāo)簽中定義 name
<script setup name="component-name">
// This starter template is using Vue 3 <script setup> SFCs
// ...
</script>

配置好路由 name 與組件 name 對(duì)應(yīng)關(guān)系

{
    path: '/list-one',
    name: 'list-one',
    component: () => import('@/views/list-one.vue'),
    meta: {
        title: '列表 1',
        keepAlive: false
    }
},
{
    path: '/list-two',
    name: 'list-two',
    component: () => import('@/views/list-two.vue'),
    meta: {
        title: '列表 2',
        keepAlive: true
    }
}

在 pinia 或者 vuex 中定義好操作緩存列表的方法

我這里以 pinia 為例,創(chuàng)建 useKeepAliverStore 模塊,通過(guò) add , 與 remove 操作緩存列表

/**
 * @description: 緩存控制
 */
 export const useKeepAliverStore = defineStore('keepAliver', {
    state: () => ({
        caches: []
    }),
    getters: {},
    actions: {
        add(name) {
            if (!this.caches.includes(name)) {
                this.caches.push(name)
            }
        },
        remove(name) {
            this.caches = this.caches.filter((item) => item !== name)
        },
        clear() {
            this.caches = []
        }
    }
})

添加路由守衛(wèi),在頁(yè)面進(jìn)入時(shí)維護(hù)緩存列表

import { useKeepAliverStore } from '@/store/modules/keepAliver'
export function setupKeepAliver(router) {
    router.beforeEach((to, from, next) => {
        if (to.meta.keepAlive) {
            console.log('keepAliver')
            const { add } = useKeepAliverStore()
            add(to.name)
        }
        next()
    })
}

調(diào)整組件,維護(hù)好 include

<script setup>
// This starter template is using Vue 3 <script setup> SFCs
import { useKeepAliverStore } from '@/store/modules/keepAliver'
const { caches } = storeToRefs(useKeepAliverStore())
</script>
<template>
    <router-view v-slot="{ Component, route }">
        <keep-alive :include="caches">
            <component
                :is="Component"
                v-if="route.meta.keepAlive"
                :key="route.name"
            />
        </keep-alive>
        <component
            :is="Component"
            v-if="!route.meta.keepAlive"
            :key="route.name"
        />
    </router-view>
</template>

這樣就大功告成啦,當(dāng)我們想要銷(xiāo)毀某個(gè)頁(yè)面,只要調(diào)用下 remove 方法移除 caches 里對(duì)應(yīng)的組件名,就可以銷(xiāo)毀該頁(yè)面的緩存了

demo地址:jyliyue/keep-alive-demo (github.com)

以上就是可控制緩存銷(xiāo)毀的 keepAlive 組件實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于可控制緩存銷(xiāo)毀keepAlive組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue如何定義全局變量和全局方法實(shí)例代碼

    vue如何定義全局變量和全局方法實(shí)例代碼

    在項(xiàng)目中經(jīng)常會(huì)復(fù)用一些變量和函數(shù),比如用戶的登錄token,用戶信息等,這時(shí)將它們?cè)O(shè)為全局的就顯得很重要了,下面這篇文章主要給大家介紹了關(guān)于vue如何定義全局變量和全局方法的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • IDEA創(chuàng)建Vue項(xiàng)目的兩種方式總結(jié)

    IDEA創(chuàng)建Vue項(xiàng)目的兩種方式總結(jié)

    這篇文章主要介紹了IDEA創(chuàng)建Vue項(xiàng)目的兩種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-04-04
  • vuex頁(yè)面刷新數(shù)據(jù)丟失解決方法詳解

    vuex頁(yè)面刷新數(shù)據(jù)丟失解決方法詳解

    這篇文章主要為大家介紹了vuex頁(yè)面刷新數(shù)據(jù)丟失解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 關(guān)于Vue中keep-alive的作用及使用方法

    關(guān)于Vue中keep-alive的作用及使用方法

    keep-alive是Vue的內(nèi)置組件,當(dāng)它包裹動(dòng)態(tài)組件時(shí),會(huì)緩存不活動(dòng)的組件實(shí)例,該組件將不會(huì)銷(xiāo)毀,這篇文章主要介紹了關(guān)于Vue中keep-alive的作用是什么?怎么使用,需要的朋友可以參考下
    2023-04-04
  • Vue+Element實(shí)現(xiàn)表格編輯、刪除、以及新增行的最優(yōu)方法

    Vue+Element實(shí)現(xiàn)表格編輯、刪除、以及新增行的最優(yōu)方法

    這篇文章主要為大家詳細(xì)介紹了Vue+Element實(shí)現(xiàn)表格的編輯、刪除、以及新增行的最優(yōu)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 淺談關(guān)于.vue文件中style的scoped屬性

    淺談關(guān)于.vue文件中style的scoped屬性

    本篇文章主要主要介紹了淺談關(guān)于.vue文件中style的scoped屬性,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 基于Vue2.0和Typescript實(shí)現(xiàn)多主題切換的示例

    基于Vue2.0和Typescript實(shí)現(xiàn)多主題切換的示例

    本文主要介紹了基于Vue2.0和Typescript實(shí)現(xiàn)多主題切換的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • vue組件(全局,局部,動(dòng)態(tài)加載組件)

    vue組件(全局,局部,動(dòng)態(tài)加載組件)

    組件是Vue.js最強(qiáng)大的功能之一。組件可以擴(kuò)展HTML元素,封裝可重用的代碼。這篇文章主要介紹了vue組件(全局,局部,動(dòng)態(tài)加載組件),需要的朋友可以參考下
    2018-09-09
  • ElementUI之Message功能拓展詳解

    ElementUI之Message功能拓展詳解

    這篇文章主要介紹了ElementUI之Message功能拓展詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • vue3使用elementPlus進(jìn)行table合并處理的示例詳解

    vue3使用elementPlus進(jìn)行table合并處理的示例詳解

    虛擬數(shù)據(jù)中公司下有多個(gè)客戶,公司一樣的客戶,公司列需要合并,客戶如果一樣也需要合并進(jìn)行展示,所以本文給大家介紹了vue3使用elementPlus進(jìn)行table合并處理的實(shí)例,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評(píng)論