如何利用 Vue 的生命周期钩子进行初始化和清理操作?

一、初始化操作的核心钩子

1. created(选项式API)

export default {
  data() {
    return { user: null };
  },
  created() {
    // 适合初始化数据、发起非DOM操作请求
    this.fetchUser();
  },
  methods: {
    async fetchUser() {
      const response = await fetch('/api/user');
      this.user = await response.json();
    }
  }
};

2. onMounted(组合式API)

import { onMounted, ref } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const element = ref(null);

    onMounted(() => {
      // DOM已挂载,可安全操作
      element.value = document.getElementById('counter');
      element.value.addEventListener('click', increment);
    });

    function increment() {
      count.value++;
    }

    // 必须返回响应式数据
    return { count };
  }
};
二、清理操作的核心钩子

1. beforeUnmount(组合式API)

import { onBeforeUnmount } from 'vue';

export default {
  setup() {
    let timer = null;

    onBeforeUnmount(() => {
      // 组件销毁前清理资源
      clearInterval(timer);
      timer = null;
    });

    // 其他逻辑...
  }
};

2. unmounted(选项式API)

export default {
  data() {
    return { socket: null };
  },
  created() {
    this.socket = new WebSocket('ws://example.com');
  },
  unmounted() {
    // 确保WebSocket连接关闭
    if (this.socket) {
      this.socket.close();
    }
  }
};
三、组合式API与选项式API的生命周期映射
阶段选项式API组合式API
初始化createdsetup
挂载前beforeMountonBeforeMount
挂载后mountedonMounted
更新前beforeUpdateonBeforeUpdate
更新后updatedonUpdated
销毁前beforeDestroy/unmountedonBeforeUnmount/onUnmounted
销毁后destroyed已被移除
四、日常开发建议

1. 数据请求策略

// 推荐:created中发起请求,避免阻塞渲染
created() {
  this.loadData();
},
methods: {
  async loadData() {
    try {
      this.data = await fetchData();
    } catch (error) {
      console.error('数据加载失败:', error);
    }
  }
}

2. DOM操作规范

// 错误示例:在created中操作未挂载的DOM
created() {
  this.$refs.container.style.color = 'red'; // this.$refs为null
}

// 正确示例:在mounted中操作
mounted() {
  this.$refs.container.style.color = 'red';
}

3. 资源清理守则

// 必须成对出现:添加/移除事件监听
mounted() {
  window.addEventListener('resize', this.handleResize);
},
beforeUnmount() {
  window.removeEventListener('resize', this.handleResize);
}
五、实战注意事项

1. 父子组件生命周期顺序

父 beforeMount -> 子 beforeMount -> 子 mounted -> 父 mounted
父 beforeUnmount -> 子 beforeUnmount -> 子 unmounted -> 父 unmounted

2. 异步操作处理

// 错误示例:未处理异步清理
onMounted(() => {
  this.timer = setInterval(() => {}, 1000);
});

// 正确示例:使用异步清理
onMounted(async () => {
  const data = await longRunningTask();
  this.data = data;
  this.cleanup = () => clearInterval(this.timer);
});

onBeforeUnmount(() => {
  if (this.cleanup) this.cleanup();
});

3. 服务端渲染(SSR)兼容

// 避免在beforeMount中执行DOM操作
onBeforeMount(() => {
  if (typeof window !== 'undefined') {
    // 仅在客户端执行
    this.initChart();
  }
});
六、典型错误案例分析

1. 忘记清理定时器

mounted() {
  this.timer = setInterval(() => {}, 1000); // ❌ 未清理
}

2. 在beforeDestroy中执行复杂计算

beforeDestroy() {
  // ❌ 阻塞销毁流程
  this.heavyComputation();
}
七、最佳实践总结
  1. 初始化顺序:created(数据)→ mounted(DOM)
  2. 清理原则:谁创建谁销毁,成对出现
  3. 性能优化:避免在mounted中进行重计算
  4. 错误边界:使用errorCaptured钩子捕获子组件错误
  5. 状态管理:结合Vuex/Pinia时,优先在created中初始化状态

通过合理运用生命周期钩子,开发者可以实现组件生命周期的精细控制。在实际开发中,建议结合TypeScript的类型系统增强生命周期钩子的类型安全,并利用Vue Devtools进行生命周期调试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在nodejs中使用ElasticSearch(一)安装,使用

使用docker安装ElasticSearch和Kibana 1)创建相应的data文件夹和子文件夹用来持久化ElasticSearch和kibana数据 2)提前创建好elasticsearch配置文件 data/elasticsearch/config/elasticsearch.yml文件 # Elasticsearch Configuration # # NOTE: Elas…

Jenkins整合Jmeter实现接口自动化测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、安装jmeter 下载:http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本,启动前修改j…

宇树科技13家核心零部件供应商梳理!

2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 Humanoid 100清单清单中…

PostgreSQL 与 MySQL 有哪些区别

