精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

色综合影院在线观看| 欧美日韩福利视频| www.com操| 大片免费在线观看| 成人黄页毛片网站| 国产mv久久久| 少妇被躁爽到高潮无码文| 欧美绝顶高潮抽搐喷水合集| 在线观看不卡一区| 少妇大叫太大太粗太爽了a片小说| 日韩中文字幕观看| 激情综合五月天| 欧美激情一区二区三区高清视频 | 黄色一级片在线免费观看| 全球av集中精品导航福利| 欧洲亚洲国产日韩| 久久这里只有精品18| 国产在线91| 成人黄页在线观看| 91久久久久久久久久久| 4438国产精品一区二区| 欧美国产先锋| 在线观看国产精品日韩av| 久久黄色一级视频| 美女色狠狠久久| 一区二区三区不卡视频| 神马影院我不卡| 性感美女一级片| 国产高清精品在线| 国产女人18毛片水18精品| 97人人澡人人爽人人模亚洲 | 一区二区三区无码高清视频| 亚洲美女高潮久久久| 久久久免费人体| 色婷婷久久久久swag精品 | 在线播放日韩导航| 久久精品网站视频| 涩涩网在线视频| 亚洲一区免费视频| 在线视频精品一区| 国产黄在线看| 久久免费视频色| 九色91视频| 天天干天天操av| 粉嫩嫩av羞羞动漫久久久| 成人精品视频久久久久| 中日精品一色哟哟| 玖玖在线精品| 日本老师69xxx| 99久久久久久久久| 午夜亚洲精品| 26uuu亚洲伊人春色| 日本天堂在线视频| 99在线热播精品免费99热| 欧美精品一区在线播放| 久久久久久久久久久久久女过产乱| 成人在线免费观看视频| 日韩精品中文字幕在线观看| 久久久久久久无码| 欧美一性一交| 亚洲美女精品成人在线视频| 亚洲精品理论片| 亚洲理论电影| 国产亚洲欧洲高清一区| 国产高清一区二区三区四区| 欧美视频免费| 日韩网站免费观看高清| 国内毛片毛片毛片毛片毛片| 99久久综合| 久久99视频精品| 国产在线视频99| 国产日韩欧美一区| 国产成人久久久精品一区| 中文天堂在线视频| 久久99久久久久| yy111111少妇影院日韩夜片| 人妻精品无码一区二区| 99精品桃花视频在线观看| 免费国产一区| 天天在线视频色| 一区二区三区四区高清精品免费观看| 大荫蒂性生交片| 日本蜜桃在线观看视频| 在线视频一区二区免费| 在线观看免费视频污| 91麻豆精品国产91久久久久推荐资源| 亚洲国产美女久久久久| 黄色aaa视频| 91久久久精品国产| 91黑丝高跟在线| 最近中文字幕免费观看| 国产精品一区三区| 久久福利电影| 麻豆网站在线看| 天天操天天色综合| www午夜视频| 国产极品模特精品一二| 在线播放国产精品| 国产亚洲精品女人久久久久久| 午夜一区在线| 91情侣偷在线精品国产| 日本一卡二卡四卡精品| 亚洲男女毛片无遮挡| 欧美日韩亚洲一| 96视频在线观看欧美| 亚洲精品久久视频| 蜜桃av.com| 一本综合久久| 亚洲影院高清在线| 加勒比一区二区三区在线| 亚洲素人一区二区| 黑鬼大战白妞高潮喷白浆| 麻豆视频久久| 日韩小视频网址| 精品国产91亚洲一区二区三区婷婷| 中文写幕一区二区三区免费观成熟| 香蕉久久精品日日躁夜夜躁| 久久天天躁日日躁| 亚洲熟女综合色一区二区三区| 国产精品18久久久久久vr| 日韩成人av网站| av漫画网站在线观看| 6080午夜不卡| 欧美亚洲色综久久精品国产| 最新日韩欧美| 91免费在线视频| 国产有码在线| 狠狠躁夜夜躁久久躁别揉| 午夜激情视频网| 日韩三级在线| 欧美专区日韩视频| 日韩一卡二卡在线| 一个色综合av| 欧美性受xxxx黒人xyx性爽| 成人看的视频| 国产91色在线免费| 三区在线视频| 欧美日韩一区二区免费视频| 一边摸一边做爽的视频17国产| 亚洲成av人片一区二区密柚| 国产日韩亚洲欧美| 337p日本欧洲亚洲大胆鲁鲁| 91国偷自产一区二区使用方法| 久久人人爽人人人人片| 激情综合久久| 国产欧美一区二区在线播放| 女人黄色免费在线观看| 日韩欧美中文一区| 妺妺窝人体色www聚色窝仙踪| 国产乱子轮精品视频| 国产成人免费高清视频| 精品三级久久久| 色在人av网站天堂精品| 国产高潮在线观看| 亚洲国产成人av好男人在线观看| 色婷婷狠狠18禁久久| 欧美天堂亚洲电影院在线观看| 99在线看视频| missav|免费高清av在线看| 亚洲福利小视频| 国产原创视频在线| 久久久91精品国产一区二区三区| 十八禁视频网站在线观看| 日本久久综合| 91色视频在线观看| 波多野结衣在线高清| 亚洲精品成人久久久| 依依成人综合网| 国产精品无遮挡| 波多野结衣国产精品| 欧美精品不卡| 美女一区视频| 久久xxx视频| 蜜臀久久99精品久久久无需会员| 亚洲av永久无码国产精品久久| 亚洲国产欧美一区二区三区丁香婷| 日本一区二区在线观看视频| 免播放器亚洲| 亚洲激情一区二区| 香蕉大人久久国产成人av| 91爱爱小视频k| 在线a人片免费观看视频| 制服丝袜在线91| 日本在线视频免费| 中文字幕精品—区二区四季| 激情成人在线观看| 亚洲美女色禁图| 婷婷久久五月天| 亚洲综合影院| 国产91精品最新在线播放| 欧美jizz18hd性欧美| 精品999久久久| 免费的毛片视频| 亚洲精品欧美在线| 久久国产精品无码一级毛片| 精品无码三级在线观看视频| 国产精品无码人妻一区二区在线 | 精品成人在线观看| 激情网站在线观看| 亚洲男人的天堂一区二区| 黄瓜视频污在线观看| 久久99热狠狠色一区二区| 男女激情无遮挡| 天天综合精品| 欧美日韩亚洲免费| 日韩一区二区三区精品| 国产精品户外野外| xxxcom在线观看| 日韩在线免费观看视频| 性xxxx视频| 欧美一级视频精品观看| 精产国品一区二区| 香蕉久久一区二区不卡无毒影院| www中文在线| 91伊人久久大香线蕉| 无套内谢丰满少妇中文字幕| 日韩专区中文字幕一区二区| 美女黄色免费看| 国产国产精品| 日韩欧美在线观看强乱免费| 加勒比色综合久久久久久久久| 成人性生交大片免费看视频直播 | 欧美日韩亚洲天堂| 久久久久亚洲AV| 亚洲欧洲国产日本综合| 久久亚洲AV无码专区成人国产| 成人免费视频caoporn| 一区二区三区四区毛片| 日本系列欧美系列| 丰满人妻中伦妇伦精品app| 在线精品亚洲| 免费一级淫片aaa片毛片a级| 一本到12不卡视频在线dvd| 亚洲第一导航| 精品国产91久久久久久浪潮蜜月| 精品91免费| 色老板在线视频一区二区| 国产精品一区二区欧美| 在线精品自拍| 国产精品久久久久久久久久久久午夜片| 精品一区二区三区中文字幕视频| 国产在线久久久| 综合欧美精品| 成人免费福利在线| 国产亚洲字幕| 99re在线| 91综合久久爱com| αv一区二区三区| 国产精品色呦| 国产精品三区www17con| 粉嫩久久久久久久极品| 国产伦精品一区二区三区视频孕妇| 国产suv精品一区| 精品毛片久久久久久| 特黄特色欧美大片| 欧美日韩免费精品| 精品国产乱码久久久久久果冻传媒 | 欧美成人精品在线播放| 菠萝菠萝蜜在线视频免费观看| 久久婷婷国产麻豆91天堂| 超碰超碰在线| 久久久久久久成人| 亚洲女同志freevdieo| 日韩美女视频免费在线观看| 精品视频在线一区二区在线| 国产精品爽爽爽| 精品中文字幕一区二区三区| 动漫精品视频| 日韩有码av| 亚洲国产成人不卡| 综合激情在线| 大陆av在线播放| 久久青草久久| 中文字幕中文在线| 国产精一品亚洲二区在线视频| 亚洲成人激情小说| 91啪亚洲精品| 国产黄a三级三级| 亚洲制服丝袜av| 国产高清中文字幕| 欧美精品第1页| 韩国av免费在线| 亚洲一品av免费观看| 国产调教视频在线观看| 69视频在线免费观看| 成人性片免费| 成人综合电影| 国产精品一国产精品| 桥本有菜av在线| 99精品视频免费观看| 亚洲性图一区二区| 成人激情黄色小说| 国产wwwwxxxx| 午夜久久久久久久久久一区二区| 91麻豆精品在线| 精品剧情在线观看| 福利片在线看| 久久琪琪电影院| 久久女人天堂| 久久久久久久久久码影片| 欧美3p视频| av7777777| 国产一区二区在线观看视频| 草草地址线路①屁屁影院成人| 中文字幕五月欧美| 日韩综合在线观看| 精品少妇一区二区三区在线播放| 成年人视频免费在线观看| 久久91精品国产| 国产精成人品2018| 免费久久久一本精品久久区| 在线成人激情| 亚洲无吗一区二区三区| 不卡av电影在线播放| 欧美在线视频第一页| 欧美在线免费观看视频| 亚洲xxx在线| xxxx欧美18另类的高清| 99re66热这里只有精品4| 狠狠色综合一区二区| 国产精品99免费看| 在线免费黄色网| 国产视频一区在线播放| 国产情侣在线视频| 精品国产乱码久久久久久闺蜜| 91精品国产91久久久久久青草| 国产精品久久久久久久久借妻| 国产精品任我爽爆在线播放| 三级在线免费观看| 精品一区二区成人精品| 亚洲精品国产精品国自产网站| 欧美日韩精品国产| 天堂在线资源库| 欧美精品成人91久久久久久久| 国产精品日本一区二区不卡视频| 亚洲国产一区二区精品视频| 日韩中文欧美在线| 国产特级黄色录像| 福利二区91精品bt7086| 天堂中文在线资源| 97热在线精品视频在线观看| 国产成人精品福利| 人妻久久久一区二区三区| 成人动漫精品一区二区| 国产亚洲欧美精品久久久www| 欧美成人精品1314www| 免费毛片在线看片免费丝瓜视频 | 韩剧1988在线观看免费完整版| 97一区二区国产好的精华液| 天天想你在线观看完整版电影免费| 狠狠色综合日日| 亚洲综合网在线| 精品乱码亚洲一区二区不卡| heyzo中文字幕在线| 国产一区二区三区四区五区加勒比| 亚洲激情av| 中文字字幕码一二三区| 日韩欧美高清在线视频| 韩国中文免费在线视频| 国产精品视频公开费视频| 天天综合精品| 久草免费资源站| 婷婷一区二区三区| 久香视频在线观看| 国产精品99一区| 四虎国产精品免费观看| 亚洲区 欧美区| 天天操天天综合网| av在线之家电影网站| 91综合免费在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 伊甸园精品99久久久久久| 韩国成人在线视频| 日本在线视频免费观看| 国产午夜精品视频免费不卡69堂| 亚洲日日夜夜| 99在线精品免费视频| 久久久国产精华| 国产乱码精品一区二区三区精东| 欧美激情中文网| 国产欧美久久一区二区三区| 91小视频在线播放| 亚洲国产cao| av在线播放网| 懂色中文一区二区三区在线视频| 亚洲影院一区| 国产麻豆视频在线观看| 亚洲黄色免费三级| 成人免费在线观看视频| 又大又硬又爽免费视频| 国产欧美一区二区精品仙草咪| 国产欧美熟妇另类久久久| **欧美日韩vr在线| 欧美韩国日本在线观看| 免费a v网站| 欧美日韩精品欧美日韩精品 | 亚洲一区中文日韩| 国产51人人成人人人人爽色哟哟| 亚洲一区二区免费在线| 久久国产直播|