温故而知新之:生命周期

简介: vue的生命周期还是比较饶腾的,最直接的方法就是都写出来体验一下。

vue的生命周期还是比较饶腾的,最直接的方法就是都写出来体验一下。


初体验



首先整理 vue3 的生命周期,只考虑在 setup 里面的就好。

import {
  // onBeforeCreate,  // setup 中无效
  // onCreated, // setup 中无效
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
  onErrorCaptured,
  onRenderTracked,
  onRenderTriggered,
  onActivated,
  onDeactivated,
  provide,
  inject
} from 'vue'
export default (flag) => {
  // 在挂载开始之前被调用
  onBeforeMount(() => {
    log(`${flag} == onBeforeMount`)
  })
  // 在实例挂载完成后被调用
  onMounted(() => {
    log(`${flag} == onMounted`)
  })
  // 在数据发生改变后,DOM 被更新之前被调用
  onBeforeUpdate(() => {
    log(`${flag} == onBeforeUpdate :`)
  })
  // 在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用
  onUpdated(() => {
    log(`${flag} == onUpdated`)
  })
  // 在卸载组件实例之前调用
  onBeforeUnmount(() => {
    log(`${flag} == onBeforeUnmount`)
  })
  // 卸载组件实例后调用
  onUnmounted(() => {
    log(`${flag} == onUnmounted`)
  })
  // 在捕获一个来自后代组件的错误时被调用
  onErrorCaptured((res) => {
    log(`${flag} == onErrorCaptured :`, res)
  })
  // 跟踪虚拟 DOM 重新渲染时调用
  onRenderTracked((res) => {
    log(`${flag} == onRenderTracked :`, res)
  })
  // 当虚拟 DOM 重新渲染被触发时调用
  onRenderTriggered((res) => {
    log(`${flag} == onRenderTriggered :`, res)
  })
  // 被 keep-alive 缓存的组件激活时调用
  onActivated((res) => {
    log(`${flag} == onActivated :`, res)
  })
  // 被 keep-alive 缓存的组件失活时调用
  onDeactivated((res) => {
    log(`${flag} == onDeactivated :`, res)
  })
}


  • flag  做一个标识,区分不同的组件。


然后我们可以在组件里面引入

import { lifecycle } from '/nf-ui-core'
  lifecycle('表单页面', true)


这样就可以了。运行项目,可以看到组件的加载过程,更新过程,以及卸载过程。


增加功能



只是看看事件的触发情况,有点单调,我们可以加上一个计时的功能,看看加载、卸载、更新到底需要多长时间。

export default (flag, isTime = false) => {
  const t = (isTime) ? 
    logTime(`${flag}***加载用时:`) :
    {end: () => {} }
  let t2 = null
  // 在实例挂载完成后被调用
  onMounted(() => {
    log(`${flag} == onMounted`)
    t.end()
  })


  • isTime 是否计时


如果需要计时的话,就加上计时功能,函数开始运行时记个时间,然后在 onMounted 里面再记个时间,然后相减就是加载的时间。


同理我们可以对卸载和更新计时

// 在数据发生改变后,DOM 被更新之前被调用
  onBeforeUpdate(() => {
    log(`${flag} == onBeforeUpdate :`)
    if (isTime) {
      t2 = logTime(`${flag}***更新 DOM 用时`)
    }
  })
  // 在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用
  onUpdated(() => {
    log(`${flag} == onUpdated`)
    if (isTime) t2.end()
  })
  // 在卸载组件实例之前调用
  onBeforeUnmount(() => {
    log(`${flag} == onBeforeUnmount`)
    if (isTime) {
      t2 = logTime(`${flag}***卸载组件用时`)
    }
  })
  // 卸载组件实例后调用
  onUnmounted(() => {
    log(`${flag} == onUnmounted`)
    if (isTime) t2.end()
  })


计时采用的是 console.time()实现的,只是被我封装了一下。


然后运行组件就可以看到各个环节需要的时间了。


增加父子组件的关系。



组件是有父子关系的,而且有时候会比较复杂,虽然有了一个flag,但是并没有体现父子关系,简单的还好,复杂的就有点不清晰了。


我们可以利用 provide 、inject 来实现父子关系的表达。

const f = Symbol('___nf-liefcycle___')
export default (_flag, isTime = false) => {
  // 判断上级的标识
  const _parentflag = inject(f)
  const flag = (_parentflag) ?
    _parentflag + '----' + _flag :
    _flag
  // 记入标记
  provide(f, flag)
 ...
}

首先定义一个 Symbol 作为标志,然后看看上级组件是否有标记,没有的话就当做父组件,有的话就取出来,然后加上自己的flag,这样一个简单的父子的层级关系就做好了。


看看最终效果。



image.png


vue的生命周期


可以看到生命周期的钩子的触发过程,以及使用的时间,可以看看各个组件的渲染效率。

相关文章
|
6月前
|
存储 Web App开发 运维
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
部署和发布是软件工程中经常互换使用的两个术语,甚至感觉是等价的。然而,它们是不同的! • 部署是将软件从一个受控环境转移到另一个受控环境,它的目的是将软件从开发状态转化为生产状态,使得软件可以为用户提供服务。 • 发布是将软件推向用户的过程,应用程序需要多次更新、安全补丁和代码更改,跨平台和环境部署需要对版本进行适当的管理,有一定的计划性和管控因素。
1481 1
|
6月前
|
API Android开发 UED
UniApp 项目中的生命周期详解:从诞生到逝去
UniApp 项目中的生命周期详解:从诞生到逝去
249 4
|
6月前
|
前端开发 小程序 JavaScript
小程序生命周期详解,助你成为开发高手!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
运维 架构师 安全
【一款互联网产品全生命周期】每个程序员都有必要读一读
【一款互联网产品全生命周期】每个程序员都有必要读一读
|
前端开发
前端学习笔记202305学习笔记第二十四天-生命周期1
前端学习笔记202305学习笔记第二十四天-生命周期1
46 0
|
前端开发
前端学习笔记202305学习笔记第二十四天-生命周期2
前端学习笔记202305学习笔记第二十四天-生命周期2
48 0
|
安全 测试技术 程序员
软工总结——生命周期各阶段所需文档
软工总结——生命周期各阶段所需文档
|
Go 调度
计时器的生命周期 | 青训营笔记
计时器的生命周期 | 青训营笔记
94 0
|
监控 测试技术
揭开软件错误生命周期的神秘面纱
软件测试的目标是确保软件应该保持无错误。软件测试人员通过以最少的时间和精力发现错误来实现这一目标,同时确保软件满足客户的要求。一个好的工程师可以识别尽可能多的错误,但找到错误只是一个起点。一个错误必须经过几个阶段才能达到最终解决方案。测试工程师有责任将错误置于正确的状态并进一步跟踪。如果他精通软件错误生命周期,他就会高效地完成这项工作。或者,我们称之为缺陷生命周期。
92 0
|
数据采集 算法 Java
库调多了,都忘了最基础的概念-《线程池篇》
库调多了,都忘了最基础的概念-《线程池篇》
128 0
库调多了,都忘了最基础的概念-《线程池篇》