vue3生命周期源码详解

在这里插入图片描述

钩子函数的特点

Vue 生命周期钩子函数是在组件生命周期中执行的特定函数。

这些钩子函数允许你在组件不同的生命周期阶段插入自定义的逻辑代码。

Vue 提供了一组预定义的生命周期钩子函数,每个钩子函数在组件生命周期的不同阶段被调用。

源码中如何注册、实现钩子函数?

代码示例

const onBeforeMount = createHook('bm' /* BEFORE_MOUNT */)
const onMounted = createHook('m' /* MOUNTED */)
const onBeforeUpdate = createHook('bu' /* BEFORE_UPDATE */)
const onUpdated = createHook('u' /* UPDATED */)
const onBeforeUnmount = createHook('bum' /* BEFORE_UNMOUNT */)
const onUnmounted = createHook('um' /* UNMOUNTED */)
const onRenderTriggered = createHook('rtg' /* RENDER_TRIGGERED */)
const onRenderTracked = createHook('rtc' /* RENDER_TRACKED */)
const onErrorCaptured = (hook, target = currentInstance) => {injectHook('ec' /* ERROR_CAPTURED */, hook, target)
}

除去onErrorCaptured其他的钩子函数都是直接调用createHook。

createHook方法源码解析

createHook对injectHook进行封装。

 const createHook = function(lifecycle)  {return function (hook, target = currentInstance) {injectHook(lifecycle, hook, target)}
}

柯里化的封装过程带来的优势

  1. 提高函数的复用性:可以将原本接收多个参数的函数转变为接收部分参数的函数。这样,我们可以复用具有相同生命周期的钩子函数的逻辑,只需传入不同的目标实例即可。这种封装方式使得代码更加灵活,易于扩展和维护。

  2. 简化函数调用:可以将原本需要在调用时传递的参数提前传入并固定,从而简化函数调用。在这个例子中,createHook 函数返回的函数只需要传递 hook 和可选的 target 参数即可,无需再重复传递 lifecycle 参数。

  3. 隐藏实现细节:可以隐藏一些实现细节,使得函数调用更加简洁,同时也减少了外部对内部函数的直接访问。这种封装方式可以提高代码的可维护性和安全性

injectHook方法源码解析

function injectHook(type, hook, target = currentInstance, prepend = false) {// 从目标组件实例中获取相应的钩子函数数组const hooks = target[type] || (target[type] = [])// 封装传入的钩子函数,用于添加实例检查、错误处理等逻辑const wrappedHook = hook.__weh || (hook.__weh = (...args) => {// 检查目标组件是否已卸载if (target.isUnmounted) {return}// 停止依赖收集,避免执行钩子时产生副作用pauseTracking()// 设置当前运行组件实例为目标实例  setCurrentInstance(target)// 调用传入的钩子函数const res = callWithAsyncErrorHandling(hook, target, type, args)// 重置当前组件实例setCurrentInstance(null)// 恢复依赖收集resetTracking()return res})// 根据传入的参数将封装后的钩子推入数组前或后if (prepend) {hooks.unshift(wrappedHook) } else {hooks.push(wrappedHook)}
}

这样的设计非常易于理解,因为生命周期的钩子函数在组件的不同阶段执行,所以这些钩子函数需要保存在当前组件实例上。

这样,后续就可以通过不同的字符串键查找对应的钩子函数数组,并执行相应的逻辑。

举例onBeforeMount 和 onMounted

onBeforeMount 注册的 beforeMount 钩子函数会在组件挂载之前执行,onMounted 注册的 mounted钩子函数会在组件挂载之后执行。

const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, isSVG, optimized) => {// 创建响应式的副作用渲染函数instance.update = effect(function componentEffect() { if (!instance.isMounted) {// 获取组件注册的钩子函数const { bm, m } = instance;// 渲染组件生成子树vnodeconst subTree = (instance.subTree = renderComponentRoot(instance))// 执行beforeMount钩子函数if (bm) {invokeArrayFns(bm) }// 将子树vnode挂载到container上patch(null, subTree, container, anchor, instance, parentSuspense, isSVG)// 保留渲染生成的子树根DOM节点initialVNode.el = subTree.el;// 执行mounted钩子函数  if (m) {queuePostRenderEffect(m, parentSuspense)}// 标记已挂载instance.isMounted = true;} else {// 更新组件}}, prodEffectOptions)
} 

