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

vue中的keep-alive用法指南

 更新時(shí)間:2024年10月10日 10:55:37   作者:張小瑜  
keep-alive是Vue中的一個(gè)內(nèi)置組件,用于緩存非活動(dòng)組件實(shí)例,避免重復(fù)渲染,優(yōu)化性能,本文給大家介紹vue中的keep-alive用法指南,感興趣的朋友一起看看吧

什么是keep-alive?

keep-alive是Vue的一個(gè)內(nèi)置抽象組件,通常用于緩存動(dòng)態(tài)組件或路由組件。被keep-alive包裹的組件在切換時(shí)不會(huì)被銷毀,而是被緩存下來(lái),下一次切換回這個(gè)組件時(shí),會(huì)直接復(fù)用之前的實(shí)例,保持其狀態(tài)。

<template>
  <keep-alive>
    <component :is="view"></component>
  </keep-alive>
</template>
<script>
export default {
  data() {
    return {
      view: 'homeComponent'
    };
  }
};
</script>

在這個(gè)例子中, homeComponent在被切換時(shí)不會(huì)被銷毀,而是被緩存,當(dāng)再次展示時(shí),狀態(tài)和數(shù)據(jù)都保持不變。

keep-alive重要的配置選項(xiàng)

1.include和exclude:用于控制哪些組件需要緩存,支持字符串、正則表達(dá)式或數(shù)組。

<keep-alive include="ComponentA, ComponentB" exclude="ComponentC">
  <router-view></router-view>
</keep-alive>

2.max:用于指定緩存的組件數(shù)量,當(dāng)超出這個(gè)數(shù)量時(shí),最久未使用的組件實(shí)例將被銷毀。

<keep-alive :max="6">
  <router-view></router-view>
</keep-alive>

生命周期鉤子

keep-alive還引入了兩個(gè)新的組件生命周期鉤子,用于處理緩存組件:

  • activated:當(dāng)組件被激活時(shí)觸發(fā)(即從緩存中恢復(fù)時(shí))
  • deactivated:當(dāng)組件被停用時(shí)觸發(fā)(即被緩存時(shí)) 
export default {
  activated() {
    console.log('組件被激活了');
  },
  deactivated() {
    console.log('組件被緩存了');
  }
};

適用場(chǎng)景

  • 多頁(yè)簽(Tab)切換:在復(fù)雜的表單或多步操作場(chǎng)景中,用戶頻繁切換頁(yè)面,如果使用keep-alive,切換回來(lái)的頁(yè)面能保留之前輸入的數(shù)據(jù)或操作狀態(tài)。
  • 路由緩存:在Vue項(xiàng)目中,常常會(huì)在路由切換時(shí)希望保持組件的狀態(tài),如商品詳情頁(yè)、搜索頁(yè)面等。 

keep-alive的核心原理

  • 緩存實(shí)例:當(dāng)組件被第一次加載時(shí),keep-alive會(huì)將組件的實(shí)例緩存起來(lái)。
  • 組件復(fù)用:當(dāng)你切換到一個(gè)已經(jīng)被緩存的組件時(shí),keep-alive會(huì)從緩存中提取該組件的實(shí)例,而不是重新創(chuàng)建。
  • 生命周期管理:為了處理組件的激活和停用,keep-alive引入了activated和deactivated鉤子,在組件進(jìn)入或離開緩存時(shí)觸發(fā)。 

核心原理:

  • 緩存實(shí)例:當(dāng)組件被第一次加載時(shí),keep-alive會(huì)將組件的實(shí)例緩存起來(lái)。
  • 組件復(fù)用:當(dāng)你切換到一個(gè)已經(jīng)被緩存的組件時(shí),keep-alive會(huì)從緩存中提取該組件的實(shí)例,而不是重新創(chuàng)建。
  • 生命周期管理:為了處理組件的激活和停用,keep-alive引入了activated和deactivated鉤子,在組件進(jìn)入或離開緩存時(shí)觸發(fā)。

keep-alive的源碼解析

以下時(shí)抽取的部分原理代碼:

