diff --git a/src/.vuepress/config.js b/src/.vuepress/config.js
index 1791f38fc2..e756f08e45 100644
--- a/src/.vuepress/config.js
+++ b/src/.vuepress/config.js
@@ -14,8 +14,8 @@ const sidebar = {
'/guide/list',
'/guide/events',
'/guide/forms',
- '/guide/component-basics'
- ]
+ '/guide/component-basics',
+ ],
},
{
title: 'Components In-Depth',
@@ -25,20 +25,21 @@ const sidebar = {
'/guide/component-props',
'/guide/component-custom-events',
'/guide/component-slots',
- '/guide/component-provide-inject'
- ]
+ '/guide/component-provide-inject',
+ '/guide/component-dynamic-async',
+ ],
},
{
title: 'Migration to Vue 3',
collapsable: true,
- children: ['migration']
+ children: ['migration'],
},
{
title: 'Contribute to the Docs',
collapsable: true,
- children: ['writing-guide']
- }
- ]
+ children: ['writing-guide'],
+ },
+ ],
}
module.exports = {
@@ -50,9 +51,9 @@ module.exports = {
{
href:
'https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css',
- rel: 'stylesheet'
- }
- ]
+ rel: 'stylesheet',
+ },
+ ],
],
themeConfig: {
nav: [
@@ -62,8 +63,8 @@ module.exports = {
items: [
{ text: 'Guide', link: '/guide/introduction' },
{ text: 'Style Guide', link: '/style-guide/' },
- { text: 'Tooling', link: '/tooling/' }
- ]
+ { text: 'Tooling', link: '/tooling/' },
+ ],
},
{ text: 'API Reference', link: '/api/' },
{
@@ -71,8 +72,8 @@ module.exports = {
ariaLabel: 'Examples Menu',
items: [
{ text: 'Examples', link: '/examples/' },
- { text: 'Cookbook', link: '/cookbook/' }
- ]
+ { text: 'Cookbook', link: '/cookbook/' },
+ ],
},
{
text: 'Community',
@@ -80,16 +81,16 @@ module.exports = {
items: [
{ text: 'Team', link: '/community/team/' },
{ text: 'Partners', link: '/community/partners/' },
- { text: 'Themes', link: '/community/themes/' }
- ]
- }
+ { text: 'Themes', link: '/community/themes/' },
+ ],
+ },
],
sidebarDepth: 2,
sidebar: {
'/guide/': sidebar.guide,
- '/community/': sidebar.guide
+ '/community/': sidebar.guide,
},
- smoothScroll: false
+ smoothScroll: false,
},
plugins: {
'@vuepress/pwa': {
@@ -97,17 +98,17 @@ module.exports = {
updatePopup: {
'/': {
message: 'New content is available.',
- buttonText: 'Refresh'
- }
- }
- }
+ buttonText: 'Refresh',
+ },
+ },
+ },
},
markdown: {
/** @param {import('markdown-it')} md */
- extendMarkdown: md => {
+ extendMarkdown: (md) => {
md.options.highlight = require('./markdown/highlight')(
md.options.highlight
)
- }
- }
+ },
+ },
}
diff --git a/src/guide/component-dynamic-async.md b/src/guide/component-dynamic-async.md
new file mode 100644
index 0000000000..adce11fc9a
--- /dev/null
+++ b/src/guide/component-dynamic-async.md
@@ -0,0 +1,100 @@
+# Dynamic & Async Components
+
+> This page assumes you've already read the [Components Basics](components.md). Read that first if you are new to components.
+
+## Dynamic Components with `keep-alive`
+
+Earlier, we used the `is` attribute to switch between components in a tabbed interface:
+
+```vue-html
+
+ See the Pen + Dynamic components: without keep-alive by Vue (@Vue) + on CodePen. +
+ + +You'll notice that if you select a post, switch to the _Archive_ tab, then switch back to _Posts_, it's no longer showing the post you selected. That's because each time you switch to a new tab, Vue creates a new instance of the `currentTabComponent`. + +Recreating dynamic components is normally useful behavior, but in this case, we'd really like those tab component instances to be cached once they're created for the first time. To solve this problem, we can wrap our dynamic component with a `+ See the Pen + Dynamic components: with keep-alive by Vue (@Vue) + on CodePen. +
+ + +Now the _Posts_ tab maintains its state (the selected post) even when it's not rendered. + +Check out more details on `