国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue2 - keep-alive 作用和原理

這篇具有很好參考價(jià)值的文章主要介紹了Vue2 - keep-alive 作用和原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1,介紹和作用

<!-- 非活躍的組件將會被緩存! -->
<keep-alive>
  <component :is="activeComponent" />
</keep-alive>

1,是一個內(nèi)部組件,用于緩存組件實(shí)例。在組件切換時(shí),不用重新創(chuàng)建而是使用緩存中的組件實(shí)例。

  • 可以避免創(chuàng)建組件的開銷。
  • 可以保留組件狀態(tài)。

2,有3個屬性:

  • includeexclude 屬性,可以控制哪些組件進(jìn)入緩存。
  • max 屬性可以設(shè)置最大緩存數(shù),當(dāng)緩存的實(shí)例超過該數(shù)時(shí),vue會移除最久沒有使用的組件緩存。
<!-- 以英文逗號分隔的字符串 -->
<keep-alive include="Comp1,Comp2">
  <component :is="view" />
</keep-alive>
<!-- 數(shù)組 -->
<keep-alive :include="['Comp1', 'Comp2']">
  <component :is="view" />
</keep-alive>

3,受 keep-alive 影響,內(nèi)部所有嵌套的組件都有2個生命周期函數(shù)。activateddeactivated。第1次 activated 是在 mounted 之后。

4,當(dāng)嵌套組件是 <router-view> 時(shí),緩存的是路由對應(yīng)的組件。

因?yàn)?<router-view> 是函數(shù)式組件,只有一個目的,生成虛擬DOM。它沒有狀態(tài),不生成實(shí)例。有穿透的效果。

<keep-alive>
  <router-view></router-view>
</keep-alive>

2,原理

源碼

keep-alive 在內(nèi)部維護(hù)了一個緩存對象和 keys 數(shù)組:

// keep-alive 組件的生命周期函數(shù)
created () {
  this.cache = Object.create(null)
  this.keys = []
}
  • keys 數(shù)組記錄當(dāng)前緩存組件的 key,如果組件沒有指定,則會自動為組件生成唯一的 key。

  • cache 對象以 key 為鍵,vnode 為值,來緩存組件對應(yīng)的虛擬 DOM。

keep-alive 組件的 render 函數(shù)中,大致邏輯:

判斷當(dāng)前渲染的 vnode 是否有對應(yīng)的緩存,有則從緩存中讀取對應(yīng)組件實(shí)例,沒有則將其緩存。當(dāng)緩存數(shù)量 > max 時(shí),會移除掉 keys 數(shù)組的第1個元素。

// 更新邏輯其實(shí)在 update 函數(shù)中,這里結(jié)合在一起容易理解。
render(){
  const slot = this.$slots.default; // 獲取默認(rèn)插槽
  const vnode = getFirstComponentChild(slot); // 得到插槽中的第一個組件的 vnode
  const name = getComponentName(vnode.componentOptions); // 獲取組件名字
  const { cache, keys } = this; // 獲取當(dāng)前的緩存對象和key數(shù)組
  const key = ...; // 獲取組件的key值,若沒有,會按照規(guī)則自動生成
  if (cache[key]) {
    // 有緩存
    // 關(guān)鍵:重用組件實(shí)例
    vnode.componentInstance = cache[key].componentInstance
    remove(keys, key); // 刪除key
    // 將 key加入到數(shù)組末尾,這樣是為了保證最近使用的組件在數(shù)組中靠后,反之靠前
    keys.push(key); 
  } else {
    // 無緩存,則進(jìn)行緩存
    cache[key] = vnode
    keys.push(key)
    if (this.max && keys.length > parseInt(this.max)) {
      // 超過最大緩存數(shù)量,移除第一個key對應(yīng)的緩存
      pruneCacheEntry(cache, keys[0], keys, this._vnode)
    }
  }
  return vnode || (slot && slot[0])
}

注意到,render() 返回的就是插槽中的第一個組件的 vnode。所以頁面上顯示的也就是這個子組件。

3,使用場景

在后臺管理系統(tǒng)中比較常見,比如有2種情況就會用到:

  • 側(cè)邊欄的菜單,一般對應(yīng)的是路由。切換頁面(路由)時(shí)想保留之前的頁面信息。
  • 列表頁進(jìn)詳情頁時(shí),想保留列表頁信息,因?yàn)榱斜砜赡苁峭ㄟ^輸入框等多個過濾條件得到的,如果從詳情頁返回列表頁再次操作會比較繁瑣。

