国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

說說你對keep-alive的理解是什么?

這篇具有很好參考價(jià)值的文章主要介紹了說說你對keep-alive的理解是什么?。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識,希望對大家有所幫助

說說你對keep-alive的理解是什么?

一、Keep-alive 是什么

keep-alivevue中的內(nèi)置組件,能在組件切換過程中將狀態(tài)保留在內(nèi)存中,防止重復(fù)渲染DOM

keep-alive?包裹動(dòng)態(tài)組件時(shí),會(huì)緩存不活動(dòng)的組件實(shí)例,而不是銷毀它們

keep-alive可以設(shè)置以下props屬性:

  • include?- 字符串或正則表達(dá)式。只有名稱匹配的組件會(huì)被緩存

  • exclude?- 字符串或正則表達(dá)式。任何名稱匹配的組件都不會(huì)被緩存

  • max?- 數(shù)字。最多可以緩存多少組件實(shí)例

關(guān)于keep-alive的基本用法:

<keep-alive>
  <component :is="view"></component>
</keep-alive>

使用includesexclude

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

<!-- 正則表達(dá)式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 數(shù)組 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
  <component :is="view"></component>
</keep-alive>

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

設(shè)置了 keep-alive 緩存的組件,會(huì)多出兩個(gè)生命周期鉤子(activateddeactivated):

  • 首次進(jìn)入組件時(shí):beforeRouteEnter?>?beforeCreate?>?created>?mounted?>?activated?> ... ... >?beforeRouteLeave?>?deactivated

  • 再次進(jìn)入組件時(shí):beforeRouteEnter?>activated?> ... ... >?beforeRouteLeave?>?deactivated

二、使用場景

使用原則:當(dāng)我們在某些場景下不需要讓頁面重新加載時(shí)我們可以使用keepalive

舉個(gè)栗子:

當(dāng)我們從首頁–>列表頁–>商詳頁–>再返回,這時(shí)候列表頁應(yīng)該是需要keep-alive

首頁–>列表頁–>商詳頁–>返回到列表頁(需要緩存)–>返回到首頁(需要緩存)–>再次進(jìn)入列表頁(不需要緩存),這時(shí)候可以按需來控制頁面的keep-alive

在路由中設(shè)置keepAlive屬性判斷是否需要緩存

{
  path: 'list',
  name: 'itemList', // 列表頁
  component (resolve) {
    require(['@/pages/item/list'], resolve)
 },
 meta: {
  keepAlive: true,
  title: '列表頁'
 }
}

使用<keep-alive>

<div id="app" class='wrapper'>
    <keep-alive>
        <!-- 需要緩存的視圖組件 --> 
        <router-view v-if="$route.meta.keepAlive"></router-view>
     </keep-alive>
      <!-- 不需要緩存的視圖組件 -->
     <router-view v-if="!$route.meta.keepAlive"></router-view>
</div>

三、原理分析

keep-alivevue中內(nèi)置的一個(gè)組件

源碼位置:src/core/components/keep-alive.js

export default {
  name: 'keep-alive',
  abstract: true,

  props: {
    include: [String, RegExp, Array],
    exclude: [String, RegExp, Array],
    max: [String, Number]
  },

  created () {
    this.cache = Object.create(null)
    this.keys = []
  },

  destroyed () {
    for (const key in this.cache) {
      pruneCacheEntry(this.cache, key, this.keys)
    }
  },

  mounted () {
    this.$watch('include', val => {
      pruneCache(this, name => matches(val, name))
    })
    this.$watch('exclude', val => {
      pruneCache(this, name => !matches(val, name))
    })
  },

  render() {
    /* 獲取默認(rèn)插槽中的第一個(gè)組件節(jié)點(diǎn) */
    const slot = this.$slots.default
    const vnode = getFirstComponentChild(slot)
    /* 獲取該組件節(jié)點(diǎn)的componentOptions */
    const componentOptions = vnode && vnode.componentOptions

    if (componentOptions) {
      /* 獲取該組件節(jié)點(diǎn)的名稱,優(yōu)先獲取組件的name字段,如果name不存在則獲取組件的tag */
      const name = getComponentName(componentOptions)

      const { include, exclude } = this
      /* 如果name不在inlcude中或者存在于exlude中則表示不緩存,直接返回vnode */
      if (
        (include && (!name || !matches(include, name))) ||
        // excluded
        (exclude && name && matches(exclude, name))
      ) {
        return vnode
      }

      const { cache, keys } = this
      /* 獲取組件的key值 */
      const key = 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
     /*  拿到key值后去this.cache對象中去尋找是否有該值,如果有則表示該組件有緩存,即命中緩存 */
      if (cache[key]) {
        vnode.componentInstance = cache[key].componentInstance
        // make current key freshest
        remove(keys, key)
        keys.push(key)
      }
        /* 如果沒有命中緩存,則將其設(shè)置進(jìn)緩存 */
        else {
        cache[key] = vnode
        keys.push(key)
        // prune oldest entry
        /* 如果配置了max并且緩存的長度超過了this.max,則從緩存中刪除第一個(gè) */
        if (this.max && keys.length > parseInt(this.max)) {
          pruneCacheEntry(cache, keys[0], keys, this._vnode)
        }
      }

      vnode.data.keepAlive = true
    }
    return vnode || (slot && slot[0])
  }
}