在执行组件挂载之前,会检测组件实例上是否存在注册的 beforeMount 钩子函数(bm)。
如果存在,通过遍历 instance.bm数组并使用 invokeArrayFns 方法依次执行这些钩子函数。
这样设计的原因是用户可以通过多次调用 onBeforeMount函数来注册多个 beforeMount 钩子函数,保证它们按注册顺序依次执行。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商商城源码,助力商家全球布局(多语言切换\多货币转换\多商户入驻)

今天,我们要给大家介绍一款强大且多元化的跨境电商解决方案——WoShop跨境电商源码!这款源码拥有许多令人惊叹的功能,其中最引人注目的就是支持多语言切换、多货币转换以及多商户入驻! 设想一下,你是一个跨境电商的卖家,你的业务遍…

哪一波最容易亏钱,昂首资本这样讲

有交易者咨询anzo capital昂首资本,按照波浪理论最容易亏钱是在第几波,通过调查得知80%的错误发生在第四波。所以对哪一波最容易亏钱,很有可能就是第四波。当然了如果能准确的判断第四波时,也可能获得相当丰厚的利润。 第四波通…

关于 国产系统UOS系统Qt开发Tcp服务器外部连接无法连接上USO系统 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134254817 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

壹[1],QT自定义控件创建(QtDesigner)

1,环境 Qt 5.14.2 VS2022 原因:厌烦了控件提升的繁琐设置,且看不到界面预览显示。 2,QT制作自定义控件 2.1,New/其他项目/Qt4 设计师自定义控件 2.2,设置项目名称 2.3,设置 2.4,设…

g.Grafana之Gauge的图形说明

直接上操作截图 1. 创建一个新的Dashboard 2.为Dashboard创建变量 【General】下的Name与Label的名称自定义 【Query options】 下的Group可以填写Zabbix内的所有组/.*/ , 然后通过Regex正则过滤需要的组名 3.设置Dashboard的图形 我使用文字来描述下这个图 1.我们在dash…

效率至少提高2倍!最实用的Linux命令合集

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

docker 常用

系统 Ubuntu 20.04 64位 安装文档 ubuntu:https://docs.docker.com/engine/install/ubuntu/ centos:https://docs.docker.com/engine/install/centos/ debian:https://docs.docker.com/engine/install/debian/ 常用命令 查找公共镜像库…

基于深度学习的视频多目标跟踪实现 计算机竞赛

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

JAVA前端开发介绍

以一个网站为例包括网站设计、前端开发、程序开发等。网站设计就是网站的外观,平面的东西。程序开发也好理解就是功能实现。而前端开发,简单来说,就是把平面效果图转换成网页,把静态转换成动态。它的工作包括了:切图、写样式、做鼠…

vue 视频流播放

采用的技术是vueflv.js 前言 常见视频流格式 ● RTMP(推流端、拉流端) ● RTSP(推流端) ● HLS(拉流端) ● FLV(拉流端) 视频流是否依赖插件直播/点播协议web/移动端flv否直播点播…

携程AI布局:三重创新引领旅游行业智能化升级

2023年10月24日,携程全球合作伙伴峰会在新加坡召开,携程集团联合创始人、董事局主席梁建章做了名为《旅游业是独一无二的最好的行业》的演讲,梁建章在演讲中宣布了携程生成式 AI、内容榜单、ESG 低碳酒店标准三重创新的战略方向。这些创新将为…

掌握互联网的未来:5G时代的新机遇

随着5G技术的快速发展,我们正步入一个全新的互联网时代。5G不仅仅是速度的飞跃,它还代表着无限的可能性和前所未有的创新机遇。本文将探讨5G如何重新定义互联网,并为您提供洞察如何抓住这波科技浪潮。 5G技术的核心优势 超高速度&#xff1a…