精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue.js設計與實現18-KeepAlive的原理與實現

開發 前端
本文簡單介紹了Vue.js中KeepAlive組件的設計與實現原理,可以實現對組件的緩存,避免組件實例不斷地銷毀和重建。

1.寫在前面

前面文章介紹了Vue.js通過渲染器實現組件化的能力,介紹了有狀態組件和無狀態組件的構造與實現,還有異步組件對于框架的意義。本文將主要介紹Vue.js的重要內置組件和模塊--KeepAlive組件。

2.KeepAlive組件

KeepAlive字面意思理解就是保持鮮活,就是建立持久連接的意思,可以避免組件或連接頻繁地創建和銷毀。

<template>
<KeepAlive>
<Tab v-if="currentTab === 1"/>
<Tab v-if="currentTab === 2"/>
<Tab v-if="currentTab === 3"/>
</KeepAlive>
</template>

在上面代碼中,會根據currentTab變量的值頻繁切換Tab組件,會導致不停地卸載和重建對應的Tab組件,為了避免因此產生的性能開銷,可以使用KeepAlive組件保持組件的鮮活。那么KeepAlive組件是如何保持組件的鮮活的,其實就會對組件進行緩存管理,避免組件頻繁的卸載和重建。

其實,就是通過一個隱藏的組件緩存容器,將組件需要的時候將其放到容器里,在需要重建使用的時候將其取出,這樣對于用戶感知是進行了“卸載”和“重建”組件。在組件搬運到緩存容器和搬出,就是對應組件的生命周期activated和deactivated。

3.組件的失活和激活

那么,應該如何實現組件的緩存管理呢?

const KeepAlive = {
// keepAlive組件的標識符
_isKeepAlive:true,
setup(props,{slots}){
//緩存容器
const cache = new Map();
const instance = currentInstance;
const { move, createElement } = instance.keepAliveCtx;

//隱藏容器
const storageContainer = createElement("div");

instance._deActivate = (vnode)=>{
move(vnode, storageContainer)
};

instance._activate = (vnode, container, anchor)=>{
move(vnode, container, anchor)
};

return ()=>{
let rawNode = slots.default();
// 非組件的虛擬節點無法被keepAlive
if(typeof rawNode.type !== "object"){
return rawNode;
}

//在掛在時先獲取緩存的組件vnode
const cacheVNode = cache.get(rawNode.type);
if(cacheVNode){
rawVNode.component = cacheVNode.component;
rawVNode.keptAlive = true;
}else{
cache.set(rawVNode.type, rawVNode);
}

rawVNode.shouldKeepAlive = true;
rawVNode.keepAliveInstance = instance;

// 渲染組件vnode
return rawVNode
}
}
}

在上面代碼中,KeepAlive組件本身不會渲染額外的內容,渲染函數只返回被KeepAlive的組件,被稱為“內部組件”,KeepAlive會在“內部組件”的Vnode對象上添加標記屬性,便于渲染器執行特定邏輯。

  • shouldKeepAlive屬性會被添加到“內部組件”的vnode對象上,當渲染器卸載“內部組件”時,可以通過檢查屬性得知“內部組件”是否需要被KeepAlive。
  • keepAliveInstance:內部組件的vnode對象會持有keepAlive組件實例,在unmount函數中通過keepAliveInstance訪問_deactivate函數。
  • keptAlive:內部組件已被緩存則添加keptAlive標記,判斷內部組件重新渲染時是否需要重新掛載還是激活。
function unmount(vnode){
if(vnode.type === Fragment){
vnode.children.forEach(comp=>unmount(comp));
return;
}else if(typeof vnode.type === "object"){
if(vnode.shouldKeepAlive){
vnode.keepAliveInstance._deactivate(vnode);
}else{
unmount(vnode.component.subTree);
}
return
}
const parent = vnode.el.parentVNode;
if(parent){
parent.removeChild(vnode.el);
}
}

組件失活的本質是將組件所渲染的內容移動到隱藏容器中,激活的本質是將組件所要渲染的內容從隱藏容器中搬運回原來的容器。

const { move, createElement } = instance.keepAliveCtx;

instance._deActivate = (vnode)=>{
move(vnode, storageContainer);
}

