最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

五分鐘理解keep?alive用法及原理

 更新時間:2022年07月06日 09:38:29   作者:鹿魚  
這篇文章主要為大家介紹了keep?alive用法及原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

keep-alive可以實現(xiàn)組件緩存,當組件切換時不會對當前組件進行卸載。

主要是有include、exclude、max三個屬性;

前兩個屬性允許keep-alive有條件的進行緩存;

max可以定義組件最大的緩存?zhèn)€數(shù),如果超過了這個個數(shù)的話,在下一個新實例創(chuàng)建之前,就會將以緩存組件中最久沒有被訪問到的實例銷毀掉。

兩個生命周期activated/deactivated,用來得知當前組件是否處于活躍狀態(tài)。

Home.vue

<template>
  <div class="hello">
    <h1>你怎么還在學習????</h1>
    <input placeholder="輸入框" />
    <router-link to="/about">我的人生理想</router-link>
  </div>
</template>

About.vue

<template>
  <div class="hello">
    <h1>我想取老婆 ??</h1>
  </div>
</template>

App.vue

<template>
  <div id="app">
    <router-view/>
  </div>
</template>
<script>
import Home from './views/Home.vue'
import About from './views/About.vue'
export default {
  components: {
    Home,
    About,
  }
}
</script>

你在輸入框中輸入信息,點擊跳轉到另外一個頁面后,回到該頁面,你會發(fā)現(xiàn),輸入框中的文字消失了。怎么辦勒

使用 keep-alive 包裹 router-view,同時指定需要緩存的組件名稱。(PS:請在要緩存的組件中,寫明 name 屬性,并賦值。不然緩存不生效)

Home.vue

App.vue

<template>
  <div id="app">
    <keep-alive include="Home">
      <router-view/>
    </keep-alive>
  </div>
</template>
<script>
import Home from './views/Home.vue'
import About from './views/About.vue'
export default {
  components: {
    Home,
    About,
  }
}
</script>

結合 Router,緩存頁面

router.js

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
Vue.use(Router)
export default new Router({
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home,
      // 需要被緩存
      meta: {
        keepAlive: true
      }
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('./views/About.vue')
    },
  ]
})

Home.vue

<script>
export default {
  name: "Home",
  beforeRouteLeave(to, from, next) {
    to.meta.keepAlive = true;
    next();
  },
};
</script>

App.vue

<template>
  <div id="app">
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
  </div>
</template>

剩下的一些其他特性,可以自行前往官網查閱 cn.vuejs.org/v2/api/#kee…

keep-alive 原理

keep-alive中運用了LRU(Least Recently Used)算法。

  • 獲取 keep-alive 包裹著的第一個子組件對象及其組件名; 如果 keep-alive 存在多個子元素,keep-alive 要求同時只有一個子元素被渲染。所以在開頭會獲取插槽內的子元素,調用 getFirstComponentChild 獲取到第一個子元素的 VNode。
  • 根據設定的黑白名單(如果有)進行條件匹配,決定是否緩存。不匹配,直接返回組件實例(VNode),否則開啟緩存策略。
  • 根據組件ID和tag生成緩存Key,并在緩存對象中查找是否已緩存過該組件實例。如果存在,直接取出緩存值并更新該key在this.keys中的位置(更新key的位置是實現(xiàn)LRU置換策略的關鍵)。
  • 如果不存在,則在this.cache對象中存儲該組件實例并保存key值,之后檢查緩存的實例數(shù)量是否超過max設置值,超過則根據LRU置換策略刪除最近最久未使用的實例(即是下標為0的那個key)。最后將該組件實例的keepAlive屬性值設置為true。
