在 VueJS 中使用 Keep-Alive 处理窗口调整事件(在使用keep-alive缓存组件时,处理多个vue页面的resize事件)

news2024/9/17 9:27:55

前言

我们在使用 VueJS 开发复杂的单页应用程序时,我们经常需要管理组件的生命周期事件,以确保它们在特定的条件下正常工作。例如,当窗口大小调整时,我们可能需要重新绘制某些组件。这里我们详细介绍一下,如何在使用 keep-alive 包裹的组件中正确管理 resize 事件监听器。简单记录一下
 


一. 基本概念

1. 场景介绍

在 VueJS 中,组件的生命周期钩子允许我们在组件的特定阶段执行代码。常见的生命周期钩子包括 mounted、beforeDestroy 等。然而,当我们使用 keep-alive 包裹组件时,这些组件不会真正被销毁和重新创建,而是被缓存和重新激活。这就引入了两个新的生命周期钩子:activated 和 deactivated。

这里看下组件实例全部的生命周期函数,官方提供了(3个大类)共11个:

1. 创建阶段的四个: 
> beforeCreate:         实例创建之前。 
> created:                  实例创建之后。 
> beforeMount:          组件挂载之前。 
> mounted:                组件挂载之后。

2. 运行阶段的两个: 
> beforeUpdate:        数据改变,视图更新之前。
> updated:                 试图更新之后。 销毁阶段的两个: 
> beforeDestroy:       实例销毁之前。 
> destroyed:              实例销毁之后。


3. 其它三个:
> activated                                 被 keep-alive 缓存的组件激活时调用。
> deactivated                             被 keep-alive 缓存的组件停用时调用。
> errorCaptured 2.5.0+              新增当捕获一个来自子孙组件的错误时被调用

2. 具体场景

假设我们有多个组件需要在窗口大小调整时重新绘制。为了避免每个组件都监听 resize 事件,我们需要确保只有当前激活的组件响应该事件。这就需要我们在组件激活时添加事件监听器,在组件停用时移除监听器。以下是实现这一功能的详细步骤和代码示例。


二. 代码结构

1. 父组件结构

这里我们有一个父组件,它使用 <keep-alive> 包裹了多个子组件。

<template>
  <div class="anomalous_index">
    <transition name="" mode="" appear>
      <keep-alive>
        <anomal_1 v-if="twoContent === '异常1' && oneNavStatus === '异常事件'"/>
        <anomal_2 v-if="twoContent === '异常2' && oneNavStatus === '异常事件'"/>
        <anomal_3 v-if="twoContent === '异常3' && oneNavStatus === '异常事件'"/>
        <!-- 其他组件类似 -->
      </keep-alive>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      twoContent: '',
      oneNavStatus: ''
    };
  }
};
</script>

2. 子组件结构

以 anomal_1 组件为例,我们在其中管理 resize 事件监听器。

<template>
  <div>
    <!-- 异常1的内容 -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 存储 handleResize 事件处理程序的引用
      handleResize: null
    };
  },
  mounted() {
    // 在组件挂载时定义 handleResize 函数
    this.handleResize = this.$debounce(() => {
      console.log("anomal_1 resize event");
      this.initCanvas();
      this.getImage();
    }, 2000);
    // 添加 resize 事件监听器
    window.addEventListener("resize", this.handleResize);
  },
  activated() {
    // 在组件激活时重新添加 resize 事件监听器
    window.addEventListener("resize", this.handleResize);
  },
  deactivated() {
    // 在组件停用时移除 resize 事件监听器
    window.removeEventListener("resize", this.handleResize);
  },
  beforeDestroy() {
    // 在组件销毁前移除 resize 事件监听器
    window.removeEventListener("resize", this.handleResize);
  },
  methods: {
    initCanvas() {
      // 初始化画布的函数
    },
    getImage() {
      // 获取图片的函数
    }
  }
};
</script>
  •     这里不能使用 beforeDestroy 和 destroyed ,因为 beforeDestroy 钩子在 Vue  组件实例即将销毁之前触发,而destroyed实例销毁之后触发。
  •     当使用 keep-alive 包裹组件时,组件在切换时并不会真正销毁,而是会被缓存,因此beforeDestroy 钩子不会触发。这时可以使用 activated 和 deactivated 生命周期钩子来管理组件的事件监听器。