instance._activate = (vnode, container, anchor)=>{
move(vnode, container, anchor);
}

4.include和exclude

我們看到上面的代碼會對組件所有的"內部組件"進行緩存,但是使用者又想自定義緩存規則,只對特定組件進行緩存,對此KeepAlive組件需要支持兩個props:include和exclude。

  • include:用于顯式配置應被緩存的組件
  • exclude:用于顯式配置不應該被緩存的組件
const cache = new Map();
const keepAlive = {
__isKeepAlive: true,
props:{
include: RegExp,
exclude: RegExp
},
setup(props, {slots}){
//...
return ()=>{
let rawVNode = slots.default();
if(typeof rawVNode.type !== "object"){
return rawVNode;
}
const name = rawVNode.type.name;
if(name && (
(props.include && !props.include.test(name)) ||
(props.exclude && props.include.test(name))
)){
//直接渲染內部組件,不對其進行緩存操作
return rawVNode
}
}
}
}

上面代碼中,為了簡便闡述問題進行設置正則類型的值,在KeepAlive組件被掛載時,會根據"內部組件"的名稱進行匹配,根據匹配結果判斷是否要對組件進行緩存。

5.緩存管理

在前面小節中使用Map對象實現對組件的緩存,Map的鍵值對分別對應的是組件vnode.type屬性值和描述該組件的vnode對象。因為用于描述組件的vnode對象存在對組件實例的引用,對此緩存用于描述組件的vnode對象,等價于緩存了組件實例。

前面介紹的keepAlive組件實現緩存的處理邏輯是:

  • 緩存存在時繼承組件實例,將描述組件的vnode對象標記為keptAlive,渲染器不會重新創建新的組件實例
  • 緩存不存在時,則設置緩存

但是,如果緩存不存在時,那么總是會設置新的緩存,這樣導致緩存不斷增加,會占用大量內存。對此,我們需要設置個內存閾值,在緩存數量超過指定閾值時需要對緩存進行修剪,在Vue.js中使用的是"最新一次訪問"策略。

"最新一次訪問"策略本質上就是通過設置當前訪問或渲染的組件作為最新一次渲染的組件,并且該組件在修剪過程中始終是安全的,即不會被修剪。

緩存實例中需要滿足固定的格式:

const _cache = new Map();
const cache: KeepAliveCache = {
get(key){
_cache.get(key);
},
set(key, value){
_cache.set(key, value);
},
delete(key){
_cache.delete(key);
},
forEach(fn){
_cache.forEach(fn);
}
}

6.寫在最后

本文簡單介紹了Vue.js中KeepAlive組件的設計與實現原理,可以實現對組件的緩存,避免組件實例不斷地銷毀和重建。KeepAlive組件卸載時渲染器并不會真實地把它進行卸載,而是將該組件搬運到另外一個隱藏容器里,從而使得組件能夠維持當前狀態。在KeepAlive組件掛載時,渲染器將其從隱藏容器中搬運到原容器中。此外,我們還討論了KeepAlive組件的include和exclude自定義緩存,以及緩存管理。

責任編輯:武曉燕 來源: 前端一碼平川
相關推薦

2022-04-25 07:36:21

組件數據函數

2022-04-12 08:08:57

watch函數options封裝

2022-04-14 09:35:03

Vue.js設計Reflect

2022-04-01 08:08:27

Vue.js框架命令式

2022-04-04 16:53:56

Vue.js設計框架

2022-04-11 08:03:30

Vue.jscomputed計算屬性

2022-04-26 05:55:06

Vue.js異步組件

2022-04-18 08:09:44

渲染器DOM掛載Vue.js

2022-04-03 15:44:55

Vue.js框架設計設計與實現

2022-04-05 16:44:59

系統Vue.js響應式

2022-04-17 09:18:11

響應式數據Vue.js

2022-04-09 17:53:56

Vue.js分支切換嵌套的effect

2022-04-16 13:59:34

Vue.jsJavascript

2022-04-19 23:01:54

Vue.jsDOM節點DOM樹

2022-04-20 09:07:04

Vue.js的事件處理

2019-04-01 19:38:28

Vue.jsJavascript前端

2024-05-17 09:51:11

2017-08-30 17:10:43

前端JavascriptVue.js

2021-01-22 11:47:27

