1、内置组件keep-alive

有时候我们不希望组件被重新渲染影响使用体验;
或者处于性能考虑,避免多次重复渲染降低性能。
而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。

2、开启keep-alive 生命周期的变化

初次进入时: onMounted> onActivated
退出后触发 deactivated
再次进入:只会触发 onActivated
事件挂载的方法等,只执行一次的放在 onMounted中;
组件每次进去执行的方法放在 onActivated中。

  1. <!-- 基本 -->
  2. <keep-alive>
  3. <component :is="view"></component>
  4. </keep-alive>
  5. <!-- 多个条件判断的子组件 -->
  6. <keep-alive>
  7. <comp-a v-if="a > 1"></comp-a>
  8. <comp-b v-else></comp-b>
  9. </keep-alive>
  10. <!-- `<transition>` 一起使用 -->
  11. <transition>
  12. <keep-alive>
  13. <component :is="view"></component>
  14. </keep-alive>
  15. </transition>


3、include 和 exclude

include 和 exclude prop 允许组件有条件地缓存。
二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。

  1. <keep-alive :include="" :exclude="" :max=""></keep-alive>

4、max

  1. <keep-alive :max="10">
  2. <component :is="view"></component>
  3. </keep-alive>

Login.vue

  1. <template>
  2. <div>
  3. <table>
  4. <tr>
  5. <td>账号</td>
  6. <td>
  7. <input v-model="loginForm.username" type="text" />
  8. </td>
  9. </tr>
  10. <tr>
  11. <td>密码</td>
  12. <td>
  13. <input v-model="loginForm.password" type="password" />
  14. </td>
  15. </tr>
  16. </table>
  17. <button @click="submit">登录</button>
  18. </div>
  19. </template>
  20. <script setup lang="ts">
  21. import { ref,reactive } from 'vue';
  22. const loginForm = reactive({
  23. username:'',
  24. psd:'',
  25. })
  26. const submit = ()=>{
  27. console.log('登录')
  28. }
  29. </script>

Register.vue

  1. <template>
  2. <div>
  3. <table>
  4. <tr>
  5. <td>账号</td>
  6. <td>
  7. <input v-model="loginForm.username" type="text"/>
  8. </td>
  9. </tr>
  10. <tr>
  11. <td>密码</td>
  12. <td>
  13. <input v-model="loginForm.password" type="password"/>
  14. </td>
  15. </tr>
  16. <tr>
  17. <td>验证码</td>
  18. <td>
  19. <input v-model="loginForm.code" type="text"/>
  20. </td>
  21. </tr>
  22. </table>
  23. <button @click="submit">注册</button>
  24. </div>
  25. </template>
  26. <script setup lang="ts">
  27. import { ref, reactive } from 'vue';
  28. const loginForm = reactive({
  29. username:'',
  30. psd:'',
  31. code:""
  32. })
  33. const submit = ()=>{
  34. console.log('注册')
  35. }
  36. </script>

App.vue

  1. <script setup lang="ts">
  2. import { ref } from 'vue'
  3. import Login from './components/login/Login.vue'
  4. import Register from './components/register/Register.vue'
  5. const flag = ref(false)
  6. const switchCom = ()=>{
  7. flag.value = !flag.value
  8. }
  9. </script>
  10. <template>
  11. <div>
  12. <button @click="switchCom">切换</button>
  13. <keep-alive>
  14. <Login v-if="flag"></Login>
  15. <Register v-else></Register>
  16. </keep-alive>
  17. </div>
  18. </template>

image.png

image.png