<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【Vuejs】1156- 聊聊vue中的keep-alive

          共 8045字,需瀏覽 17分鐘

           ·

          2021-12-01 12:17

          大前端??前端知識寶庫??堅持日更

          一、什么是keep-alive?

          官方介紹就是:?包裹動態(tài)組件時,會緩存不活動的組件實例,而不是銷毀它們。和??相似,?是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現(xiàn)在組件的父組件鏈中。

          當組件在??內(nèi)被切換時,它的?mounted?和?unmounted?生命周期鉤子不會被調(diào)用,取而代之的是?activated?和?deactivated

          簡單理解就是說我們可以把一些不常變動的組件或者需要緩存的組件用包裹起來,這樣就會幫我們把組件保存在內(nèi)存中,而不是直接的銷毀,這樣做可以保留組件的狀態(tài)或避免多次重新渲染,以提高頁面性能

          二、使用用法

          我們先根據(jù)官方文檔來回顧一下組件的具體用法,如下:

          組件可接收三個屬性:

          • Props:
            • include?-?string | RegExp | Array。只有名稱匹配的組件會被緩存。
            • exclude?-?string | RegExp | Array。任何名稱匹配的組件都不會被緩存。
            • max?-?number | string。最多可以緩存多少組件實例。
          • 用法:

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

          ??
          ??<keep-alive?include="a,b">
          ????<component?:is="view">component>

          ??keep-alive>
          ??
          ??
          ??<keep-alive?:include="/a|b/">
          ????<component?:is="view">component>

          ??keep-alive>
          ??
          ??
          ??<keep-alive?:include="['a',?'b']">
          ????<component?:is="view">component>

          ??keep-alive>

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

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


          ??<keep-alive?:max="10">
          ????<component?:is="view">component>
          ??keep-alive>

          在這里簡單介紹一個日常項目中有可能出現(xiàn)的場景并使用keep-alive來實現(xiàn)按需控制緩存 場景:當我們從首頁–>列表頁–>商品詳情頁–>返回到列表頁(需要緩存)–>返回到首頁(需要緩存)–>再次進入列表頁(不需要緩存)

          1. 在路由meta對象里定義兩個值:

            keepAlive:這個路由是否需要緩存

            deepth:代表頁面之間的前進后退的層級關(guān)系

          ???
          ???{
          ???????path:?'*',
          ???????name:?'Home',
          ???????component:?()?=>?import(/*?webpackPreload:?true?*/?'@/views/home'),
          ???????meta:?{
          ?????????keepAlive:?true,
          ?????????deepth:?1
          ???????}
          ?????},
          ?????{
          ???????path:?'/list',
          ???????name:?'list',
          ???????component:?()?=>?import('@/views/list'),
          ???????meta:?{
          ?????????keepAlive:?true,
          ?????????deepth:?2
          ???????}
          ?????},
          ?????{
          ???????path:?'/detail',
          ???????name:?'Detail',
          ???????component:?()?=>?import('@/views/detail'),
          ???????meta:?{
          ?????????keepAlive:?true,
          ?????????deepth:?3
          ???????}
          ?????},
          ?????
          1. 監(jiān)聽路由動態(tài)控制需要緩存的值
          ???//3x版本router-view不允許直接寫在keep-alive里面,需注意
          ???