這2種情況,都可以做成 tab 選項(xiàng)卡。

3.1,效果展示

Vue2 - keep-alive 作用和原理,vue2,前端,vue.js,keep-alive

3.2,實(shí)現(xiàn)思路

首先維護(hù)一個【tab選項(xiàng)卡】的狀態(tài),比如放到 Vuex 中。不放到組件內(nèi)部,是因?yàn)椴缓檬褂?,因?yàn)榭赡懿恢箓?cè)邊欄會添加 tab,其他地方可能也會添加頁面到 tab 選項(xiàng)卡。

export default new Vuex.Store({
  modules: {
    tabs: {
      namespaced: true,
      state: {
        pageNames: [] // 選項(xiàng)卡的頁面
      },
      mutations: {
        addPage(state, newPageName) {
          if (!state.pageNames.includes(newPageName)) {
            state.pageNames.push(newPageName)
          }
        },
        removePage(state, pageName) {
          const index = state.pageNames.indexOf(pageName)
          if (index >= 0) {
            state.pageNames.splice(index, 1)
          }
        }
      }
    }
  }
})

其他的看代碼就一目了然了:(省略了CSS)

<template>
  <div>
    <!-- 固定在頁面左側(cè) -->
    <div>
      <h1>側(cè)邊欄</h1>
      <ul>
        <router-link
          v-for="item in $router.options.routes"
          :key="item.path"
          tag="li"
          :to="{ name: item.name }"
          active-class="blue"
        >
          <span>{{ item.name }}</span>
          <button @click="handleAddPage(item.name)">+</button>
        </router-link>
      </ul>
    </div>
    
    <!-- 頁面內(nèi)容區(qū)域 -->
    <div>
      <!-- 固定在頁面頂部,左側(cè)和側(cè)邊欄對齊 -->
      <div v-if="$store.state.tabs.pageNames.length">
        <span>tab選項(xiàng)卡:</span>
        <ul>
          <router-link
            v-for="pageName in $store.state.tabs.pageNames"
            :key="pageName"
            tag="li"
            active-class="green"
            :to="{ name: pageName }"
          >
            <span>{{ pageName }}</span>
            <button @click="handleRemovePage(pageName)">x</button>
          </router-link>
        </ul>
      </div>
      <!-- 頁面內(nèi)容展示區(qū)域 -->
      <keep-alive :include="$store.state.tabs.pageNames">
        <router-view></router-view>
      </keep-alive>
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleAddPage(pageName) {
      this.$store.commit('tabs/addPage', pageName)
    },
    handleRemovePage(pageName) {
      this.$store.commit('tabs/removePage', pageName)
    }
  }
}
</script>

以上。文章來源地址http://www.zghlxwxcb.cn/news/detail-823789.html

