草庐IT

Vue2到Vue3你必知的生命周期钩子函数,快速搞定Vue组件优化

老汤前端 2024-02-07 原文

Vue 3在生命周期钩子函数的设计方面的目标之一是尽量减少组件状态的管理,提高代码的可读性和模块化。Vue 3 的生命周期主要围绕着Composition API设计展开,这使得生命周期的使用更加灵活和直观。而Vue 2在这方面的设计思想则是把不同阶段所需的操作都分离出来方便维护和调试。

以下是Vue 2和 Vue 3 生命周期的对比及其详细介绍:

一、 Vue 2 的生命周期钩子函数

beforeCreate

在实例化之后、数据初始化之前被调用。此时模板已经编译成了 render 函数并且创建了虚拟 DOM,但是还未完成注入 data 和 computed 属性,也未执行方法或处理事件。因此,如果再 Vue 实例里需要自定义一些 property 属性或者使用 $store 等全局变量,那么这个时机就非常适合,否则可能会报错。

created

在实例化后数据初始化后被调用。在 created 阶段,data 和 computed 已经被注入而 methods、watcher、events 等事件以及 template/render 函数都还没发生过回调调用。 Vue 实例已经被完全渲染出来,DOM 也已经渲染好了,我们可以在这个阶段绑定监听器,但是只能对状态做出反应,不能改变状态。你的组件实例现在已经准备好了,可以被挂载到 DOM 树上。

beforeMount

在挂载之前被调用 。当 Vue 实将要挂载到 DOM 时执行该方法。 在此阶段,Vue 的 render 函数已经返回虚拟 DOM 并进行了 diff 算法计算,即将来会更新视图的内容已被计算,但是尚未应用到视图上。

mounted

当 Vue 实例挂载到 DOM 上后调用 。这说明现在真正的执行 DOM 和 Webpack 文件打包工作均完成,Vue插件安装、数据依赖关系初始化等等也都已完成,因此可以进行一些需要操作 DOM 的任务。mounted 仅仅保证了在该钩子函数中可以正常访问 DOM 元素,所有的 Mounted 过程并不是一次性完全输出,而是一个叠加效果:首先最开始的 mounted 先执行(包含其内部子组件),接着是子孙组件的 mounted。

beforeUpdate

在当前组件更新前被调用,即数据更新前 DOM 更新前。当数据改变导致模板重新渲染时,面向用户的界面还没有被更新,这时就会调用 beforeUpdate 钩子。因为数据已经发生变化,但是页面的数据并没有变 (如果有修改数据的话,使用 $nextTick)。 可以通过在钩子函数中对状态的操作,从而让状态修改后立即生效,这样做同样是不推荐的。

updated

当前组件更新结束之后调用(即由于数据更新而触发重新渲染过后)。这里就需要注意的是 updated 与 mounted 非常相似。不同在于 updated 是每次数据更新都会执行,而 mounted 只会执行一次。

activated

keep-alive 组件激活时调用。 activated 钩子函数仅仅在使用 keep-alive 组件时才能被触发。使用 keep-alive 包裹的组件在被销毁时,其缓存的状态会保存。当再次需要使用该组件时,缓存的状态会恢复。这个时候 activated 就会被调用。

deactivated

keep-alive 组件停用时调用。 deactivated 不同 activated 一样,deactivated 钩子函数仅仅在使用 keep-alive 组件时才能被触发。当 keep-alive 组件从文档中移除并停用时,deactivated 就会被调用了。

beforeDestroy

在一个 Vue 实例销毁之前调用。这个时候 Vue 组件实例完全可用,用户界面依然可以互动。 beforeDestroy 发生时如有监听器要指定清理工作,请务必在此时进行清理以避免内存溢出等问题的出现。

destroyed

在一个 Vue 实例销毁之后调用。这个时候代表着组件已经完全的被销毁,那么组件对象也就变得毫无价值。所有的事件监听器、数据绑定和子组件也已经被移除了。

errorCaptured

当捕获一个来自子孙组件的错误时会调用这个钩子。用于统计错误、日志上报等收集异常信息。

二、Vue 3 的生命周期钩子函数

