【Vue3 生命周期与组合式API】

文章目录

  • 一、Vue3 生命周期概述
  • 二、Vue3 组合式API 与选项式API 的对比
    • 1. 选项式API 生命周期钩子函数
      • 常用的生命周期钩子函数包括:
    • 2. 组合式API 的优势
      • 组合式API 的主要优势包括:
      • 在生命周期管理上的优势
  • 三、Vue3 组合式API 生命周期钩子函数
    • 1. setup 函数
      • 特点和作用:
    • 2. onBeforeMount
      • 代码示例:
      • 使用场景:
    • 3. onMounted
      • 代码示例:
      • 使用场景:
    • 4. onBeforeUpdate
      • 代码示例:
      • 使用场景:
    • 5. onUpdated
      • 代码示例:
      • 使用场景:
    • 6. onBeforeUnmount
      • 代码示例:
      • 使用场景:
    • 7. onUnmounted
      • 代码示例:
      • 使用场景:
    • 8. 其他生命周期钩子函数
  • 四、生命周期钩子函数的应用实例
    • 示例1:数据加载和DOM操作
    • 示例2:资源清理
    • 示例3:依赖于props的异步操作

一、Vue3 生命周期概述

Vue3 的生命周期钩子函数可以帮助开发者在组件的不同阶段执行特定的逻辑,以便更好地管理和优化应用。

Vue的组件实例从创建到销毁会经历一系列的生命周期阶段,每个阶段都有相应的钩子函数,开发者可以利用这些钩子函数在组件的生命周期中的关键时刻注入自己的代码。

  1. 初始化阶段:在这个阶段,Vue会进行事件和生命周期的初始化。对于组合式 API,这个阶段主要与setup函数的调用相关。

  2. 模板编译阶段:将模板编译成渲染函数的阶段。这个阶段在使用组合式 API 时通常不需要直接操作。

  3. 挂载阶段:组件被挂载到 DOM 上。在组合式 API 中,对应的生命周期钩子函数是onBeforeMountonMounted

  4. 更新阶段:当组件的数据变化时,组件会重新渲染。在这个阶段,可以利用onBeforeUpdateonUpdated钩子函数执行特定逻辑。

  5. 卸载阶段:组件从 DOM 中移除。这个阶段的钩子函数是onBeforeUnmountonUnmounted

在 Vue3 的组合式 API 中,所有这些生命周期钩子函数都可以直接在setup函数中使用,这提供了一种更灵活、更函数式的方式来组织和复用组件逻辑。通过这种方式,Vue3 不仅保持了其响应式系统的核心优势,还在组件逻辑复用方面做出了革新。

二、Vue3 组合式API 与选项式API 的对比

Vue.js 提供了两种主要的API风格来编写组件:选项式 API 和组合式 API。

1. 选项式API 生命周期钩子函数

选项式 API 是 Vue2.x 引入的,Vue3 亦保留了这种风格。在选项式 API 中,组件的逻辑是通过一个包含各种属性的对象来组织的,其中包括数据、方法、生命周期钩子等。

常用的生命周期钩子函数包括:

  • beforeCreate:在实例初始化之后,数据观察和事件/侦听器配置之前被调用。
  • created:在实例创建完成后被立即调用,此时数据观察、属性和方法的运算、事件/侦听器的回调已经设置好了。
  • beforeMount:在挂载开始之前被调用,相关的 render 函数首次被调用。
  • mounted:在实例被挂载后调用,此时可以访问到 DOM。
  • beforeUpdate:在数据变化导致的虚拟DOM重新渲染和打补丁之前调用。
  • updated:在数据更改导致的虚拟DOM重新渲染和打补丁之后调用。
  • beforeUnmount(Vue3 新增):在卸载组件实例之前调用。
  • unmounted(Vue3 新增):在卸载组件实例之后调用。

这些生命周期钩子提供了在组件不同阶段执行代码的机会,让开发者可以有效地管理组件的状态和行为。

2. 组合式API 的优势

Vue3 引入了组合式 API 作为一个全新的编写组件的方式,旨在解决 Vue2.x 在组件复用和逻辑组织方面的一些限制。