到了這里,關(guān)于Vue2 - keep-alive 作用和原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3.0中的keep-alive

    vue3.0中的keep-alive

    keep-alive是vue中的一個內(nèi)置組件,通常用它來包裹一個動態(tài)組件,keep-alive 包裹動態(tài)組件時(shí),會緩存不活動的組件實(shí)例,而不是銷毀它們。 它有兩個特殊的生命周期鉤子 activated 和 deactivated ,在vue3.0里面生命周期函數(shù)前面都要加上on, onActivated , onDeactivated 。當(dāng)組件在使用了kee

    2023年04月08日
    瀏覽(20)
  • vue keep-alive 中的生命周期

    keep-alive 是 Vue 提供的一個內(nèi)置組件,用來對組件進(jìn)行緩存——在組件切換過程中將狀態(tài)保留在內(nèi)存中,防止重復(fù)渲染DOM。 如果為一個組件包裹了 keep-alive,那么它會多出兩個生命周期:deactivated、activated。同時(shí),beforeDestroy 和 destroyed 就不會再被觸發(fā)了,因?yàn)榻M件 不會被真正

    2024年02月12日
    瀏覽(23)
  • 【Vue3】keep-alive 緩存組件

    【Vue3】keep-alive 緩存組件

    當(dāng)在 Vue.js 中使用 keep-alive 組件時(shí),它將會緩存動態(tài)組件,而不是每次渲染都銷毀和重新創(chuàng)建它們。這對于需要在組件間快速切換并且保持組件狀態(tài)的情況非常有用。 keep-alive 只能包含(或者說只能渲染)一個子組件,如果需要包含多個子組件,需要用 v-if 選擇某個確定的組

    2024年02月13日
    瀏覽(19)
  • Vue中的keep-alive緩存組件的理解

    keep-alive 是一個抽象組件,用于將其內(nèi)部的組件保留在內(nèi)存中,而不會重新渲染。這意味著當(dāng)組件在keep-alive 內(nèi)部切換時(shí),其狀態(tài)將被 保留 ,而不是被銷毀和重新創(chuàng)建。 ?????????keep-alive用來緩存不經(jīng)常變化的組件,以提高性能,當(dāng)我們在不同路由之間進(jìn)行切換或者是動

    2024年01月18日
    瀏覽(37)
  • VUE3,自定義控制keep-alive緩存

    安裝插件 npm install vite-plugin-vue-setup-extend?--save 在vite.config.ts中 import VueSetupExtend from \\\'vite-plugin-vue-setup-extend\\\' ..... plugins:[ ? ? ? ? vue(), ????????VueSetupExtend(), ? ? ? ? ..... ] useKeepalive.ts import { ref } from \\\"vue\\\" export const includes = refstring[]([]); // 增加緩存 export function addKeepAliveC

    2024年01月19日
    瀏覽(31)
  • Vue.js 進(jìn)階技巧:keep-alive 緩存組件解析

    Vue.js 進(jìn)階技巧:keep-alive 緩存組件解析

    ?? 前端開發(fā)工程師、技術(shù)日更博主、已過CET6 ?? 阿珊和她的貓_ CSDN 博客專家、23年度博客之星前端領(lǐng)域TOP1 ?? ???高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 ?? 藍(lán)橋云課 簽約作者、上架課程《Vue.js 和 Egg.js 開發(fā)企業(yè)級健康管理項(xiàng)目》、《帶你

    2024年03月11日
    瀏覽(20)
  • keep-alive的作用和應(yīng)用

    keep-alive的作用和應(yīng)用

    keep-alive是Vue提供給我們的一個內(nèi)置組件,會緩存不活動的組件實(shí)例,而不是銷毀它們。作為標(biāo)簽使用包裹這需要緩存的組件。 在組件切換過程中,把切換出的組件保存在內(nèi)存中,防止重新渲染DOM,減少加載時(shí)間及性能消耗,提高用戶體驗(yàn)。避免左慈重復(fù)渲染降低性能 舉個例

    2024年01月19日
    瀏覽(18)
  • Vue路由組件的緩存keep-alive和include屬性

    功能:瀏覽器頁面在進(jìn)行切換時(shí),原有的路由組件會被銷毀。通過緩存可以保存被切換的路由組件。 例子:在頁面上填好的信息當(dāng)進(jìn)行頁面切換再轉(zhuǎn)回原來的頁面時(shí),原本信息被清空了需要重新填寫 功能:切換路由時(shí),保留被切換路由組件。 格式: keep-alive router-view/ keep-

    2024年02月06日
    瀏覽(25)
  • vue keep-alive(1):vue router如何保證頁面回退頁面不刷新

    在構(gòu)建SPA應(yīng)用時(shí),經(jīng)常遇到的場景就是列表頁面 跳轉(zhuǎn)到詳情頁,但是詳情頁面回退到列表頁面,列表頁面有重新刷新了。 如何保證回退的時(shí)候不刷新頁面呢?keep-alive是一個非常好的解決方案(當(dāng)然你也可以以子路由,以絕對定位形勢覆蓋上去*_*)。 keep-alive是Vue的內(nèi)置組件

    2024年02月08日
    瀏覽(21)
  • Vue3 除了 keep-alive,還有哪些實(shí)現(xiàn)頁面緩存的方法

    有這么一個需求:列表頁進(jìn)入詳情頁后,切換回列表頁,需要對列表頁進(jìn)行緩存,如果從首頁進(jìn)入列表頁,就要重新加載列表頁。 對于這個需求,我的第一個想法就是使用keep-alive來緩存列表頁,列表和詳情頁切換時(shí),列表頁會被緩存;從首頁進(jìn)入列表頁時(shí),就重置列表頁數(shù)

    2024年02月06日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包