重学Vue--keep-alive的使用

2020-10-02  本文已影响0人  小q

keep-alive是什么?

keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 transition 相似,keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。

keep-alive的作用:简单来说就是在组件切换中保留组件内的状态,避免重复渲染,减少加载时间和性能损耗,提高用户体验。

keep-alive的参数

keep-alive的生命周期

注意只有使用keep-alive包裹时,这两个生命周期函数才会被调用,如果要在每次进入页面的时候获取最新的数据,需要在activated阶段获取数据,承担原来 created 钩子函数中获取数据的任务。使用 exclude 排除之后,就算被包裹在 keep-alive 中,这两个钩子函数依然不会被调用!另外,在服务端渲染时,此钩子函数也不会被调用。

keep-alive的使用

1. 缓存所有页面

需要在App.vue中定义router-view的位置包裹上keep-alive

//app.vue
<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>

2. 根据条件缓存页面

使用include,exclude
//app.vue
<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link> |
      <router-link to="/keepAlive">keepAlive</router-link>
    </div>
    <!-- 1.逗号分隔字符串 -->
    <keep-alive include="Home,keepAlive" exclude="about">
      <router-view />
    </keep-alive>
    <!-- 2.正则表达式 (使用 `v-bind`) -->
    <keep-alive :include="/Home|keepAlive/">
      <router-view />
    </keep-alive>
    <!-- 3.数组 (使用 `v-bind`) -->
    <keep-alive :include="['a', 'b']">
      <router-view />
    </keep-alive>
  </div>
</template>

注意这里include,exclude匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配。

3. 集合路由,缓存页面

主要是在路由配置中为各个路由中增加meta属性,在meta属性中使用keepAlive控制组件的缓存,在App.vue中使用keep-alive包裹router-view,在router-view中使用v-if判断条件,条件为$route.meta.keepAlive具体如下:

//router中的index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [{
    path: '/',
    name: 'Home',
    component: Home,
    meta: {
      keepAlive: false
    }
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import( /* webpackChunkName: "about" */ '../views/About.vue'),
    meta: {
      keepAlive: false
    }
  },
  {
    path: '/keepAlive',
    name: 'keepAlive',
    component: () => import('../views/keepAlive.vue'),
    meta: {
      keepAlive: true
    }
  }
]

const router = new VueRouter({
  routes
})

export default router
//app.vue
<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link> |
      <router-link to="/keepAlive">keepAlive</router-link>
    </div>
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"/>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
  </div>
</template>

注意 : 这里需要再keep-alive包裹外再定义一个router-view,如不定义,其他不满足keep-alive的组件将无法被渲染。

上一篇 下一篇

猜你喜欢

热点阅读