--- title: KeepAlive with Nested Routes Double Mount Issue impact: HIGH impactDescription: Using KeepAlive with nested Vue Router routes can cause child components to mount twice type: gotcha tags: [vue3, keepalive, vue-router, nested-routes, double-mount, bug] --- # KeepAlive with Nested Routes Double Mount Issue **Impact: HIGH** - When using `` with nested Vue Router routes, child route components may mount twice. This is a known issue that can cause duplicate API calls, broken state, and confusing behavior. ## Task Checklist - [ ] Test nested routes thoroughly when using KeepAlive - [ ] Avoid mixing KeepAlive with deeply nested route structures - [ ] Use workarounds if double mount is observed - [ ] Consider alternative caching strategies for nested routes ## The Problem ```vue ``` ```javascript // router.js const routes = [ { path: '/parent', component: Parent, children: [ { path: 'child', component: Child // This may mount TWICE! } ] } ] ``` **Symptoms:** - `onMounted` called twice in child component - Duplicate API requests - State initialization runs twice - Console logs appear doubled ## Diagnosis Add logging to confirm the issue: ```vue ``` ## Workarounds ### Option 1: Use `useActivatedRoute` Pattern Don't use `useRoute()` directly with KeepAlive: ```vue ``` ### Option 2: Avoid KeepAlive for Nested Route Parents Only cache leaf routes, not parent layouts: ```vue ``` ### Option 3: Guard Against Double Initialization Protect your component from double mount effects: ```vue ``` ### Option 4: Use Route-Level Cache Control ```vue ``` ```javascript // router.js const routes = [ { path: '/parent', component: Parent, meta: { keepAlive: false }, // Don't cache parent routes children: [ { path: 'child', component: Child, meta: { keepAlive: true } // Cache leaf routes } ] } ] ``` ### Option 5: Flatten Route Structure Avoid nesting if possible: ```javascript // Instead of nested routes const routes = [ // Flat structure avoids the issue { path: '/users', component: UserList }, { path: '/users/:id', component: UserDetail }, { path: '/users/:id/settings', component: UserSettings } ] ``` ## Key Points 1. **Known Vue Router issue** - Double mount with KeepAlive + nested routes 2. **Watch for symptoms** - Duplicate API calls, doubled logs 3. **Avoid caching parent routes** - Only cache leaf components 4. **Add initialization guards** - Protect against double execution 5. **Test thoroughly** - This issue may not appear immediately ## Reference - [Vue Router Issue #626: keep-alive in nested route mounted twice](https://github.com/vuejs/router/issues/626) - [GitHub: vue3-keep-alive-component workaround](https://github.com/emiyalee1005/vue3-keep-alive-component) - [Vue.js KeepAlive Documentation](https://vuejs.org/guide/built-ins/keep-alive.html)