http協議的請求頭裏面也有一個keep-alive,保持http通話,這樣:Connection: keep-alive 功能雖然不同,可是思想上是同樣的即爲~保持狀態活躍
demo分爲上面的路由導航部分,下面的內容區部分。點擊上面的路由導航,路由視圖渲染對應的路由組件。效果圖以下:html
// #App.vue中 <template> <div class="box"> <!-- 路由導航 --> <div class="nav"> <router-link to="/">去home頁面</router-link> <router-link to="/about">去about頁面</router-link> <router-link to="/detail">去detail頁面</router-link> </div> <!-- 路由導航對應的內容區 --> <main> <router-view></router-view> </main> </div> </template> // home.vue中,放置一個複選框 <el-checkbox v-model="checked">備選項</el-checkbox> // about.vue中,放置一個輸入框 <el-input v-model="input" placeholder="請輸入內容"></el-input> // detail.vue中方式一個下拉框 <el-select v-model="value" placeholder="請選擇"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select>
<template> <div class="box"> <!-- 路由導航 --> <div class="nav"> <router-link to="/">去home頁面</router-link> <router-link to="/about">去about頁面</router-link> <router-link to="/detail">去detail頁面</router-link> </div> <!-- 路由導航對應的內容區 --> <main> <keep-alive> <!-- 使用keep-alive包了一層,就能夠緩存啦 --> <router-view></router-view> </keep-alive> </main> </div> </template>
Vue.js devtools挺好用,能夠經過谷歌下載,vue開發中的很好的工具
看到這裏咱們發現,直接加上keep-alive的話,會把全部的router-view層級下的視圖的組件都緩存了,不過有的時候,咱們只想緩存部分,不想緩存全部的,那這怎麼辦呢?不要緊,大佬們已考慮到了,已經提早爲咱們解決好了,就是keep-alive中的include、exclude屬性vue
include 包含的意思。值爲字符串或正則表達式或數組。只有組件的名稱與include的值相同的纔會被緩存,即指定哪些被緩存,能夠指定多個被緩存。這裏以字符串爲例,指定多個組件緩存,語法是用逗號隔開。以下:正則表達式
// 指定home組件和about組件被緩存 <keep-alive include="home,about" > <router-view></router-view> </keep-alive>
exclude至關於include的反義詞,就是除了的意思,指定哪些組件不被緩存,用法和include相似,以下:編程
// 除了home組件和about組件別的都緩存,本例中就是隻緩存detail組件 <keep-alive exclude="home,about" > <router-view></router-view> </keep-alive>
語法的意思是,只緩存about和detail,別的組件不緩存。咱們看下圖的vue工具,也能夠看出來,緩存的組件,不處於對應展現的路由下,就會成爲inactive狀態。後端
keep-alive除了include和exclude屬性以外,還有一個屬性就是max屬性,這個max通常狀況用的不是太多,主要目的就是控制一下被緩存的組件的個數,後緩存的就會把先緩存的給擠掉線了,也是至關於緩存優化的一中策略了。畢竟適當緩存提升用戶體驗,緩存過渡,電腦變卡。
include和exclude的屬性值是組件的名稱,也就是組件的name屬性值,也就是以下的name屬性值。數組
<script> export default { name: "App" // ... }; </script>
咱們知道組件中都有對應的邏輯js部分,並且組件要發請求獲取數據的,通常狀況下,咱們都是在created或者mounted鉤子中去發請求,向後端的大佬要數據的,關於使用keep-alive後的組件的鉤子函數的問題,咱們須要注意一下緩存
首先使用了keep-alive的組件之後,組件上就會自動加上了activated鉤子和deactivated鉤子。函數
假設咱們只緩存home組件,咱們先看一下代碼,再在鉤子中打印出對應的順序。就知道鉤子執行的順序了,本身動手印象深入工具
代碼以下組件化
<template> <div> <el-checkbox v-model="checked">備選項</el-checkbox> </div> </template> <script> export default { name: "home", data() { return { checked: false } }, created() { console.log("我是created鉤子"); }, mounted() { console.log("我是mounted鉤子"); }, activated() { console.log("我是activated鉤子"); }, deactivated() { console.log("我是deactivated鉤子"); }, beforeDestroy() { console.log("我是beforeDestroy鉤子");因此咱們能夠得出結論: }, }; </script>
進入組件打印結果以下
我是created鉤子 我是mounted鉤子 我是activated鉤子
我是deactivated鉤子
得出結論
初始進入和離開 created ---> mounted ---> activated --> deactivated 後續進入和離開 activated --> deactivated
因此咱們能夠在activated 和deactivated鉤子中去作一些邏輯處理,這兩個鉤子有點相似mounted和beforeDestroy鉤子,可是仍是不同。畢竟使用keep-alive不會銷燬組件
上述咱們使用的是keep-alive包裹router-view的小案例來說解的,實際上keep-alive通常狀況下,要麼包裹router-view,要麼包裹動態組件component。代碼寫法其實是同樣的。包裹動態組件的用法以下:
<keep-alive include="home" exclude="about"> <component :is="whichComponent"></component> </keep-alive>
keep-alive的include和exclude屬性也支持v-bind的語法,因此也是很靈活的。