三. 应用总结


1. 事件处理程序的定义:

我们在 mounted 钩子中定义 handleResize 函数。this.$debounce 用于防抖处理,以减少频繁调用。

防抖应用,请看:

防抖函数的实际应用icon-default.png?t=N7T8https://blog.csdn.net/weixin_65793170/article/details/137824500?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172242376316800182136521%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=172242376316800182136521&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-137824500-null-null.nonecase&utm_term=%E9%98%B2%E6%8A%96&spm=1018.2226.3001.4450


2. 事件监听器的管理:

  • 在 mounted 钩子中添加 resize 事件监听器。
  • 在 activated 钩子中重新添加 resize 事件监听器,确保组件被激活时可以响应事件。
  • 在 deactivated 钩子中移除 resize 事件监听器,避免组件停用时仍然响应事件。
  • 在 beforeDestroy 钩子中移除 resize 事件监听器,确保组件销毁时不会留下无效的监听器。

3. 文章小结

通过正确管理 VueJS 组件的生命周期钩子,特别是在使用 <keep-alive> 时,我们可以确保只有当前激活的组件响应 resize 事件。这种方法不仅提高了应用的性能,还减少了不必要的事件处理。

创作不易,感觉有用,就一键三连,感谢(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1963858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装docker-东方通tongRDS

首先&#xff0c;确保你的系统已经安装了Docker。你可以在终端中运行以下命令来检查Docker是否已经安装&#xff1a; docker --version接下来&#xff0c;你需要从Docker hub上拉取东方通tongRDS的镜像。在终端中运行以下命令&#xff1a; docker pull dongfangtongrds/tongr…

Unity Camera

课程目标 1. 了解摄像机&#xff08;camera&#xff09;不同视角的设计与实现&#xff1b;2. 感受在不同摄像机视角下观察虚拟场景。 喜欢玩游戏或者看3D动漫的朋友可以回忆在虚拟场景中摄像头的运动变化带来的视觉感受&#xff0c;例如&#xff1a;摄像头给场景中的主角来个…

创客项目秀|基于XIAO SAMD21的多功能笔筒

作者&#xff1a;Arnov Sharma 来自&#xff1a;MIT 发表日期&#xff1a; 2024年6月17日 这个多功能笔筒项目是使用3D打印零件进行搭建的&#xff0c;在笔筒的前端添加了XIAO扩展板&#xff0c;给这个笔筒添加一个显示器&#xff0c;可以在显示器上显示许多内容&#xff0c…

【Devops】CertD 完全免费、自动申请、自动部署SSL证书一站式管理工具 | 自动化HTTPS | 3个月SSL自动轮换

CertD CertD 是一个免费全自动申请和自动部署更新SSL证书的工具。 后缀D取自linux守护进程的命名风格&#xff0c;意为证书守护进程。 关键字&#xff1a;证书自动申请、证书自动更新、证书自动续期、证书自动续签 一、特性 本项目不仅支持证书申请过程自动化&#xff0c;还…

P2048 [NOI2010] 超级钢琴(纪念紫题)

原题 题面 具体实现讲解 首先想到用 s u m sum sum记录 a a a数组的前缀和&#xff0c;把每种和弦都试一遍&#xff0c;很明显会超时。 定义 c a l ( s , l , r ) cal(s,l,r) cal(s,l,r)代表以 s s s为左端点&#xff0c;右端点在 l l l到 r r r的范围内&#xff0c;能得到的…

css:grid的使用(部分)

一&#xff1a;grid的使用&#xff08; 平分宽度 &#xff09; <template><view class""><view class"main"><view class"main-item">1</view><view class"main-item">2</view><view cl…

Can ‘t connect to local MySQL server through socket ‘/tmp/mysql.sock ‘(2) “;

Can t connect to local MySQL server through socket /tmp/mysql.sock (2) "; 目录 Can t connect to local MySQL server through socket /tmp/mysql.sock (2) "; 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到…

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程)

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3&#xff08;含分析过程&#xff09; 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3&#x…

118页|2023大模型落地应用案例集

