← 返回首页
Vue-cli3基础教程(十九)
发表时间:2022-08-12 23:59:42
keep-alive

keep-alive顾名思义,保持活跃。就是可以保持组件的状态。

我们知道,因为vue就是组件化编程,一个.vue文件就是一个组件。就像万事万物一样,都有从出生到消亡的生命周期过程,vue的组件也是一样,也有自己的生命周期,比如create创建组件、mounted往组件上挂数据、update更新组件上挂的数据,destroy把组件实例销毁。

所以使用keep-alive就是保持组件活跃,不会被destroy销毁掉,就一直还活着,组件没有被销毁掉的话,组件上挂载的数据就还存在,所以状态就可以保留,所以,keep-alive就可以保持组件的状态。

1.keep-alive基本用法

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

keep-alive的两个props ,inclue (包含那些name的组件)和exclude (不包含那些name的组件)。

注意: "include" "exclude" 里写的名字必须和组件内部定义的名字完全一致,这个名字不是路由的名字。

// 组件 viewer
export default {
 name: 'viewer',
 data () {
   return {}
 }
}

2.keep-alive最佳实践用法

当项目比较复杂的时候,组件不可能命名 ,好多,找着也不方便。所以,有另外的写法,参考如下 :

// routes 配置
export default [
 {
   path: '/',
   name: 'home',
   component: Home,
   meta: {
     keepAlive: true // 需要被缓存
   }
 }, {
   path: '/edit',
   name: 'edit',
   component: Edit,
   meta: {
     keepAlive: false // 不需要被缓存
   }
 }
]

然后在组件引入的时候这样写 :

<keep-alive>
   <router-view v-if="$route.meta.keepAlive">
       <!-- 这里是会被缓存的视图组件,比如 Home! -->
   </router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive">
   <!-- 这里是不被缓存的视图组件,比如 Edit! -->
</router-view>

实例

App.vue

<template>
  <div id="app">
    <!-- 路由导航 -->
    <div class="nav">
      <router-link to="/">去home页面</router-link>
      |
      <router-link to="/about">去about页面</router-link>
      |
      <router-link to="/details">去details页面</router-link>
    </div>
    <!-- 路由导航对应的内容区 -->
    <main>
      <keep-alive include="HomeView,AboutView">
        <router-view></router-view>
      </keep-alive>
    </main>
  </div>
</template>
...

HomeView.vue

<template>
  <div class="home">
    <h1>Home</h1>
    <hr>
    <input type="checkbox" v-model="checked"/>备选项
  </div>
</template>

<script>

export default {
  name: 'HomeView',

  data(){
    return{
      checked: false
    }
  }
}
</script>

AboutView.vue

<template>
  <div class="about">
    <h1>About</h1>
    <hr>
    <input type="text" v-model="content" />
  </div>
</template>

<script>

export default {
  name: 'AboutView',

  data(){
    return{
      content: ''
    }
  }
}
</script>

DetailsView.vue

<template>
  <div>
      <h1>Details</h1>
      <hr>
      <select v-model="selectedCity">
        <option v-for="(c,index) in citys" :key="index" :value="c">{{c}}</option>
      </select>
  </div>
</template>

<script>
export default {
  name: "DetailsView",
  data(){
    return{
      selectedCity: '北京',
      citys:['北京','上海','广州','深圳']
    }
  }
}
</script>

<style scoped>

</style>

router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
    /*
    meta:{
      keepAlive: true
    }*/
  },
  {
    path: '/about',
    name: 'about',
    component: () => import(/* webpackChunkName: "about" */ '@/views/AboutView.vue'),
    /*
    meta:{
      keepAlive: false
    }*/
  },
  {
    path: '/details',
    name: 'details',
    component: () => import(/* webpackChunkName: "about" */ '@/views/DetailsView.vue')
    /*
    meta:{
      keepAlive: true
    }*/
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

运行效果:

我们发现HomeView和AboutView被保持组件状态了。