Skip to content
⚠️ This article was written in 2018. Some content may be outdated.

Vue keep-alive Route Caching

There's a common requirement in admin dashboards: when navigating from a list page to a detail page and back, the list page should preserve its scroll position and filter state. keep-alive solves exactly this.

Basic Usage

html
<!-- App.vue -->
<template>
  <div id="app">
    <keep-alive>
      <router-view />
    </keep-alive>
  </div>
</template>

With keep-alive, route components are cached instead of destroyed when switching routes, and are reused when navigated back to.

Caching Only Specific Routes

In most cases, you don't want to cache all routes — only specific ones.

Option 1: include/exclude

html
<!-- Only cache UserList and OrderList -->
<keep-alive :include="['UserList', 'OrderList']">
  <router-view />
</keep-alive>
javascript
// Components need to set a name
export default {
  name: "UserList", // must match the name in include
};

Option 2: Route meta config (recommended)

javascript
// router.js
const routes = [
  {
    path: "/users",
    component: UserList,
    meta: { keepAlive: true }, // cache this route
  },
  {
    path: "/users/:id",
    component: UserDetail,
    meta: { keepAlive: false }, // don't cache
  },
];
html
<!-- App.vue -->
<keep-alive>
  <router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<router-view v-if="!$route.meta.keepAlive" />

activated and deactivated

Components cached by keep-alive have two additional lifecycle hooks:

javascript
export default {
  name: "UserList",
  activated() {
    // Triggered each time the component is "activated" (including after first mount)
    // Good for: refreshing data when returning from a detail page
    console.log("UserList activated");
    this.refreshIfNeeded();
  },
  deactivated() {
    // Triggered when the component is "deactivated" (navigated away but not destroyed)
    console.log("UserList deactivated");
  },
};

Note: cached components do not trigger created and mounted on re-entry — only activated fires.

Scroll Position Restoration in Real Projects

javascript
export default {
  name: "UserList",
  data() {
    return {
      scrollTop: 0,
    };
  },
  activated() {
    // Restore scroll position
    this.$nextTick(() => {
      document.documentElement.scrollTop = this.scrollTop;
    });
  },
  deactivated() {
    // Save scroll position when leaving
    this.scrollTop = document.documentElement.scrollTop;
  },
};

Summary

  • keep-alive caches route components, avoiding repeated destroy-and-create cycles
  • Use the keepAlive field in route meta to control which routes are cached
  • Cached components use activated/deactivated instead of mounted/beforeDestroy
  • Best for: preserving list page state on back navigation, tab switching without resetting

MIT Licensed