国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

vue中keepAlive組件的作用和使用方法詳解

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:搬磚猴哥 欄目: JavaScript 歡迎投稿:712375056

前言

在面試的時(shí)候,很多面試官再問(wèn)vue的時(shí)候可能就會(huì )提一嘴,你知道keep-alive有什么作用嗎?

keep-alive是vue內置的一個(gè)組件,而這個(gè)組件的作用就是能夠緩存不活動(dòng)的組件,我們能夠知道,一般情況下,組件進(jìn)行切換的時(shí)候,默認會(huì )進(jìn)行銷(xiāo)毀,如果有需求,某個(gè)組件切換后不進(jìn)行銷(xiāo)毀,而是保存之前的狀態(tài),那么就可以利用keep-alive來(lái)實(shí)現

<keep-alive>是Vue的內置組件,能在組件切換過(guò)程中將狀態(tài)保留在內存中,防止重復渲染DOM。

<keep-alive> 包裹動(dòng)態(tài)組件時(shí),會(huì )緩存不活動(dòng)的組件實(shí)例,而不是銷(xiāo)毀它們。和 <transition> 相似,<keep-alive> 是一個(gè)抽象組件:它自身不會(huì )渲染一個(gè) DOM 元素,也不會(huì )出現在父組件鏈中。

我這里利用腳手架創(chuàng )建項目后會(huì )生成home和about兩個(gè)組件,并且通過(guò)路由進(jìn)行切換

home組件

<template>
  <div class="home">
    <input type="text">
  </div>
</template>

<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'

export default {
  name: 'home',
  components: {
    HelloWorld
  }
}
</script>

我在home組件中寫(xiě)了一個(gè)input輸入框

about組件

<template>
  <div class="about">
    <input type="text">
  </div>
</template>
<script>
export default {
  name:"about"
}
</script>

同樣的about組件也放了一個(gè)輸入框

當我們在home組件的輸入框輸入一些內容的時(shí)候,然后切換到about組件,在切換回home組件,我們會(huì )發(fā)現之前輸入的內容被清空了,其實(shí)也容易理解,就是當切換到about組建的時(shí)候,home組件就被銷(xiāo)毀了,輸入框的值自然被清空了

我在home組件寫(xiě)了destroyed生命周期函數

當切換到about組件的時(shí)候home組件的destroyed就觸發(fā)了,所以home組件被銷(xiāo)毀了

那么此時(shí)我們就可以利用keep-alive組件進(jìn)行包裹router-view組件,將不活動(dòng)的組件緩存起來(lái)

App組件

<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link>
    </div>
    <keep-alive>
      <router-view />
    </keep-alive>
    
  </div>
</template>

寫(xiě)完之后會(huì )發(fā)現當切換到about組件時(shí),home組件中的destroyed并沒(méi)有觸發(fā),并且home組件的值也保存了下來(lái)

但是這樣也肯定不好,我們會(huì )發(fā)現,about組件的值也被緩存了,就是所有的路由組件都被緩存了,嚴重浪費性能,而且也不符合需求,我們現在只想緩存home組件

在keep-alive上有兩個(gè)屬性

字符串或正則表達式。只有匹配的組件會(huì )被緩存。

  • include 值為字符串或者正則表達式匹配的組件name會(huì )被緩存。
  • exclude 值為字符串或正則表達式匹配的組件name不會(huì )被緩存。

首先利用include實(shí)現,匹配到組件中定義的name,將進(jìn)行緩存

<keep-alive include="home">
   <router-view />
</keep-alive>

我們會(huì )發(fā)現home已經(jīng)被緩存了,但是about沒(méi)有被緩存

而exclude就是排除了,這個(gè)就不在演示了,很簡(jiǎn)單,除了這個(gè)我們還可以利用路由中的meta屬性來(lái)控制

{
      path: '/',
      name: 'home',
      meta:{
        keepAlive:true
      },
      component: Home
    }

將home的路由規則鐘的meta添加keepAlive屬性為true,也就是當前路由組件要進(jìn)行緩存

keep-alive代碼可以結合v-if進(jìn)行包裹,如果meta中的keepAlive為true進(jìn)行緩存,否側不進(jìn)行緩存,這樣可以更靈活一些

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

這樣組件的緩存是實(shí)現了,但是還是會(huì )有一些問(wèn)題,就是因為組件被緩存,并沒(méi)有被銷(xiāo)毀,所以組件在切換的時(shí)候也就不會(huì )被重新創(chuàng )建,自然也就不會(huì )調用created等生命周期函數,所以此時(shí)要使用activated與deactivated來(lái)獲取當前組件是否處于活動(dòng)狀態(tài)

我在home組件里面寫(xiě)入了activated與deactivated生命周期函數

activated(){
    console.log("哎呀看見(jiàn)我了")
    console.log("----------activated--------")
  },
  deactivated(){
    console.log("討厭??!你又走了")
    console.log("----------deactivated--------")
  }

通過(guò)上面的gif圖相信已經(jīng)看得很清楚了,此時(shí)keep-Alive也就差不多了

總結

到此這篇關(guān)于vue中keepAlive組件作用和使用方法的文章就介紹到這了,更多相關(guān)vue中keepAlive組件使用內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

欧美一区二区三区激情| 亚无码乱人伦一区二区| 久久精品人妻一区二区三区| 日韩欧美AⅤ综合网站发布| 国产制服丝袜无码视频| 天堂а√在线地址中文在线|