组合式API 的主要优势包括:

  • 更好的逻辑组织和复用:组合式 API 通过 setup 函数和其他 Composition API 函数(如 reactive, computed, watch)允许开发者更自然地提取和重用逻辑代码,而不是将逻辑分散在选项式 API 的不同选项中。
  • 更清晰的代码结构:组合式 API 使得相关功能的代码更加集中,有助于提高代码的可读性和维护性。
  • 对 TypeScript 的更好支持:组合式 API 与 TypeScript 配合得更紧密,提供了更好的类型推导和类型检查,使得开发大型应用时代码更健壮。
  • 更细粒度的代码分割:通过使用组合式 API,开发者可以更灵活地控制组件的各个方面,比如状态的声明、副作用的执行等,从而更精细地优化组件的行为和性能。

在生命周期管理上的优势

组合式 API 中,生命周期钩子也被作为函数(如 onMounted, onUpdated)提供,可以直接在 setup 函数内部使用。这种方式使得生命周期钩子的调用更加直观和灵活,可以更紧密地与组件的其他逻辑结合,提高了代码的组织性和可读性。此外,它也让跨组件的逻辑复用变得更加简单,可以将生命周期钩子和相关逻辑一起封装和复用。

三、Vue3 组合式API 生命周期钩子函数

1. setup 函数

setup 函数是 Vue3 组合式 API 中最重要的一个新概念。它在组件创建之初就被调用,用于替代 Vue2 中的 data, computed, methods, watch, 以及生命周期钩子函数的部分功能。

特点和作用:

  • setup 函数执行时,组件的 props 和 context(包括 slots 和 emits)已经被初始化。
  • 该函数返回的对象中的属性和方法将被暴露给组件的模板。
  • setup 函数是响应式的,可以使用 reactive, ref 等 API 在其中创建和管理状态。

2. onBeforeMount

在组件被挂载到 DOM 之前调用。

代码示例:

import { onBeforeMount } from 'vue';

export default {
  setup() {
    onBeforeMount(() => {
      console.log('Component is about to be mounted!');
    });
  }
}

使用场景:

  • 初始化或配置 DOM 相关的操作前的准备工作。

3. onMounted

在组件被挂载到 DOM 之后调用。

代码示例:

import { onMounted } from 'vue';

export default {
  setup() {
    onMounted(() => {
      console.log('Component has been mounted!');
    });
  }
}

使用场景:

  • 访问或修改 DOM 元素。
  • 发送 AJAX 请求获取数据。

4. onBeforeUpdate

在组件更新之前调用。

代码示例:

import { onBeforeUpdate } from 'vue';

export default {
  setup() {
    onBeforeUpdate(() => {
      console.log('Component is about to update!');
    });
  }
}

使用场景:

  • 在组件更新前执行特定操作,如读取当前 DOM 状态。

5. onUpdated

在组件更新之后调用。

代码示例:

import { onUpdated } from 'vue';

export default {
  setup() {
    onUpdated(() => {
      console.log('Component has been updated!');
    });
  }
}

使用场景:

  • 更新完成后的 DOM 操作。
  • 更新完成后的清理工作。

6. onBeforeUnmount

在组件卸载之前调用。

代码示例:

import { onBeforeUnmount } from 'vue';

export default {
  setup() {
    onBeforeUnmount(() => {
      console.log('Component is about to be unmounted!');
    });
  }
}

使用场景:

  • 清理组件使用的资源,如事件监听器。

7. onUnmounted

在组件卸载之后调用。

代码示例:

import { onUnmounted } from 'vue';

export default {
  setup() {
    onUnmounted(() => {
      console.log('Component has been unmounted!');
    });
  }
}

使用场景:

  • 完成组件卸载后的最后清理工作。

8. 其他生命周期钩子函数

Vue3 还提供了其他一些生命周期钩子函数,用于特定场景:

  • onActivatedonDeactivated:用于 <keep-alive> 缓存的组件激活和停用。
  • onErrorCaptured:用于捕获组件树中所有子孙组件的错误。
  • onRenderTrackedonRenderTriggered:用于调试,追踪和触发渲染。

四、生命周期钩子函数的应用实例

示例1:数据加载和DOM操作

onMounted 钩子函数是获取数据的理想选择,它保证了组件已经被挂载,因此可以安全地访问到 DOM 元素或进行数据请求。

import { onMounted, ref } from 'vue';
import axios from 'axios';

export default {
  setup() {
    const posts = ref([]);

    onMounted(async () => {
      try {
        const response = await axios.get('https://api.example.com/posts');
        posts.value = response.data;
      } catch (error) {
        console.error('Failed to fetch posts:', error);
      }
    });

    return { posts };
  }
}