Vue 3 在生命周期设计上摆脱了 Vue 2 的基于代码顺序的设计,转而使用了基于 API 的逐步执行。

setup

组件选项中最先被执行的一个钩子函数是 setup。在这个钩子函数中可以设置 props、data、computed、methods 等函数或属性,并且需要将这些函数或属性暴露给模板中使用。setup 函数会在组件实例创建前执行,而这个函数所提供的所有属性都会被视为响应式数据,也就是说,可以通过类似于 data 中所提供的语法去访问和更新它们。

onBeforeMount

与 beforeMount 的作用一致,在组件即将被安装时执行。

onMounted

与 mounted 的作用一致,在组件已经被安装后立即执行。

onBeforeUpdate

与 beforeUpdate 的作用一致,在组件即将更新时执行。

onUpdated

与 updated 的作用一致,在 DOM 被更新同步后执行。

onErrorCaptured

与 errorCaptured 的作用一致,可以捕获子孙组件抛出的错误并进行统计和上报。

onBeforeUnmount

与 beforeDestroy 的作用一致,在组件即将被卸载时执行。在这个阶段内部状态还是可用的。

onUnmounted

与 destroyed 的作一致,在组件已经被卸载并且其对应的视图 DOM 已经被清空之后执行。

onRenderTracked

在 Vue 3 中新增了一个钩子函数 onRenderTracked,可以用于捕获组件渲染的过程中哪些数据被访问,哪些数据被修改等。这对于诊断 Vue 应用的性能问题是非常有帮助的。

onRenderTriggered

与 onRenderTracked 功能相反, 它会在组件渲染的过程中,跟踪是什么引起了渲染的。这个钩子函数也可以用于优化组件渲染性能。

三、总结

Vue 3 的生命周期相较于 Vue 2 精简、灵活性更高,通过 Composition API 将所有数据操作集中到 setup 选项中,代码结构清晰,使得开发者可以更容易地按照需求组织代码并快速迭代。此外,Vue 3 增加了几个新的生命周期钩子函数,如 onRenderTracked 和 onRenderTriggered,可以通过这些新的 API 更好地优化应程序性能问题。

有关Vue2到Vue3你必知的生命周期钩子函数,快速搞定Vue组件优化的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  5. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. ruby-on-rails - 将字符串转换为 ruby​​-on-rails 中的函数 - 2

    我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。

  8. ruby - 在 ruby​​ 中使用 .try 函数和 .map 函数 - 2

    我需要从json记录中获取一些值并像下面这样提取curr_json_doc['title']['genre'].map{|s|s['name']}.join(',')但对于某些记录,curr_json_doc['title']['genre']可以为空。所以我想对map和join()使用try函数。我试过如下curr_json_doc['title']['genre'].try(:map,{|s|s['name']}).try(:join,(','))但是没用。 最佳答案 你没有正确传递block。block被传递给参数括号外的方法

  9. ruby - 是否可以从也在该模块中的类内部调用模块函数 - 2

    在这段Ruby代码中:ModuleMClassC当我尝试运行时出现“'M:Module'的未定义方法'helper'”错误c=M::C.new("world")c.work但直接从另一个类调用M::helper("world")工作正常。类不能调用在定义它们的同一模块中定义的模块函数吗?除了将类移出模块外,还有其他解决方法吗? 最佳答案 为了调用M::helper,你需要将它定义为defself.helper;结束为了进行比较,请查看以下修改后的代码段中的helper和helper2moduleMclassC

  10. ruby - 刚刚分配的变量是否有 ruby 钩子(Hook)? - 2

    这是我理想中想要的。用户做:a="hello"输出为Youjustallocated"a"!=>"Hello"顺序无关紧要,只要我能实现该消息即可。 最佳答案 不,没有直接的方法可以做到这一点,因为在执行代码之前,Ruby字节码编译器会丢弃局部变量名。YARV(MRI1.9.2中使用的RubyVM)提供的关于局部变量的唯一指令是getlocal和setlocal,它们都对整数索引进行操作,而不是变量名。以下是1.9.2源代码中insns.def的摘录:/****************************************

随机推荐