大语言模型开放平台旨在为大语言模型技术的研究和应用提供一个开放、可扩展、可协作的环境。该平台不仅为开发者提供大型语言模型、大规模数据集、模型微调工具以及大型语言模型应用开发工具等资源&#xff0c;还加速了大型语言模型的训练过程&#xff0c;促进了大型语言模型在…

论文复现丨带时间窗和服务顺序的多车辆路径问题:联合优化遗传算法

路径优化系列文章&#xff1a; 1、路径优化历史文章2、路径优化丨带时间窗和载重约束的CVRPTW问题-改进遗传算法&#xff1a;算例RC1083、路径优化丨带时间窗和载重约束的CVRPTW问题-改进和声搜索算法&#xff1a;算例RC1084、路径优化丨复现论文-网约拼车出行的乘客车辆匹配及…

Linux命令行 复制模式/扩展模式 调用系统功能切换

问题背景 公司软件需要从window 适配国产操作系统&#xff0c;目前使用wine方案。在我们软件有个切换屏幕模式的功能&#xff0c;需要支持用户在我们软件内&#xff0c;切换复制模式/扩展模式。 在linux 下 uos/deepin 等系统。如果要从复制模式设置为扩展模式使用命令行时&a…

零基础入门转录组数据分析——机器学习算法之SVM-RFE(筛选特征基因)

零基础入门转录组数据分析——机器学习算法之SVM-RFE&#xff08;筛选特征基因&#xff09; 目录 零基础入门转录组数据分析——机器学习算法之SVM-RFE&#xff08;筛选特征基因&#xff09;1. SVM-RFE基础知识2. SVM-RFE&#xff08;Rstudio&#xff09;——代码实操2. 1 数据…

从零到一:用Go语言构建你的第一个Web服务

使用Go语言从零开始搭建一个Web服务&#xff0c;包括环境搭建、路由处理、中间件使用、JSON和表单数据处理等关键步骤&#xff0c;提供丰富的代码示例。 关注TechLead&#xff0c;复旦博士&#xff0c;分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

Day12--Servlet实现前后端交互(案例:学生信息管理系统登录页面)

&#xff08;在一个完整的项目架构中&#xff0c;servlet的角色和位置&#xff09; Servlet、GenericServlet和HttpServlet三者之间的关系是Java Web开发中的一个重要概念&#xff0c;它们共同构成了基于Java的服务器端程序的基础。以下是具体分析&#xff1a; 1. Servlet接口…

Windows下nmap命令及Zenmap工具的使用方法

一、Nmap简介 nmap是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端&#xff0c;并且推断计算机运行哪个操作系统&#xff08;这是亦称 fingerprinting&#xff09;。它是网络管理员必用的软件之一&#xff0c;以及用以评…

算法-DFS-树形DP

题目一 解题思路 比较标准的深搜&#xff0c;难点主要在题目的理解&#xff0c;通俗的说就是要找到一个树结构中的点&#xff0c;使之在去掉该点后剩余数的结构最均等&#xff08;剩余连接节点的最大值最小&#xff09;。 无向图邻接表 使用代码实现需要一个数组存储数值、一…

速看!2024年5月软考通过率解析

根据湖南省工业和信息化厅最新发布的《2024年上半年软考湖南考区工作总结报告》及《考试安全顺利完成的通报》&#xff0c;我们了解到湖南地区在2024年上半年度的软件与信息技术专业人才考试&#xff08;简称“软考”&#xff09;中&#xff0c;报名人数达到了13,762人&#xf…

无人机1公里WiFi图传遥控模组,飞睿智能无延迟传输方案,高效稳定告别卡顿

在信息众多的时代&#xff0c;我们享受着科技带来的便利&#xff0c;同时也期待着更多前沿技术的出现。今天&#xff0c;就让我们一起走进一个充满神秘与可能性的领域——飞睿智能1公里WiFi图传遥控模组。这个看似简单的设备&#xff0c;却蕴含着巨大的能量&#xff0c;它正在悄…

深度学习-感知机

目录 感知机训练感知机感知机模型感知机学习算法 收敛定理XOR问题总结 多层感知机学习XOR隐藏层单隐藏层---单分类激活函数Sigmoid激活函数Tanh 激活函数ReLU 激活函数 多类分类---单隐藏层多类分类---多隐藏层总结 多层感知机从零开始多层感知机的简洁实现总结 感知机 给定输…