var KeepAlive = {
  name: 'keep-alive',
  // 抽象組件
  abstract: true,
  // 接收的參數(shù)
  props: {
    include: patternTypes,
    exclude: patternTypes,
    max: [String, Number]
  },
  // 創(chuàng)建緩存表
  created: function created () {
    this.cache = Object.create(null);
    this.keys = [];
  },
  destroyed: function destroyed () {
    for (var key in this.cache) {
      pruneCacheEntry(this.cache, key, this.keys);
    }
  },
  mounted: function mounted () {
    var this$1 = this;
    this.$watch('include', function (val) {
      pruneCache(this$1, function (name) { return matches(val, name); });
    });
    this.$watch('exclude', function (val) {
      pruneCache(this$1, function (name) { return !matches(val, name); });
    });
  },
  render: function render () {
    var slot = this.$slots.default;
    // 獲取 `keep-alive` 包裹著的第一個子組件對象及其組件名; 
    // 如果 keep-alive 存在多個子元素,`keep-alive` 要求同時只有一個子元素被渲染。
    // 所以在開頭會獲取插槽內的子元素,
    // 調用 `getFirstComponentChild` 獲取到第一個子元素的 `VNode`。
    var vnode = getFirstComponentChild(slot);
    var componentOptions = vnode && vnode.componentOptions;
    if (componentOptions) {
      // check pattern
      var name = getComponentName(componentOptions);
      var ref = this;
      var include = ref.include;
      var exclude = ref.exclude;
      // 根據設定的黑白名單(如果有)進行條件匹配,決定是否緩存。   
      if (
        // not included
        (include && (!name || !matches(include, name))) ||
        // excluded
        (exclude && name && matches(exclude, name))
      ) {
      // 不匹配,直接返回組件實例(`VNode`),否則開啟緩存策略。
        return vnode
      }
      var ref$1 = this;
      var cache = ref$1.cache;
      var keys = ref$1.keys;
      // 根據組件ID和tag生成緩存Key
      var key = vnode.key == null
        ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
        : vnode.key;
      if (cache[key]) {
      // 并在緩存對象中查找是否已緩存過該組件實例。如果存在,直接取出緩存值
        vnode.componentInstance = cache[key].componentInstance;
        // 并更新該key在this.keys中的位置(更新key的位置是實現(xiàn)LRU置換策略的關鍵)。
        remove(keys, key);
        keys.push(key);
      } else {
       // 如果不存在,則在this.cache對象中存儲該組件實例并保存key值,
        cache[key] = vnode;
        keys.push(key);
        // 之后檢查緩存的實例數(shù)量是否超過max設置值,超過則根據LRU置換策略刪除最近最久未使用的實例
        if (this.max && keys.length > parseInt(this.max)) {
          pruneCacheEntry(cache, keys[0], keys, this._vnode);
        }
      }
		// 最后將該組件實例的keepAlive屬性值設置為true。
      vnode.data.keepAlive = true;
    }
    return vnode || (slot && slot[0])
  }
};

以上就是五分鐘理解keep alive用法及原理的詳細內容,更多關于keep alive用法原理的資料請關注腳本之家其它相關文章!

相關文章

  • @vue/cli4升級@vue/cli5?node.js?polyfills錯誤的解決方式

    @vue/cli4升級@vue/cli5?node.js?polyfills錯誤的解決方式

    最近在升級vue/cli的具有了一些問題,解決問題的過程也花費了些時間,所以下面這篇文章主要給大家介紹了關于@vue/cli4升級@vue/cli5?node.js?polyfills錯誤的解決方式,需要的朋友可以參考下
    2022-09-09
  • React組件通信之路由傳參(react-router-dom)

    React組件通信之路由傳參(react-router-dom)

    本文主要介紹了React組件通信之路由傳參(react-router-dom),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Vue2.x和Vue3.x的雙向綁定原理詳解

    Vue2.x和Vue3.x的雙向綁定原理詳解

    這篇文章主要給大家介紹了關于Vue2.x和Vue3.x的雙向綁定原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • vue的生命周期鉤子與父子組件的生命周期詳解

    vue的生命周期鉤子與父子組件的生命周期詳解

    Vue的生命周期就是vue實例從創(chuàng)建到銷毀的全過程,也就是new Vue() 開始就是vue生命周期的開始。Vue 實例有?個完整的?命周期,也就是從開始創(chuàng)建、初始化數(shù)據、編譯模版、掛載Dom -> 渲染、更新 -> 渲染、卸載 等?系列過程,稱這是Vue的?命周期
    2022-08-08
  • vue中如何實現(xiàn)復制內容到剪切板詳解

    vue中如何實現(xiàn)復制內容到剪切板詳解

    有些業(yè)務需求需要點擊按鈕復制鏈接,下面這篇文章主要給大家介紹了關于vue中如何實現(xiàn)復制內容到剪切板的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • 深入探索VueJS Scoped CSS 實現(xiàn)原理

    深入探索VueJS Scoped CSS 實現(xiàn)原理

    這篇文章主要介紹了深入探索VueJS Scoped CSS 實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • vue3中的響應式原理-effect

    vue3中的響應式原理-effect

    這篇文章主要介紹了vue3中的響應式原理-effect,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解VUE項目中安裝和使用vant組件

    詳解VUE項目中安裝和使用vant組件

    這篇文章主要介紹了VUE安裝和使用vant組件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Vue中使用Echarts響應式布局flexible.js+rem適配方案詳解

    Vue中使用Echarts響應式布局flexible.js+rem適配方案詳解

    這篇文章主要介紹了Vue中使用Echarts響應式布局flexible.js+rem適配方案詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • vue3+elementPlus?table中添加輸入框并提交校驗

    vue3+elementPlus?table中添加輸入框并提交校驗

    這篇文章主要介紹了vue3+elementPlus?table里添加輸入框并提交校驗,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08

最新評論

焦作市| 泗水县| 衡阳县| 高青县| 循化| 静安区| 舞阳县| 黄石市| 连南| 富源县| 措美县| 独山县| 政和县| 裕民县| 安乡县| 海兴县| 武胜县| 临夏县| 广州市| 永济市| 老河口市| 棋牌| 京山县| 武胜县| 灵璧县| 黄冈市| 金溪县| 宝山区| 永修县| 密云县| 南陵县| 厦门市| 南昌市| 宝鸡市| 呼和浩特市| 连江县| 中宁县| 砀山县| 石屏县| 五华县| 南雄市|