Vue.js響應式代碼

2020-11-30 06:18:21

React
點贊
收藏

51CTO技術棧公眾號

无码人妻久久一区二区三区| 国产艳俗歌舞表演hd| 大片免费在线观看| 成人av网站在线观看| 欧日韩在线观看| 国产大屁股喷水视频在线观看| 欧美专区视频| 日本韩国一区二区三区| av日韩在线看| 国产人成在线视频| 国产成人精品免费| 国产成人久久久| 久久老司机精品视频| 视频国产一区| 精品人伦一区二区色婷婷| 九色porny91| 超碰在线网站| 一区在线观看免费| 欧美日韩在线一区二区三区| 国产av一区二区三区| 久久亚洲电影| 高清亚洲成在人网站天堂| 天美传媒免费在线观看| 日韩美女精品| 欧美mv日韩mv国产网站| xxx国产在线观看| 色是在线视频| 亚洲一区二区三区自拍| 亚洲一区二三| 国产69精品久久app免费版| 成人av中文字幕| 91日韩久久| 国产精品久久婷婷| 免费成人你懂的| 热re99久久精品国产66热| 日本少妇在线观看| 国产精品国码视频| 欧美乱妇40p| 午夜精品一区二区三区视频| 成人在线免费观看视频| 亚洲一级黄色片| 丰满圆润老女人hd| 欧美亚洲色图校园春色| 亚洲成人黄色网| 欧美双性人妖o0| 国产伦精品一区二区三区免费优势| 欧美精三区欧美精三区| 在线观看高清免费视频| 99九九久久| 欧美在线免费播放| 韩国一区二区av| 欧美片第一页| 色噜噜狠狠色综合欧洲selulu| 女性女同性aⅴ免费观女性恋| 俺来俺也去www色在线观看| 一区二区三区欧美| 特级西西444| 色呦呦在线视频| 亚洲一区影音先锋| 奇米精品一区二区三区| 亚洲优女在线| 在线观看不卡一区| 日本黄大片一区二区三区| 色999韩欧美国产综合俺来也| 精品视频1区2区| 日日干日日操日日射| 精品国产伦一区二区三区观看说明 | 一本不卡影院| 2019中文字幕免费视频| 欧美brazzers| 久久se精品一区二区| 亚洲va欧美va在线观看| 成人爽a毛片一区二区| 99在线热播精品免费| 快播亚洲色图| 日韩专区在线| 亚洲永久免费视频| 成人三级视频在线播放 | 欧洲av在线精品| 少妇一级淫免费播放| 国产精品美女久久久久| 亚洲成人三级在线| 国产av自拍一区| 香蕉视频官网在线观看日本一区二区| 欧美老女人性生活| 国产精品人人人人| 久久精品国产免费| 国产超碰91| 国内三级在线观看| 亚洲品质自拍视频| 免费国产a级片| 四虎精品在线观看| 亚洲激情视频在线| 美女网站视频色| 亚洲国产专区| 国产噜噜噜噜噜久久久久久久久| 亚洲福利在线观看视频| 久久久久久久免费视频了| 四虎永久免费网站| 亚洲少妇视频| 日韩精品在线一区二区| 中文字幕一区二区人妻在线不卡| 欧美va久久久噜噜噜久久| 97国产在线观看| 一区二区三区精| 91亚洲资源网| 菠萝蜜视频在线观看入口| 国产韩日精品| 亚洲第一视频在线观看| 91香蕉视频网| 久久久久久久高潮| 成人羞羞视频免费| 888av在线| 疯狂做受xxxx欧美肥白少妇| 久久精品无码一区二区三区毛片| 精品中文一区| 久久久久五月天| 国产日本精品视频| 久久精品人人爽人人爽| 日本熟妇人妻xxxx| 久久伊人精品| 自拍视频国产精品| 黄色网址中文字幕| 91女厕偷拍女厕偷拍高清| 大荫蒂性生交片| 久久久久久爱| 久久国产精品久久久| 中文字幕+乱码+中文乱码www| av激情综合网| 国产妇女馒头高清泬20p多| www.成人在线.com| 中文字幕亚洲欧美日韩在线不卡 | 韩国女同性做爰三级| 亚洲伦伦在线| 国产无套精品一区二区| 日本无删减在线| 欧美一级欧美一级在线播放| 在线观看天堂av| 日本中文一区二区三区| 日本成人黄色免费看| xx欧美视频| 亚洲精品视频在线播放| 国产精品第9页| 成+人+亚洲+综合天堂| 免费特级黄色片| 国产精品美女在线观看直播| 欧美激情一区二区三区久久久| www香蕉视频| 一区二区三区免费| 久久久久亚洲AV成人网人人小说| 欧美三级视频| 国产另类自拍| 欧美a级在线观看| 日韩成人中文字幕在线观看| 毛片毛片女人毛片毛片| 91片在线免费观看| 久久精品影视大全| 91日韩免费| 91情侣在线视频| av白虎一区| 日韩国产在线看| 性色av免费观看| 日本一区二区三区四区| gai在线观看免费高清| 中文在线日韩| 国产在线精品一区二区三区》| 樱花草涩涩www在线播放| 亚洲欧美日韩国产中文专区| 国产精品露脸视频| 亚洲蜜臀av乱码久久精品| 成人一区二区三区仙踪林| 亚洲大胆在线| 欧美1o一11sex性hdhd| 久久99久久久精品欧美| 欧美日本亚洲视频| 亚洲aⅴ乱码精品成人区| 色8久久人人97超碰香蕉987| 国产天堂av在线| 99久久99久久久精品齐齐| 日韩亚洲在线视频| 亚洲理论电影网| 久久99欧美| 日韩国产大片| 97国产精品视频人人做人人爱| 国产亚洲依依| 欧美成人福利视频| 国产91精品看黄网站在线观看| 国产精品久久久久久亚洲毛片| 欧美日韩一区二区区| 午夜一区不卡| 欧美日韩亚洲国产成人| 亚洲精品无吗| 亚洲jizzjizz日本少妇| 亚洲一级少妇| 欧美日韩高清在线观看| 国产免费永久在线观看| 欧美tk—视频vk| 中文字幕无码乱码人妻日韩精品| 亚洲午夜在线视频| 中文字幕免费在线看线人动作大片| 激情另类小说区图片区视频区| 青娱乐自拍偷拍| 久久久久久久久久久妇女| 久久亚洲高清| 视频亚洲一区二区| 国产精品视频不卡| 九色porny自拍视频在线观看| 日韩最新免费不卡| 瑟瑟在线观看| 亚洲国产精品电影| 国产特黄一级片| 欧美在线三级电影| 亚洲日本视频在线观看| 亚洲午夜精品网| 性色av无码久久一区二区三区| 久久久激情视频| 2一3sex性hd| 国产福利精品一区二区| 在线观看免费不卡av| 日韩精品欧美精品| 日韩国产欧美亚洲| 在线精品福利| 波多野结衣与黑人| 91精品亚洲| 亚洲欧洲精品在线观看| 国产成人ay| 蜜桃av噜噜一区二区三区| 极品束缚调教一区二区网站 | 精品国产av 无码一区二区三区| 在线日韩av片| 蜜臀精品一区二区三区| 欧美日韩免费在线| 国产精品成人aaaa在线| 樱花草国产18久久久久| tube国产麻豆| 亚洲私人黄色宅男| 三上悠亚作品在线观看| 国产精品美女久久久久久| 亚洲av熟女国产一区二区性色| 91色.com| wwwwxxxx国产| 久久综合狠狠综合久久综合88| 麻豆国产精品一区| 91色婷婷久久久久合中文| 五月婷婷综合在线观看| 91网上在线视频| 国精品无码人妻一区二区三区| 91蜜桃视频在线| 免费在线观看成年人视频| 久久综合九色欧美综合狠狠| 久久中文字幕人妻| 久久精品人人做人人综合| аⅴ天堂中文在线网| 国产精品久久久久aaaa| 波兰性xxxxx极品hd| 亚洲老司机在线| 成人免费看片98| 欧美日韩中文在线| 五月婷婷六月婷婷| 欧美日韩精品一二三区| 精品国产av一区二区三区| 日韩视频一区二区| 天天操天天操天天操| 日韩麻豆第一页| 岛国在线视频| 欧美成人午夜激情视频| 爱啪啪综合导航| 国产高清视频一区三区| 日本亚洲欧洲无免费码在线| 91久久大香伊蕉在人线| 精品国产午夜肉伦伦影院| 日本一区二区精品| 欧美va久久久噜噜噜久久| 黄色激情在线视频| 手机精品视频在线观看| 拔插拔插华人永久免费| 成人动漫av在线| 人人爽人人爽人人片| 亚洲精选在线视频| av黄色在线播放| 欧美电影一区二区| 亚洲AV成人无码一二三区在线 | 亚洲制服国产| 欧美又大又硬又粗bbbbb| 久久人体av| 国产欧美一区二区视频| 日韩午夜电影网| 欧美午夜小视频| 老汉av免费一区二区三区| 国产吃瓜黑料一区二区| 国产拍欧美日韩视频二区| 国产一二三四区| 色狠狠色狠狠综合| 性生活视频软件| 综合欧美国产视频二区| 白白色在线观看| 成人写真福利网| 蜜桃国内精品久久久久软件9| 中文字幕av日韩精品| 国产精品试看| 美女流白浆视频| 国产精品久久久久婷婷| 在线观看亚洲欧美| 日韩午夜三级在线| 香港伦理在线| 清纯唯美日韩制服另类| 国产成人夜色高潮福利影视| 亚洲韩国在线| 久久久精品五月天| 国产精品一区二区人妻喷水| 亚洲免费av网站| 亚洲一区二区影视| 亚洲天堂av电影| 国产高清中文字幕在线| 91中文字精品一区二区| 91麻豆国产自产在线观看亚洲| 动漫av网站免费观看| 丁香亚洲综合激情啪啪综合| 精品国产大片大片大片| 91久久国产最好的精华液| 头脑特工队2在线播放| 美女少妇精品视频| 一区二区三区| 亚洲精品中字| 美女网站色91| avhd101老司机| 91久久线看在观草草青青| 天堂网www中文在线| 久久青草精品视频免费观看| 国产精品色婷婷在线观看| 中文精品一区二区三区| 麻豆精品在线观看| 亚洲国产天堂av| 色狠狠一区二区三区香蕉| 青青青草原在线| 日韩暖暖在线视频| 蜜桃一区二区三区| 欧美色图另类小说| 久久久久久免费网| 国产污视频网站| 国产丝袜一区二区三区| 国产欧美一区二区三区精品酒店| 激情久久av| 亚洲欧美清纯在线制服| 免费观看av网站| 在线观看中文字幕不卡| 成人午夜电影在线观看| 日韩av电影手机在线| 精品国产中文字幕第一页| 亚洲中文字幕久久精品无码喷水| 国产亚洲一区二区三区| 真实的国产乱xxxx在线91| 在线视频亚洲欧美| 亚洲精品三区| 妺妺窝人体色www看人体| jlzzjlzz国产精品久久| 日本一级一片免费视频| 亚洲欧美另类人妖| 8av国产精品爽爽ⅴa在线观看| 一区二区三区四区免费视频| 国精产品一区一区三区mba桃花| 国产乱国产乱老熟300| 亚洲电影免费观看高清完整版在线观看| av影院在线| 欧洲亚洲一区| 久久99精品久久久久久| 青青草精品在线视频| 亚洲国产精品成人av| 吞精囗交69激情欧美| 亚洲国产一区二区三区在线播| 国产一区不卡在线| 特一级黄色大片| 色妞久久福利网| ady日本映画久久精品一区二区| 久久国产亚洲精品无码| 欧美国产日本韩| 午夜老司机福利| 国产91久久婷婷一区二区| 欧美 日韩 国产精品免费观看| 五十路六十路七十路熟婆| 欧美在线不卡一区| 操喷在线视频| 天堂精品视频| 成人免费观看视频| 欧美国产一级片| 欧美福利视频网站| 青青草国产成人a∨下载安卓| 在线观看一区二区三区视频| 一本色道久久综合精品竹菊| 欧美极品视频| 久久综合福利| 国产成人在线视频网址| 欧美三级网站在线观看| 欧美激情在线观看视频| 日本a级不卡| 国产美女视频免费观看下载软件| 欧美日韩国产美| 精品91久久| 国产精品久久..4399| 国产精品国产三级国产普通话蜜臀|