基本使用

当我们在一个多标签的界面中,在不同组件之间进行动态切换是非常有用的。
示例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <script src="../src/vue.js"></script>
  8. </head>
  9. <body>
  10. <section id="app">
  11. <button v-for='page in pages' :key='page.id' @click='pagesActive = page.cmp'>{{page.name}}</button>
  12. <component :is='pagesActive'></component>
  13. </section>
  14. <script>
  15. Vue.component('base-post', {
  16. data(){
  17. return{
  18. posts:[
  19. { title: "标题1", content: { template: `<div>内容1</div>`}, id: 11},
  20. { title: "标题2", content: { template: `<div>内容2</div>`}, id: 12},
  21. { title: "标题3", content: { template: `<div>内容3</div>`}, id: 13},
  22. ],
  23. postsActive:'',
  24. }
  25. },
  26. created(){
  27. this.postsActive = this.posts[0].content
  28. },
  29. template: `
  30. <div>
  31. <button v-for='post in posts' :key='post.id' @click='postsActive = post.content'>{{ post.title}}</button>
  32. <component :is='postsActive'></component>
  33. </div>
  34. `
  35. })
  36. Vue.component('base-more', {
  37. template: `
  38. <div>更多</div>
  39. `
  40. })
  41. const vm = new Vue({
  42. el: "#app",
  43. data: {
  44. pages: [{
  45. name: '博客',
  46. cmp: 'base-post',
  47. id: 0
  48. },
  49. {
  50. name: '更多',
  51. cmp: 'base-more',
  52. id: 1
  53. }
  54. ],
  55. pagesActive:'base-post'
  56. }
  57. });
  58. </script>
  59. </body>
  60. </html>

效果图
QQ录屏20210222163223.gif
通过上面方法,我们可以实现组件间的切换,能够注意到的是:每一次切换标签时,都会创建一个新的组件实例,重新创建动态组件在更多情况下是非常有用的,但是在这个案例中,我们会更希望哪些标签的组件实例能够在它们第一次被创建的时候缓存下来。为了解决这个问题,我们可以用一个<keep-alive>元素将动态组件包裹起来。如:

  1. <keep-alive>
  2. <component :is='pagesActive'></component>
  3. </keep-alive>

注意:<keep-alive> 要求被切换到的组件都有自己的名字,不论是通过组件的 name 选项还是局部/全局注册。
效果如下
QQ录屏20210222162623.gif
使用啦 keep-alive 后你会效果图中,博客与更多按钮直接的切换不会让博客按钮恢复到初始状态,博客按钮下的初始状态为输出标题1的内容,但是我点击标题三后再让博客与更多两个按钮切换选中效果后回到博客按钮的触发的效果,你会发现它展示的标题三的内容