可以看到該組件沒有template,而是用了render,在組件渲染的時(shí)候會(huì)自動(dòng)執(zhí)行render函數(shù)

this.cache是一個(gè)對象,用來存儲(chǔ)需要緩存的組件,它將以如下形式存儲(chǔ):

this.cache = {
    'key1':'組件1',
    'key2':'組件2',
    // ...
}

在組件銷毀的時(shí)候執(zhí)行pruneCacheEntry函數(shù)

function pruneCacheEntry (
  cache: VNodeCache,
  key: string,
  keys: Array<string>,
  current?: VNode
) {
  const cached = cache[key]
  /* 判斷當(dāng)前沒有處于被渲染狀態(tài)的組件,將其銷毀*/
  if (cached && (!current || cached.tag !== current.tag)) {
    cached.componentInstance.$destroy()
  }
  cache[key] = null
  remove(keys, key)
}

mounted鉤子函數(shù)中觀測?include?和?exclude?的變化,如下:

mounted () {
    this.$watch('include', val => {
        pruneCache(this, name => matches(val, name))
    })
    this.$watch('exclude', val => {
        pruneCache(this, name => !matches(val, name))
    })
}

如果include?或exclude?發(fā)生了變化,即表示定義需要緩存的組件的規(guī)則或者不需要緩存的組件的規(guī)則發(fā)生了變化,那么就執(zhí)行pruneCache函數(shù),函數(shù)如下:

function pruneCache (keepAliveInstance, filter) {
  const { cache, keys, _vnode } = keepAliveInstance
  for (const key in cache) {
    const cachedNode = cache[key]
    if (cachedNode) {
      const name = getComponentName(cachedNode.componentOptions)
      if (name && !filter(name)) {
        pruneCacheEntry(cache, key, keys, _vnode)
      }
    }
  }
}

在該函數(shù)內(nèi)對this.cache對象進(jìn)行遍歷,取出每一項(xiàng)的name值,用其與新的緩存規(guī)則進(jìn)行匹配,如果匹配不上,則表示在新的緩存規(guī)則下該組件已經(jīng)不需要被緩存,則調(diào)用pruneCacheEntry函數(shù)將其從this.cache對象剔除即可

關(guān)于keep-alive的最強(qiáng)大緩存功能是在render函數(shù)中實(shí)現(xiàn)

首先獲取組件的key值:

const key = vnode.key == null? 
componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
: vnode.key

拿到key值后去this.cache對象中去尋找是否有該值,如果有則表示該組件有緩存,即命中緩存,如下:

/* 如果命中緩存,則直接從緩存中拿 vnode 的組件實(shí)例 */
if (cache[key]) {
    vnode.componentInstance = cache[key].componentInstance
    /* 調(diào)整該組件key的順序,將其從原來的地方刪掉并重新放在最后一個(gè) */
    remove(keys, key)
    keys.push(key)
} 

直接從緩存中拿?vnode?的組件實(shí)例,此時(shí)重新調(diào)整該組件key的順序,將其從原來的地方刪掉并重新放在this.keys中最后一個(gè)