export default {
  name: 'KeepAlive',
  abstract: true, // 這是一個(gè)抽象組件,表示它不會(huì)直接渲染到 DOM 上
  props: {
    include: patternTypes, // 要緩存的組件
    exclude: patternTypes, // 不緩存的組件
    max: [String, Number] // 最大緩存數(shù)
  },
  created () {
    this.cache = Object.create(null); // 緩存對(duì)象
    this.keys = []; // 用來(lái)記錄緩存的順序
  },
  destroyed () {
    for (const key in this.cache) {
      pruneCacheEntry(this.cache, key, this.keys);
    }
  },
  watch: {
    include (val) {
      pruneCache(this, name => matches(val, name));
    },
    exclude (val) {
      pruneCache(this, name => !matches(val, name));
    }
  },
  render () {
    const slot = this.$slots.default;
    const vnode = getFirstComponentChild(slot); // 獲取第一個(gè)子組件
    if (vnode) {
      const componentOptions = vnode.componentOptions;
      const name = getComponentName(componentOptions);
      if (name && (
        (this.include && !matches(this.include, name)) ||
        (this.exclude && matches(this.exclude, name))
      )) {
        return vnode; // 如果不匹配 include/exclude,直接返回,不緩存
      }
      const key = vnode.key == null
        ? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
        : vnode.key;
      if (this.cache[key]) {
        vnode.componentInstance = this.cache[key].componentInstance; // 從緩存中取出實(shí)例
        remove(this.keys, key); // 移除舊的位置
        this.keys.push(key); // 重新放到最后,更新 LRU 位置
      } else {
        this.cache[key] = vnode; // 緩存新實(shí)例
        this.keys.push(key);
        // 如果超過(guò)最大緩存數(shù),移除最早的實(shí)例
        if (this.max && this.keys.length > parseInt(this.max)) {
          pruneCacheEntry(this.cache, this.keys[0], this.keys, this._vnode);
        }
      }
      vnode.data.keepAlive = true; // 標(biāo)記組件為 keep-alive
    }
    return vnode || (slot && slot[0]); // 返回 vnode
  }
};

 1.緩存機(jī)制

this.cache 是一個(gè)對(duì)象,用于存儲(chǔ)已經(jīng)緩存的組件實(shí)例

this.keys 是一個(gè)數(shù)組,用來(lái)記錄緩存組件的順序

2.組件的緩存和激活

在render函數(shù)中,Vue判斷當(dāng)前組件是否在inclue和exclude的范圍內(nèi)。如果匹配不到,則不進(jìn)行緩存。

通過(guò)key標(biāo)識(shí)組件,并將其與緩存實(shí)例關(guān)聯(lián)。如果組件已經(jīng)在緩存中,直接取出緩存的組件實(shí)例并復(fù)用。

3.LRU緩存策略

LRU緩存策略維持了一個(gè)有序的數(shù)據(jù)結(jié)構(gòu),記錄了緩存項(xiàng)的使用順序。當(dāng)緩存達(dá)到容量限制時(shí),它會(huì)移除最近最少使用的項(xiàng),以便為新的數(shù)據(jù)騰出空間,常見的實(shí)現(xiàn)方式包括使用雙向鏈表和哈希表的組合,來(lái)保持緩存項(xiàng)的順序和快速訪問(wèn)。

當(dāng)this.keys的長(zhǎng)度超過(guò)max時(shí),刪除最早的緩存組件(即this.keys[0])

4.生命周期的管理

activated和deactivated生命周期鉤子與keep-alive緊密相關(guān),它們?cè)诮M件被從緩存中激活和停用時(shí)觸發(fā)。activated和deactivated鉤子用于管理組件的激活和停用。