使用 onMounted 钩子函数发送 AJAX 请求获取数据,并将数据存储在响应式的 posts 变量中。

示例2:资源清理

在组件中注册事件监听器或定时器时,很重要的一点是在组件卸载前清理这些资源,以避免内存泄漏。这可以通过 onUnmounted 钩子函数来实现。

import { onMounted, onUnmounted, ref } from 'vue';

export default {
  setup() {
    const isConnected = ref(false);

    const connect = () => {
      // 假设这是连接到某个服务的函数
      isConnected.value = true;
    };

    const disconnect = () => {
      // 断开连接
      isConnected.value = false;
    };

    onMounted(() => {
      connect();
      // 假设我们监听 window 的 resize 事件
      window.addEventListener('resize', connect);
    });

    onUnmounted(() => {
      disconnect();
      window.removeEventListener('resize', connect);
    });

    return { isConnected };
  }
}

在这个示例中,onMounted 用于注册事件监听器和初始化连接,而 onUnmounted 用于在组件销毁时移除事件监听器和清理资源。

示例3:依赖于props的异步操作

有时需要在组件中根据 props 的变化来执行异步操作,例如根据从父组件传入的用户ID获取用户信息。这种场景下可以使用 watchonMounted 钩子函数结合使用。

import { watch, onMounted, ref } from 'vue';
import axios from 'axios';

export default {
  props: {
    userId: Number
  },
  setup(props) {
    const userInfo = ref(null);

    const fetchUserInfo = async (id) => {
      try {
        const response = await axios.get(`https://api.example.com/users/${id}`);
        userInfo.value = response.data;
      } catch (error) {
        console.error('Failed to fetch user info:', error);
      }
    };

    onMounted(() => fetchUserInfo(props.userId));

    watch(() => props.userId, (newId) => {
      fetchUserInfo(newId);
    });

    return { userInfo };
  }
}

这个示例展示了如何在组件被挂载时以及 userId prop 更改时重新获取用户信息。这种方式确保了即使 userId 在组件生命周期内发生变化,用户信息也能保持最新。

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

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

相关文章

一文2500字Robot Framework自动化测试框架超强教程

1、Robot Framework简介 Robot Framework是一个基于Python的可扩展关键字驱动的自动化框架&#xff0c;用于验收测试&#xff0c;验收测试驱动开发&#xff08;ATDD&#xff09;&#xff0c;行为驱动开发&#xff08;BDD&#xff09;和机器人流程自动化&#xff08;RPA&#xf…

SqlException 口令已经失效

Orcle密码过期了 //查看过期时间 SELECT * FROM dba_profiles s WHERE s.profileDEFAULT AND resource_namePASSWORD_LIFE_TIME;//修改过期时间 alter PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

Debian是什么?有哪些常用命令

目录 一、Debian是什么&#xff1f; 二、Debian常用命令 三、Debian和CentOS的区别 四、Debian和CentOS的优缺点 五、Debian和CentOS的运用场景 一、Debian是什么&#xff1f; Debian是一种流行的开源Linux操作系统。 Debian是一个以Linux内核为基础的操…

轻松上手的LangChain学习说明书

一、Langchain是什么&#xff1f; 如今各类AI模型层出不穷&#xff0c;百花齐放&#xff0c;大佬们开发的速度永远遥遥领先于学习者的学习速度。。为了解放生产力&#xff0c;不让应用层开发人员受限于各语言模型的生产部署中…LangChain横空出世界。 Langchain可以说是现阶段…

强化学习:时序差分法【Temporal Difference Methods】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

硬盘遭遇误删分区?这些恢复技巧你必须掌握!

在日常使用电脑的过程中&#xff0c;我们有时会遇到一些棘手的问题&#xff0c;其中误删分区无疑是一个令人头疼的难题。误删分区意味着我们不小心删除了硬盘上的某个分区&#xff0c;导致该分区内的所有数据瞬间消失。对于许多用户来说&#xff0c;这可能会引发极大的恐慌和焦…

模拟电路设计与分析

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 计算机工作原理存储单元 计算机工作原理 计算机最底层语言是二进制&#xff0c;和我们生活中使用的阿拉伯数字是十进制数&#x…

【算法】滑动窗口——长度最小的子数组