this.cache對象中沒有該key值的情況,如下:

/* 如果沒有命中緩存,則將其設(shè)置進(jìn)緩存 */
else {
    cache[key] = vnode
    keys.push(key)
    /* 如果配置了max并且緩存的長度超過了this.max,則從緩存中刪除第一個(gè) */
    if (this.max && keys.length > parseInt(this.max)) {
        pruneCacheEntry(cache, keys[0], keys, this._vnode)
    }
}

表明該組件還沒有被緩存過,則以該組件的key為鍵,組件vnode為值,將其存入this.cache中,并且把key存入this.keys

此時(shí)再判斷this.keys中緩存組件的數(shù)量是否超過了設(shè)置的最大緩存數(shù)量值this.max,如果超過了,則把第一個(gè)緩存組件刪掉

四、思考題:緩存后如何獲取數(shù)據(jù)

解決方案可以有以下兩種:

  • beforeRouteEnter

  • actived

beforeRouteEnter

每次組件渲染的時(shí)候,都會(huì)執(zhí)行beforeRouteEnter

beforeRouteEnter(to, from, next){
    next(vm=>{
        console.log(vm)
        // 每次進(jìn)入路由執(zhí)行
        vm.getData()  // 獲取數(shù)據(jù)
    })
},

actived

keep-alive緩存的組件被激活的時(shí)候,都會(huì)執(zhí)行actived鉤子

activated(){
   this.getData() // 獲取數(shù)據(jù)
},

注意:服務(wù)器端渲染期間avtived不被調(diào)用文章來源地址http://www.zghlxwxcb.cn/news/detail-837819.html

參考文獻(xiàn)

  • https://www.cnblogs.com/dhui/p/13589401.html
  • https://www.cnblogs.com/wangjiachen666/p/11497200.html
  • https://vue3js.cn/docs/zh

