温故而知新之:生命周期

简介: 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的生命周期


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

相关文章
|
4月前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
59 0
|
4月前
|
开发者 安全 UED
JSF事件监听器:解锁动态界面的秘密武器,你真的知道如何驾驭它吗?
【8月更文挑战第31天】在构建动态用户界面时,事件监听器是实现组件间通信和响应用户操作的关键机制。JavaServer Faces (JSF) 提供了完整的事件模型,通过自定义事件监听器扩展组件行为。本文详细介绍如何在 JSF 应用中创建和使用事件监听器,提升应用的交互性和响应能力。
41 0
|
6月前
|
JavaScript 前端开发
Vue组件生命周期深度剖析:从创建到销毁的八大钩子实战指南
Vue组件生命周期深度剖析:从创建到销毁的八大钩子实战指南
|
7月前
|
API Android开发 UED
UniApp 项目中的生命周期详解:从诞生到逝去
UniApp 项目中的生命周期详解:从诞生到逝去
267 4
|
7月前
|
小程序
【边做边学】uniapp里面的生命周期钩子函数
【边做边学】uniapp里面的生命周期钩子函数
230 0
|
7月前
|
前端开发 小程序 JavaScript
小程序生命周期详解,助你成为开发高手!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
7月前
|
JavaScript 前端开发 API
|
7月前
|
前端开发 JavaScript
第十二章 引出React中的生命周期
第十二章 引出React中的生命周期
|
7月前
|
JavaScript
【Vue2.0学习】—生命周期(五十)
【Vue2.0学习】—生命周期(五十)
|
前端开发
前端学习笔记202305学习笔记第二十四天-生命周期1
前端学习笔记202305学习笔记第二十四天-生命周期1
47 0