日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

LRU算法在Vue內置組件keep-alive中的使用

瀏覽:12日期:2022-09-29 09:48:36
目錄vue的keep-alive內置組件的使用也是使用了改算法,源碼如下:實現一個自己的LRU算法另一種vue的keep-alive內置組件的使用也是使用了改算法,源碼如下:

export default { name: 'keep-alive', // 抽象組件屬性 ,它在組件實例建立父子關系的時候會被忽略,發生在 initLifecycle 的過程中 abstract: true, props: { // 被緩存組件 include: patternTypes, // 不被緩存組件 exclude: patternTypes, // 指定緩存大小 max: [String, Number] }, created() { // 初始化用于存儲緩存的 cache 對象 this.cache = Object.create(null); // 初始化用于存儲VNode key值的 keys 數組 this.keys = []; }, destroyed() { for (const key in this.cache) { // 刪除所有緩存 pruneCacheEntry(this.cache, key, this.keys); } }, mounted() { // 監聽緩存(include)/不緩存(exclude)組件的變化 // 在變化時,重新調整 cache // pruneCache:遍歷 cache,如果緩存的節點名稱與傳入的規則沒有匹配上的話,就把這個節點從緩存中移除 this.$watch('include', val => { pruneCache(this, name => matches(val, name)); }); this.$watch('exclude', val => { pruneCache(this, name => !matches(val, name)); }); }, render() { // 獲取第一個子元素的 vnode const slot = this.$slots.default; const vnode: VNode = getFirstComponentChild(slot); const componentOptions: ?VNodeComponentOptions = vnode && vnode.componentOptions; if (componentOptions) { // name 不在 inlcude 中或者在 exlude 中則直接返回 vnode,否則繼續進行下一步 // check pattern const name: ?string = getComponentName(componentOptions); const { include, exclude } = this; if (// not included(include && (!name || !matches(include, name))) ||// excluded(exclude && name && matches(exclude, name)) ) {return vnode; } const { cache, keys } = this; // 獲取鍵,優先獲取組件的 name 字段,否則是組件的 tag const key: ?string =vnode.key == null ? // same constructor may get registered as different local components // so cid alone is not enough (#3269) componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '') : vnode.key; // -------------------------------------------------- // 下面就是 LRU 算法了, // 如果在緩存里有則調整, // 沒有則放入(長度超過 max,則淘汰最近沒有訪問的) // -------------------------------------------------- // 如果命中緩存,則從緩存中獲取 vnode 的組件實例,并且調整 key 的順序放入 keys 數組的末尾 if (cache[key]) {vnode.componentInstance = cache[key].componentInstance;// make current key freshestremove(keys, key);keys.push(key); } // 如果沒有命中緩存,就把 vnode 放進緩存 else {cache[key] = vnode;keys.push(key);// prune oldest entry// 如果配置了 max 并且緩存的長度超過了 this.max,還要從緩存中刪除第一個if (this.max && keys.length > parseInt(this.max)) { pruneCacheEntry(cache, keys[0], keys, this._vnode);} } // keepAlive標記位 vnode.data.keepAlive = true; } return vnode || (slot && slot[0]); }};// 移除 key 緩存function pruneCacheEntry ( cache: VNodeCache, key: string, keys: Array<string>, current?: VNode) { const cached = cache[key] if (cached && (!current || cached.tag !== current.tag)) { cached.componentInstance.$destroy() } cache[key] = null remove(keys, key)}// remove 方法(shared/util.js)/** * Remove an item from an array. */export function remove (arr: Array<any>, item: any): Array<any> | void { if (arr.length) { const index = arr.indexOf(item) if (index > -1) { return arr.splice(index, 1) } }}實現一個自己的LRU算法

lru算法 的核心api(put get)和一個size最大容器值,本質是類似隊列 put實現思路 1 是否存在,存在就先刪除,再添加到隊頭 2 不存在,容量是否滿了,刪除最后一個隊尾,再添加隊頭 get實現思路: 1.有就返回,同時插入隊頭 2.沒有返回-1 時間復雜度O(1)

class LRU { constructor(size) { this.cache = new Map() this.size = size } put (key, val) { //存在 if (this.cache.has(key)) { //刪除 this.cache.delete(key) } else { //不存在,容量是否滿了 if (this.size === this.cache.size) {//刪除最后一個this.cache.delete(this.cache.keys().next().value) //拿到隊尾的元素 } } //插在隊頭 this.cache.set(key, val) } get (key) { let val = this.cache.get(key) if (!val) { return -1 } //訪問了就需要放在隊頭 this.put(key, val) return val }}另一種

//定義節點類class Node { constructor(pre, next, value, key){this.pre = pre;this.next = next;this.value = value;this.key = key; }}//定義雙向鏈表class DoubleList { constructor(head, tail){this.head = head;this.tail = tail; }}class LRUCache { //構造函數,傳入緩存容量 constructor(max){this.max = max;this.map = new Map();let node = new Node(null, null, null, null);this.doubleList = new DoubleList(node, node); }/** * 獲取緩存值 * 不存在返回-1,存在返回對應value值,并將此節點移到尾巴 * @param {*} key key值 */ get(key){let node = this.map.get(key)if(!node){ return -1;}else{ this.moveNode2Tail(key, node); return node.value;} } /** * 插入緩存 * 1.不存在對應key值,加到尾巴 * 2.存在對應key值,更新此key值對應value并提到尾巴 * 3.超出容量的話,去掉頭部數據 * @param {*} key key值 * @param {*} value value */ put(key, value) {let node = this.map.get(key);if(node){ if(!node.next){node.value = value;return; } node.pre.next = node.next; node.next.pre = node.pre;}let newNode = new Node(null, null, value, key);newNode.pre = this.doubleList.tail;this.doubleList.tail.next = newNode;this.doubleList.tail = newNode;this.map.set(key, newNode);if(this.map.size > this.max){ this.map.delete(this.doubleList.head.next.key); this.doubleList.head.next = this.doubleList.head.next.next; this.doubleList.head.next.pre = this.doubleList.head; } }//將節點移到尾巴 moveNode2Tail(key,node){ if(!node.next){ return;}//刪除節點 node.pre.next = node.next;node.next.pre = node.pre;this.map.delete(key)//新增尾巴節點let newNode = new Node(null, null, node.value, key);newNode.pre = this.doubleList.tail;this.doubleList.tail.next = newNode;this.doubleList.tail = newNode;this.map.set(key, newNode); }}

以上就是LRU算法在Vue內置組件keep-alive中的使用的詳細內容,更多關于Vue LRU算法的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩国产亚洲一区| 亚洲激情欧美| 国产亚洲精品美女久久久久久久久久| 在线精品亚洲| 国产成人精选| 欧美日韩在线精品一区二区三区激情综合 | 国产精品天堂蜜av在线播放| 久久国产精品免费一区二区三区 | 国产 日韩 欧美一区| 欧美日韩午夜电影网| 国产欧美一区二区三区精品观看| 日韩中文字幕高清在线观看| 日韩国产欧美在线播放| 蜜桃传媒麻豆第一区在线观看| 久久一级电影| 久久精品国产亚洲夜色av网站| 成人福利视频| 美女国产一区二区三区| 老司机精品视频在线播放| 99国产精品私拍| 色一区二区三区四区| 精品中文一区| 五月婷婷六月综合| 亚洲一区二区三区在线免费| 国产麻豆一区| а√在线中文在线新版| 亚洲精品一区三区三区在线观看| 日韩福利一区| 国产极品嫩模在线观看91精品| 在线精品视频在线观看高清| 亚洲精品中文字幕99999| 91精品国产乱码久久久久久久| 亲子伦视频一区二区三区| 欧美高清不卡| 日韩中文字幕| 精品视频在线你懂得| 亚洲高清不卡| 国产精品伦理久久久久久| 久久九九99| 欧美有码在线| 精品视频高潮| 亚洲一区二区三区四区五区午夜| 日本麻豆一区二区三区视频| 久久精品福利| 国产精品亚洲四区在线观看| 日韩av成人高清| 久久久久欧美精品| 国产亚洲精品美女久久| 欧美日韩一二三四| 国产精品精品| 欧美黄色一区| 成人在线黄色| 国产一区2区| 91高清一区| 国产视频网站一区二区三区| 国产成人黄色| 国产精品一国产精品k频道56| 不卡中文字幕| 国产一区2区| 桃色一区二区| 中文久久精品| 精品日韩在线| 国产精品久久久久久久久免费高清| 久久av在线| 精品中文字幕一区二区三区av| 日韩欧美中文字幕在线视频| 精品一区电影| 国产精品视频一区二区三区四蜜臂 | 伊人久久亚洲热| 毛片在线网站| 欧美日韩国产在线一区| 噜噜噜久久亚洲精品国产品小说| 91精品xxx在线观看| 福利片在线一区二区| 久久av影院| 日本久久综合| 欧美激情aⅴ一区二区三区 | 欧美中文一区二区| 久久久久久夜| 久久国内精品视频| 国产情侣一区在线| 国产日韩欧美三级| 日本在线成人| 久久只有精品| 亚洲一区二区小说| 亚洲a级精品| 国产精品宾馆| 日韩国产在线观看| 91精品在线免费视频| 国产图片一区| 嫩呦国产一区二区三区av| 国产精品极品| 国产va免费精品观看精品视频| 日本不卡一区二区| 麻豆精品av| 日产精品一区| 国产婷婷精品| 国产伦精品一区二区三区千人斩| 四虎国产精品免费观看| 精品一区亚洲| 国产麻豆一区二区三区精品视频| 91视频一区| 欧美日韩国产一区二区三区不卡| 日韩不卡在线观看日韩不卡视频| 精品视频网站| 亚洲精品影视| 国产成人免费精品| 日韩一区二区免费看| 久久亚洲资源中文字| 青青草伊人久久| 九九精品调教| 91成人在线精品视频| 国产福利片在线观看| 日韩一区中文| 国产综合欧美| 激情综合网址| 日韩福利视频网| 蜜臀精品一区二区三区在线观看| 日韩高清不卡在线| 自拍自偷一区二区三区| 欧美精品三级在线| 久久精品99久久无色码中文字幕| 久久国产88| 97视频热人人精品免费| 久久国产精品亚洲77777| 一本一道久久a久久| 九九99久久精品在免费线bt| 久久国产88| а√在线中文在线新版| 国产视频一区欧美| 欧美国产另类| 美女被久久久| 国产麻豆一区| 日韩av有码| 在线观看视频免费一区二区三区| 国产精品黑丝在线播放| 国产调教一区二区三区| 水蜜桃精品av一区二区| 精品资源在线| 亚洲日本国产| 色网在线免费观看| 麻豆成人在线观看| 午夜欧美理论片| 日韩精品视频一区二区三区| 欧美一级二区| 国产欧美日韩| 美女视频网站久久| 欧美成人久久| 亚洲制服少妇| 日韩1区2区日韩1区2区| 三级精品视频| 伊人久久大香线蕉av不卡| 7777精品| 久草免费在线视频| av成人国产| 国产精品theporn| 成人免费电影网址| 午夜在线一区二区| 美女视频黄免费的久久| 久久毛片亚洲| 国产亚洲一级| 国产精品久久久一区二区| 国产精东传媒成人av电影| 在线日韩av| 在线国产日韩| 精品丝袜在线| 日本视频一区二区| 999精品色在线播放| 国产日韩一区二区三免费高清| 久久久久久久久丰满| 一区二区亚洲视频| 国产盗摄——sm在线视频| 中文一区一区三区免费在线观| 久久亚洲黄色| 中文字幕日韩亚洲| 精品九九久久| 日韩精品导航| 四虎国产精品免费观看| 五月激激激综合网色播| 久久久精品网| 日产精品一区二区| 欧美日韩中出| 日韩视频二区| 成人美女视频| 精品三级av| 欧美激情日韩| 四虎4545www国产精品| 福利欧美精品在线| 亚洲一区二区动漫| 国产欧美激情| 日韩国产91| 日韩1区2区3区| 国产精品99在线观看| 日韩精品视频网站| 亚洲乱亚洲高清| 国产精品试看| 夜夜嗨av一区二区三区网站四季av| 日本久久成人网| 亚洲一级影院| 午夜免费一区|