13 vue3之内置组件keep-alive

内置组件keep-alive

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

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

初次进入时: onMounted> onActivated

退出后触发 onDeactivated

再次进入:

只会触发 onActivated

事件挂载的方法等,只执行一次的放在 onMounted中;组件每次进去执行的方法放在 onActivated

prors属性 includeexclude和max

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

:include="['A']" 只缓存A组件

:exclude="['A']" 不缓存A组件

max是保存活性最高的10个组件 采用的是LRU算法(双向链表 + 散列表 的方式实现

代码示例

父组件

javascript 复制代码
<template>
  <div class="">keep-alive用于数据缓存</div>
  <keep-alive>
    <A v-if="flag"></A>
    <B v-else></B>
  </keep-alive>
  <!--  
    prors属性:
    <keep-alive :include="" :exclude="" :max="10"></keep-alive>
    :include="['A']" 只缓存A组件
    :exclude="['A']" 不缓存A组件
    max是保存活性最高的10个组件 采用的是LRU算法(双向链表 + 散列表 的方式实现)
  -->
  <button @click="flag = !flag">切换组件</button>

  <!-- 必须是这样的写法 -->
  <!-- 基本 -->
  <keep-alive>
    <component :is="view"></component>
  </keep-alive>

  <!-- 多个条件判断的子组件 -->
  <keep-alive>
    <comp-a v-if="a > 1"></comp-a>
    <comp-b v-else></comp-b>
  </keep-alive>

  <!-- 和 `<transition>` 一起使用 -->
  <transition>
    <keep-alive>
      <component :is="view"></component>
    </keep-alive>
  </transition>

  <!-- 开启keep-alive 生命周期的变化

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

<script setup lang="ts">
import A from "./components/thirteen_A.vue";
import B from "./components/thirteen_B.vue";
import { ref, reactive } from "vue";

let flag = ref("true");
</script>

<style lang="less" scoped></style>

A B 组件

javascript 复制代码
<template>
  <div class="">
    A组件
    <input type="text" />
  </div>
</template>

<script setup lang="ts">
import {
  ref,
  reactive,
  onMounted,
  onUnmounted,
  onActivated,
  onDeactivated,
} from "vue";

onMounted(() => {
  console.log("onMounted初始化"); // 全局只走一次,一个接口只走一次
});
onActivated(() => {
  console.log("onActivated,keep-alive初始化"); //开启了keep-alive后,才增加的生命周期
});
onDeactivated(() => {
  console.log("onDeactivated, keep-alive卸载"); //开启了keep-alive后,才增加的生命周期
});
onUnmounted(() => {
  console.log("onUnmounted卸载"); // 开启了keep-alive后 这个生命周期就不会走
});
</script>

<style lang="less" scoped></style>
javascript 复制代码
<template>
  <div class="">
    B组件
    <input type="text" />
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
</script>

<style lang="less" scoped></style>

14 vue3之内置组件trastion系列-CSDN博客14 vue3之内置组件trastion系列。https://blog.csdn.net/qq_37550440/article/details/142387006?sharetype=blogdetail&sharerId=142387006&sharerefer=PC&sharesource=qq_37550440&spm=1011.2480.3001.8118

相关推荐
西凉河的葛三叔18 小时前
vue3+elementui-plus el-dialog全局配置点击空白处不关闭弹窗
前端·vue3·elementui-plus
xiaohuatu18 小时前
CSRF保护--laravel进阶篇
vue3·laravel·csrf
半度℃温热6 天前
ERROR TypeError: AutoImport is not a function
webpack·vue3·element-plus·插件版本·autoimport
朝阳397 天前
vue3 中直接使用 JSX ( lang=“tsx“ 的用法)
vue3·tsx·jsx
xcLeigh7 天前
VUE3实现简洁的特色美食网站源码
前端·源码·vue3
陈逸子风10 天前
(系列十一)Vue3框架中路由守卫及请求拦截(实现前后端交互)
vue3·webapi·权限·流程·表单
爱分享的Hayes小朋友11 天前
如何用post请求调用Server-Sent Events服务
前端·vue3·sse·post
Coisini_甜柚か13 天前
打字机效果显示
前端·vue3·antv
Modify_QmQ13 天前
初识Electron & 进程通信
electron·vue3·桌面端
Bessie23414 天前
实现 Nuxt3 预览PDF文件
pdf·vue3·nuxt3