本篇文章是用一个实例来介绍常用算法之一“滑动窗口”的相关概念&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解2.1暴力求解思路&#xff1a;2.2时间复杂度是多少&#xff1f; 3.暴力求解的优化3.1固定left的情况下&#xff0c;优化right的次数。3.2sum求值优化3.3不同组…

2.5W字 一文读懂汽车智能座舱的FLASH 存储市场、技术

吃瓜群众&#xff1a;机哥&#xff0c;存储是什么玩意&#xff0c;我买手机、电脑的时候导购员都说买内存大的&#xff0c;三星的好&#xff0c;品牌大&#xff0c;问题少&#xff0c;我也只有看哪个内存大就买那个。 机哥&#xff1a;额&#xff0c;这个嘛&#xff0c;说来话长…

设计模式之建造者模式BuilderPattern(七)

一、建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 二、代码实例 1、OrderItem类 Data&#xff1a;这是Lombok中提供的Ge…

淡茶和浓茶的标准

按照《品深淡茶冲泡标准》&#xff0c;淡茶茶汤中的咖啡碱不得高于31.67mg/100mL&#xff0c;可可碱不得高于2.67mg/mL&#xff0c;茶碱不得高于1.50mg/100mL&#xff0c;茶多酚不得高于143mg/mL&#xff0c;按照各类茶叶中各物质的含量情况&#xff0c;茶水比例不得高于1:150&…

一个JDBC小工具

pom.xml 结构 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mysql5>5.1.44<…

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…

文心一言 VS 讯飞星火 VS chatgpt (253)-- 算法导论18.2 6题

六、假设 B-TREE-SEARCH 的实现是在每个结点内采用二分查找&#xff0c;而不是线性查找。证明&#xff1a;无论怎样选择 t ( t 为 n 的函数)&#xff0c;这种实现所需的 CPU 时间都为 O(lgn)。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;我…

tkinter/python:第一个GUI程序——制作一个数据录入界面

下图是在网上搜寻的一个案例图样&#xff0c;经过了调整修改&#xff0c;登录时界面图如下&#xff1a; 登录后点击百货店铺按钮&#xff0c;界面如下 一、创建root窗口&#xff1a; geometry接收一个字符串&#xff0c;也就是需要建立的窗口尺寸和位置&#xff0c;geometry(…

【Osek网络管理测试】[TG3_TC6]等待总线睡眠状态_2

&#x1f64b;‍♂️ 【Osek网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件&#xff1a;VN1630 软件&#xff1a;CANoe 2.测试目的 验证DUT在满足进入等待睡眠状态的条件时是否进入该状态 …

Vue 基础语法

【1】模板语法 &#xff08;1&#xff09;差值表达式 {{}}是 Vue.js 中的文本插值表达式。 它用于在模板中输出数据或表达式的值。当数据或表达式的值发生变化时&#xff0c;插值表达式会自动更新。 补充&#xff1a;三目运算符 它的基本语法是 Condition ? A : B&#xff0…

解密SSL/TLS:密码套件扫描仪的深度解析(C/C++代码实现)

解密SSL/TLS流量通常是为了分析和审计加密通信&#xff0c;以确保数据传输的安全性和合规性。密码套件扫描仪是实现这一目的的一种工具&#xff0c;它可以提供关于SSL/TLS配置的详细信息&#xff0c;帮助安全专家评估潜在的风险。 SSL/TLS协议基础 SSL/TLS协议是网络安全中不…

Redis探索之旅(基础)

目录 今日良言&#xff1a;满怀憧憬&#xff0c;阔步向前 一、基础命令 1.1 通用命令 1.2 五大基本类型的命令 1.2.1 String 1.2.2 Hash 1.2.3 List 1.2.4 Set 1.2.5 Zset 二、过期策略以及单线程模型 2.1 过期策略 2.2 单线程模型 2.3 Redis 效率为什么这么高 三…

AI人才争夺战,华尔街入局:豪掷百万美元年薪抢人 | 最新快讯

量子位公众号 QbitAI 继硅谷之后&#xff0c;华尔街也入局“AI 人才争夺大战”。 他们的目标非常明确——抢的就是高精尖的 AI 专家。 △图源&#xff1a;Business Insider 现在这条“街”上&#xff0c;不论是银行、对冲基金还是私募股权公司都已纷纷下场&#xff0c;可谓是豪…