vue組件 keep-alive

關注我的個人博客:https://pinbolei.cn,獲取更多內容

keep-alive適用于動態(tài)組件中仔涩,當在組件之間切換的時候饲常,你有時會想保持這些組件的狀態(tài),以避免反復重渲染導致的性能問題黍翎。

keep-alive讓組件實例能夠被在它們第一次被創(chuàng)建的時候緩存下來。

注意這個 <keep-alive> 要求被切換到的組件都有自己的名字艳丛,不論是通過組件的 name 選項還是局部/全局注冊匣掸。

Props:

include - 字符串或正則表達式。只有名稱匹配的組件會被緩存氮双。
exclude - 字符串或正則表達式碰酝。任何名稱匹配的組件都不會被緩存。
max - 數(shù)字戴差。最多可以緩存多少組件實例送爸。

用法:

<keep-alive> 包裹動態(tài)組件時,會緩存不活動的組件實例暖释,而不是銷毀它們袭厂。
<keep-alive>是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現(xiàn)在父組件鏈中球匕。
當組件在 <keep-alive> 內被切換纹磺,它的 activateddeactivated 這兩個生命周期鉤子函數(shù)將會被對應執(zhí)行。

示例:

主要用于保留組件狀態(tài)或避免重新渲染。

<!-- 基本 -->
<keep-alive>
  <component :is="view"></component>
</keep-alive>

<!-- 多個條件判斷的子組件 --> 
<keep-alive>
  <comp-a v-if="a > 1"></comp-a>
  <comp-b v-else></comp-b>
</keep-alive>

<!-- `<transition>` 一起使用 -->
<transition>
  <keep-alive>
    <component :is="view"></component>
  </keep-alive>
</transition>

include and exclude

includeexclude屬性允許組件有條件地緩存。二者都可以用逗號分隔字符串片习、正則表達式或一個數(shù)組來表示:

<!-- 逗號分隔字符串 -->
<keep-alive include="a,b">
  <component :is="view"></component>
</keep-alive>

<!-- 正則表達式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 數(shù)組 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
  <component :is="view"></component>
</keep-alive>

具體示例:

一個簡單的tab切換,可以嘗試把<keep-alive>去掉之后,對比一下,然后就會發(fā)現(xiàn)它的好處。

test.vue

<template>
    <div class="test">
        <div class="testNav">
            <div :class="{'selected':tab === 1,'testTitle':true}" @click="toTab(1)">標題一</div>
            <div :class="{'selected':tab === 2,'testTitle':true}"  @click="toTab(2)">標題二</div>
        </div>
        <div class="container">
            <keep-alive>
                <Test1 v-if="tab === 1">
                </Test1>
                <Test2 v-else>
                </Test2>
            </keep-alive>
        </div>
    </div>
</template>

<script>
    import Test1 from './test1.vue';
    import Test2 from './test2.vue';
    export default {
        data() {
            return {
                tab: 1,
            };
        },
        components: {
            Test1,
            Test2,
        },
        methods: {
            toTab(index) {
                this.tab = index;
            },
        },
    }
</script>

<style lang="less">
.test {
    width: 100%;
    .testNav {
        height: 60px;
        line-height: 60px;
        display: flex;
        border-bottom: 1px solid #e5e5e5;
        .testTitle {
            flex: 1;
            text-align: center;
        }
        .selected {
            color: red;
        }
    }
}
</style>

test1.vue

<template>
  <div class="test1">
      test1
      {{testInfo1}}
  </div>
</template>

<script>
    export default {
        data() {
            return {
                testInfo1: '',
            };
        },
        activated() {
            console.log('測試1被激活');
        },
        deactivated() {
            console.log('測試1被緩存');
        },
        created() {
            setTimeout(() => {
                this.testInfo1 = '這是測試一的數(shù)據(jù)';
            }, 2000);
        },
    }
</script>

test2.vue

<template>
  <div>
      test2
      {{testInfo2}}
  </div>
</template>

<script>
    export default {
        data() {
            return {
                testInfo2: '',
            }
        },  
        activated() {
            console.log('測試2被激活');
        },
        deactivated() {
            console.log('測試2被緩存');
        },
        created() {
            setTimeout(() => {
                this.testInfo2 = '這是測試二的數(shù)據(jù)';
            }, 2000);
        },
    }
</script>

運行代碼式矫,打開控制臺,你會更直觀的看到keep-alive的作用役耕,以及activateddeactivated這兩個函數(shù)被觸發(fā)的時間

用setTimeout模擬請求后端接口

1.剛打開頁面:


圖1

2.點擊標題二

圖2

3.再次點擊標題一衷佃,你會發(fā)現(xiàn)信息會快速顯示出來:

圖3

上述示例代碼原引用作者 funnycoderstar,鏈接https://juejin.im/post/5ad56d86518825556534ff4b

以上是添加了keep-alive的情況下蹄葱,如果去掉keep-alive氏义,每次切換tab你會發(fā)現(xiàn)都會重新請求一次數(shù)據(jù)锄列,感興趣的可以嘗試一下。

:匹配首先檢查組件自身的 name 選項惯悠,如果 name 選項不可用邻邮,則匹配它的局部注冊名稱 (父組件 components 選項的鍵值)。匿名組件不能被匹配克婶。

max

最多可以緩存多少組件實例筒严。一旦這個數(shù)字達到了,在新實例被創(chuàng)建之前情萤,已緩存組件中最久沒有被訪問的實例會被銷毀掉鸭蛙。

<keep-alive :max="10">
  <component :is="view"></component>
</keep-alive>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筋岛,隨后出現(xiàn)的幾起案子娶视,更是在濱河造成了極大的恐慌,老刑警劉巖睁宰,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肪获,死亡現(xiàn)場離奇詭異,居然都是意外死亡柒傻,警方通過查閱死者的電腦和手機孝赫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來红符,“玉大人青柄,你說我怎么就攤上這事≡ず睿” “怎么了刹前?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雌桑。 經常有香客問我,道長祖今,這世上最難降的妖魔是什么校坑? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮千诬,結果婚禮上耍目,老公的妹妹穿的比我還像新娘。我一直安慰自己徐绑,他們只是感情好邪驮,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傲茄,像睡著了一般毅访。 火紅的嫁衣襯著肌膚如雪沮榜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天喻粹,我揣著相機與錄音蟆融,去河邊找鬼。 笑死守呜,一個胖子當著我的面吹牛型酥,可吹牛的內容都是我干的。 我是一名探鬼主播查乒,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼弥喉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了玛迄?” 一聲冷哼從身側響起由境,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憔晒,沒想到半個月后藻肄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拒担,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年嘹屯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片从撼。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡州弟,死狀恐怖,靈堂內的尸體忽然破棺而出低零,到底是詐尸還是另有隱情婆翔,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布掏婶,位于F島的核電站啃奴,受9級特大地震影響,放射性物質發(fā)生泄漏雄妥。R本人自食惡果不足惜最蕾,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望老厌。 院中可真熱鬧瘟则,春花似錦、人聲如沸枝秤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丹壕,卻和暖如春庆械,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雀费。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工干奢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盏袄。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓忿峻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辕羽。 傳聞我的和親對象是個殘疾皇子逛尚,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容