到了這里,關(guān)于說說你對keep-alive的理解是什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • keep-alive組件的作用與原理

    原文合集地址如下,有需要的朋友可以關(guān)注 本文地址 “keep-alive” 是 Vue.js 中的一個(gè)特殊組件,用于緩存組件的狀態(tài),以提高應(yīng)用性能。在 Vue.js 中,組件通常是動(dòng)態(tài)創(chuàng)建和銷毀的,當(dāng)切換到另一個(gè)頁面或組件時(shí),之前的組件會(huì)被銷毀,再次進(jìn)入時(shí)會(huì)重新創(chuàng)建和初始化。這樣

    2024年02月12日
    瀏覽(19)
  • react 實(shí)現(xiàn)頁面狀態(tài)緩存(keep-alive)

    react 實(shí)現(xiàn)頁面狀態(tài)緩存(keep-alive)

    因?yàn)?react、vue都是單頁面應(yīng)用,路由跳轉(zhuǎn)時(shí),就會(huì)銷毀上一個(gè)頁面的組件。但是有些項(xiàng)目不想被銷毀,想保存狀態(tài)。 比如:h5項(xiàng)目跳轉(zhuǎn)其他頁面返回時(shí),頁面狀態(tài)不丟失。設(shè)想一個(gè) 頁面我滑倒了中間,然后跳轉(zhuǎn)到 詳情頁然后 返回,之前的頁面刷新了,回到頂部了肯定不行(

    2024年01月23日
    瀏覽(38)
  • vue3.0中的keep-alive

    vue3.0中的keep-alive

    keep-alive是vue中的一個(gè)內(nèi)置組件,通常用它來包裹一個(gè)動(dòng)態(tài)組件,keep-alive 包裹動(dòng)態(tài)組件時(shí),會(huì)緩存不活動(dòng)的組件實(shí)例,而不是銷毀它們。 它有兩個(gè)特殊的生命周期鉤子 activated 和 deactivated ,在vue3.0里面生命周期函數(shù)前面都要加上on, onActivated , onDeactivated 。當(dāng)組件在使用了kee

    2023年04月08日
    瀏覽(20)
  • keep-alive緩存三級及三級以上路由

    keep-alive緩存三級及三級以上路由

    需求:需要緩存這個(gè)出入記錄,當(dāng)tab切換時(shí)不重新加載,當(dāng)刷新頁面時(shí),或把這個(gè)關(guān)閉在重新打開時(shí)重新加載如圖: (我這里用的是芋道源碼的前端框架) 1、include 包含頁面組件name的這些組件頁面,會(huì)被緩存起來 2、exclude 除了這些name以外的頁面組件,會(huì)被緩存起來 3、沒有

    2024年02月09日
    瀏覽(20)
  • vue keep-alive 中的生命周期

    keep-alive 是 Vue 提供的一個(gè)內(nèi)置組件,用來對組件進(jìn)行緩存——在組件切換過程中將狀態(tài)保留在內(nèi)存中,防止重復(fù)渲染DOM。 如果為一個(gè)組件包裹了 keep-alive,那么它會(huì)多出兩個(gè)生命周期:deactivated、activated。同時(shí),beforeDestroy 和 destroyed 就不會(huì)再被觸發(fā)了,因?yàn)榻M件 不會(huì)被真正

    2024年02月12日
    瀏覽(23)
  • 【Vue3】keep-alive 緩存組件

    【Vue3】keep-alive 緩存組件

    當(dāng)在 Vue.js 中使用 keep-alive 組件時(shí),它將會(huì)緩存動(dòng)態(tài)組件,而不是每次渲染都銷毀和重新創(chuàng)建它們。這對于需要在組件間快速切換并且保持組件狀態(tài)的情況非常有用。 keep-alive 只能包含(或者說只能渲染)一個(gè)子組件,如果需要包含多個(gè)子組件,需要用 v-if 選擇某個(gè)確定的組

    2024年02月13日
    瀏覽(19)
  • Vue keep-alive的使用和原理解析

    Vue keep-alive的使用和原理解析

    在當(dāng)今Web開發(fā)領(lǐng)域中,構(gòu)建交互性強(qiáng)、可復(fù)用且易于維護(hù)的用戶界面是至關(guān)重要的。而Vue.js作為一款現(xiàn)代化且流行的JavaScript框架,正是為了滿足這些需求而誕生。它采用了MVVM架構(gòu)模式,并通過數(shù)據(jù)驅(qū)動(dòng)和組件化的方式,使我們能夠更輕松地構(gòu)建出優(yōu)雅而高效的Web應(yīng)用程序。

    2024年01月16日
    瀏覽(24)
  • Vue2 - keep-alive 作用和原理

    Vue2 - keep-alive 作用和原理

    1,是一個(gè)內(nèi)部組件,用于緩存組件實(shí)例。在組件切換時(shí),不用重新創(chuàng)建而是使用緩存中的組件實(shí)例。 可以避免創(chuàng)建組件的開銷。 可以 保留組件狀態(tài) 。 2,有3個(gè)屬性: include 和 exclude 屬性,可以控制哪些組件進(jìn)入緩存。 max 屬性可以設(shè)置最大緩存數(shù),當(dāng)緩存的實(shí)例超過該數(shù)時(shí)

    2024年01月25日
    瀏覽(18)
  • TCP KeepAlive與HTTP Keep-Alive

    TCP KeepAlive與HTTP Keep-Alive

    TCP連接建立之后,如果應(yīng)用程序或者上層協(xié)議一直不發(fā)送數(shù)據(jù),或者隔很長時(shí)間才發(fā)送一次數(shù)據(jù),那么TCP需要判斷是應(yīng)用程序掉線了還是確實(shí)沒有數(shù)據(jù)傳輸。 TCP協(xié)議通過KeepAlive機(jī)制解決這個(gè)問題,當(dāng)超過一段時(shí)間之后,TCP自動(dòng)發(fā)送一個(gè)數(shù)據(jù)為空的報(bào)文給對方,如果對方回應(yīng)了

    2024年02月15日
    瀏覽(24)
  • VUE3,自定義控制keep-alive緩存

    安裝插件 npm install vite-plugin-vue-setup-extend?--save 在vite.config.ts中 import VueSetupExtend from \\\'vite-plugin-vue-setup-extend\\\' ..... plugins:[ ? ? ? ? vue(), ????????VueSetupExtend(), ? ? ? ? ..... ] useKeepalive.ts import { ref } from \\\"vue\\\" export const includes = refstring[]([]); // 增加緩存 export function addKeepAliveC

    2024年01月19日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包