到此這篇關(guān)于vue中的keep-alive用法指南的文章就介紹到這了,更多相關(guān)vue keep-alive內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue列表如何實(shí)現(xiàn)滾動(dòng)到指定位置樣式改變效果

    Vue列表如何實(shí)現(xiàn)滾動(dòng)到指定位置樣式改變效果

    這篇文章主要介紹了Vue列表實(shí)現(xiàn)滾動(dòng)到指定位置樣式改變效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • vue實(shí)現(xiàn)上傳圖片添加水印(升級(jí)版)

    vue實(shí)現(xiàn)上傳圖片添加水印(升級(jí)版)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)上傳圖片添加水印的升級(jí)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Vue3監(jiān)聽store中數(shù)據(jù)變化的三種方式

    Vue3監(jiān)聽store中數(shù)據(jù)變化的三種方式

    這篇文章給大家介紹了Vue3監(jiān)聽store中數(shù)據(jù)變化的三種方法,使用watch和storeToRefs函數(shù),使用計(jì)算屬性computed和使用watchEffect函數(shù)這三種方法,文中通過(guò)代碼講解非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • element-ui中table表格的折疊和隱藏方式

    element-ui中table表格的折疊和隱藏方式

    這篇文章主要介紹了element-ui中table表格的折疊和隱藏方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue-router如何實(shí)現(xiàn)路由懶加載

    Vue-router如何實(shí)現(xiàn)路由懶加載

    在現(xiàn)代前端開發(fā)中,Vue.js憑借其輕量級(jí)和易用性,成為了很多開發(fā)者的首選框架,本文將結(jié)合實(shí)際案例,詳細(xì)講解Vue-Router路由懶加載的用法,需要的可以參考下
    2024-11-11
  • 在vue中添加Echarts圖表的基本使用教程

    在vue中添加Echarts圖表的基本使用教程

    雖然老早就看過(guò)很多echarts的例子, 但自己接觸的項(xiàng)目中一直都沒(méi)有真正用到過(guò),直到最近才開始真正使用,下面這篇文章主要給大家介紹了關(guān)于在vue中添加Echarts圖表的基本使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-11-11
  • vue3的setup語(yǔ)法如何自定義v-model為公用hooks

    vue3的setup語(yǔ)法如何自定義v-model為公用hooks

    這篇文章主要介紹了vue3的setup語(yǔ)法如何自定義v-model為公用hooks,文章分為兩個(gè)部分介紹,簡(jiǎn)單介紹vue3的setup語(yǔ)法如何自定義v-model和如何提取v-model語(yǔ)法作為一個(gè)公用hooks
    2022-07-07
  • Vue3中h函數(shù)超詳細(xì)教程(附示例與應(yīng)用場(chǎng)景)

    Vue3中h函數(shù)超詳細(xì)教程(附示例與應(yīng)用場(chǎng)景)

    這篇文章主要給大家介紹了關(guān)于Vue3中h函數(shù)的相關(guān)資料,h函數(shù)是Vue3中用來(lái)創(chuàng)建虛擬節(jié)點(diǎn)(VNode)的工具,它的本質(zhì)是createVNode方法的簡(jiǎn)寫,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-07-07
  • Vue項(xiàng)目安裝插件并保存

    Vue項(xiàng)目安裝插件并保存

    今天小編就為大家分享一篇關(guān)于Vue項(xiàng)目安裝插件并保存,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • vue同一瀏覽器登錄多賬號(hào)處理方案

    vue同一瀏覽器登錄多賬號(hào)處理方案

    項(xiàng)目在線上會(huì)遇到管理員類似權(quán)限比較大的用戶,會(huì)在同一瀏覽器登陸多個(gè)賬號(hào),遇到這樣的問(wèn)題如何處理呢,下面小編給大家介紹vue同一瀏覽器登錄多賬號(hào)處理方法,感興趣的朋友一起看看吧
    2024-01-01

最新評(píng)論

宁都县| 祥云县| 嘉义县| 定陶县| 广饶县| 静乐县| 延安市| 中超| 文昌市| 临澧县| 怀来县| 石台县| 开江县| 宜君县| 唐山市| 蒙山县| 积石山| 连南| 益阳市| 双峰县| 上饶县| 水城县| 塔河县| 益阳市| 忻城县| 乌拉特后旗| 陵水| 木兰县| 汽车| 仁怀市| 攀枝花市| 绵竹市| 桐庐县| 洱源县| 攀枝花市| 偏关县| 张北县| 新丰县| 文安县| 黑龙江省| 海林市|