PostgreSQL 和 MySQL 是两种流行的开源关系型数据库管理系统(RDBMS),它们在功能、性能、扩展性和适用场景等方面存在显著差异。 以下是 PostgreSQL 和 MySQL 的主要区别: 1. 架构与设计理念 PostgreSQL: 强调标准兼…

springboot整合 xxl-job

文章目录 一、xxl-job是什么二、使用步骤 1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功3. 配置执行器【在自己的springboot项目中配置】4. 在页面上创建执行器和任务,与项目中绑定 总结参考 一、xxl-job是什么 XXL-JOB 是一个分布式任务调…

conda、anaconda、pip、pytorch、tensorflow有什么区别?

先画一张图,可以大致看出它们的区别和关联: pytorch、tensorflow都是Python的第三方库,相当于封装的代码工具集库,通过import导入使用。这两个都是深度学习框架,用来搭建AI模型什么的,使用范围非常之广&…

java后端开发day18--学生管理系统

(以下内容全部来自上述课程) 1.业务分析并搭建主菜单 1.需求 采取控制台的方式去书写学生管理系统 2.分析 1.初始菜单 2.学生类 属性:id,姓名,年龄,家庭住址 3.添加功能 键盘录入每一个学生信息并添…

【设计模式精讲】结构型模式之代理模式(静态代理、JDK动态代理、cglib动态代理)

文章目录 第五章 结构型模式5.1 代理模式5.1.1 代理模式介绍5.1.2 代理模式原理5.1.3 静态代理实现5.1.4 JDK动态代理5.1.4.1 JDK动态代理实现5.1.4.2 类是如何动态生成的5.1.4.3 代理类的调用过程 5.1.5 cglib动态代理5.1.5.1 cglib动态代理实现5.1.5.2 cglib代理流程 5.1.6 代…

业务流程中的流程管理

流程管理是业务流程管理中至关重要的一环。它专注于规划、组织、指导、控制和优化组织内的各项业务流程,以提高效率、降低成本、提升质量和增强客户满意度。简单来说,流程管理就是管理你的业务是如何完成工作的。 下面将从几个方面详细讲解业务流程中的…

2025年股指期货和股指期权合约交割的通知!

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 2025年股指期货和股指期权合约交割的通知! 根据中国金融期货交易所规则及相关规定,以下股指期货和股指期权合约于指定日期进行交割,现将各合…

播放器系列1——总概述

播放器核心架构 模块解释 文件读取 读取视频文件、读取网络文件、读取音频文件,大概分为这三种,目前代码中仅实现了读取视频文件播放,也就是当没有video数据的时候播放器不可使用。 解复用 容器指的是多媒体文件中的封装格式,…

MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用

目录 1 大白话说一下文章内容2 作者的电脑配置3 DeepSeek的本地部署3.1 Ollamal的下载和安装3.2 选择合适的deepseek模型3.3 安转deepseek 4 DifyDeepSeek构建Al应用4.1 Dify的安装4.1.1 前置条件4.1.2 拉取代码4.1.3 启动Dify 4.2 Dify控制页面4.3 使用Dify实现个“文章标题生…

神经网络八股(三)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小,最终趋近于零,这会导致靠前层的神经网络层权重参数更新缓慢,甚至不更新,学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大,…

第3章 3.3日志 .NET Core日志 NLog使用教程

3.3.1 .NET Core日志基本使用 书中介绍了把日志输出到控制台的使用方式: 安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console 日志记录代码: using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.…

Springboot的jak安装与配置教程

目录 Windows系统 macOS系统 Linux系统 Windows系统 下载JDK: 访问Oracle官网或其他JDK提供商网站,下载适合Windows系统的JDK版本。网站地址:Oracle 甲骨文中国 | 云应用和云平台点击进入下滑,点击进入下载根据自己的系统选择&…

Vue2是如何利用Object.defineProperty实现数据的双向绑定?

我们之前说道过Object.defineProperty方法有一关键特性,就是数据劫持,通过get/set 拦截属性的读取和修改操作。Vue主要是通过数据劫持结合发布-订阅模式来实现的,利用Object.defineProperty来劫持各个属性的setter和getter,在数据…

Transformer解析——(四)Decoder

本系列已完结,全部文章地址为: Transformer解析——(一)概述-CSDN博客 Transformer解析——(二)Attention注意力机制-CSDN博客 Transformer解析——(三)Encoder-CSDN博客 Transforme…

Vue前端开发-Vant之Layout组件

在Vant 中,Layout组件用于元素的响应式布局,分别由van-row和van-col两个组件来实现,前者表示行,后者被包裹在van-row组件中,表示列,共有24列栅格组成,在van-col组件中,span属性表示所…

【YOLOv8】损失函数

学习视频: yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失:BCE Loss 定位损失…

Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统

随着大语言模型的广泛应用,知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM(Large Language Model)大语言模型的知识库问答系统,支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…