详解Vue源码学习之callHook钩子函数

yizhihongxing

详解Vue源码学习之callHook钩子函数

概述

在学习 Vue 框架时,我们经常会接触到一些生命周期钩子函数,比如 created、mounted 等等。这些函数在组件生命周期中扮演着非常重要的角色。Vue 使用 callHook 函数来触发这些钩子函数,接下来我们就来详细讲解 callHook 函数的实现。

callHook 函数的实现

在 Vue 的源码中,callHook 函数定义在 src/core/instance/lifecycle.js 文件中,其定义如下:

export function callHook(vm, hook) {
  // #7573 disable dep collection when invoking lifecycle hooks
  pushTarget()
  const handlers = vm.$options[hook]
  const info = `${hook} hook`
  if (handlers) {
    for (let i = 0, j = handlers.length; i < j; i++) {
      invokeWithErrorHandling(handlers[i], vm, null, vm, info)
    }
  }
  if (vm._hasHookEvent) {
    vm.$emit('hook:' + hook)
  }
  popTarget()
}

在调用 callHook 函数时,需要传入两个参数:vmhook。其中,vm 是组件实例化对象,hook 是要触发的生命周期钩子函数名称。

callHook 函数首先通过 pushTarget 函数禁用了 computed watcher 的依赖收集,然后从 vm.$options 对象中取得要触发的钩子函数列表,使用 for 循环依次调用这些函数。在调用过程中,使用 invokeWithErrorHandling 函数进行错误处理。

钩子函数调用完毕后,如果组件实例对象上有 _hasHookEvent 属性,会触发 hook:${hook} 事件。

最后,通过 popTarget 函数恢复 computed watcher 的依赖收集。

实例说明

下面给出两条示例说明。

示例一

首先,在组件的 beforeCreate 钩子函数中添加一句 console 输出:

export default {
  beforeCreate () {
    console.log('beforeCreate hook')
  },
  // ...
}

然后,在组件初始化时,我们可以看到在控制台中输出了 'beforeCreate hook',验证了 callHook 函数的正确性。

示例二

增加一个功能:组件销毁时,输出 log。首先通过 beforeDestroy 钩子函数添加销毁前提醒:

export default {
  beforeDestroy () {
    console.log(`${this.$options.name} component is about to be destroyed`)
  },
  // ...
}

接下来在销毁组件时,我们可以看到在控制台中输出了组件的名称,说明我们成功地添加了销毁前的提醒功能。

总结

调用 callHook 函数是 Vue 中触发生命钩子函数的核心流程,深入了解 callHook 函数的实现方式对我们处理生命周期钩子函数及其相关问题具有一定帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Vue源码学习之callHook钩子函数 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue3使用vue-router的完整步骤记录

    下面就是“Vue3使用Vue Router的完整步骤记录”的攻略。 使用Vue Router包 要使用Vue Router,首先需要安装vue-router包。可以使用npm安装,命令如下所示: npm install vue-router@next 创建路由实例 Vue Router的创建需要在Vue实例之前,因为Vue Router的实例也要在Vue实例…

    Vue 2023年5月27日
    00
  • 对vue中v-if的常见使用方法详解

    下面是针对“对vue中v-if的常见使用方法详解”的完整攻略,包含两个示例说明。 对vue中v-if的常见使用方法详解 v-if的基本使用方法 在Vue.js中,v-if指令用于控制元素是否显示。如果v-if表达式的值为true,元素将被渲染;如果v-if表达式的值为false,元素将不会被渲染。 <template> <div> &…

    Vue 2023年5月27日
    00
  • vue 组件通信的多种方式

    Vue 组件通信是一个非常重要的知识点,涉及到 Vue 组件之间消息传递和状态共享的问题。Vue 组件通信的多种方式包括以下几种: 使用 Props 和事件进行父子组件之间通信。 在 Vue.js 中,父子组件之间通信是通过 Props 和事件实现的。父组件通过 Props 向子组件传递数据,子组件通过事件向父组件发送消息。 以下是一个简单的示例: 父组件:…

    Vue 2023年5月27日
    00
  • 一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)

    一步步教你利用Webpack如何搭一个Vue脚手架 本文将指导你如何使用Webpack搭建一个Vue脚手架,我们将一步步地进行详细地讲解,让你可以轻松地实现一个基本的Vue项目。 创建项目目录 首先,我们需要创建一个新的项目目录,并在其中创建一个package.json文件,以便我们可以安装所需的依赖项: mkdir vue-starter cd vue-s…

    Vue 2023年5月28日
    00
  • Vue3中的ref为何要用.value进行值的调用呢

    在Vue3中,ref用作响应式数据的定义和访问,但其访问方式与Vue2.x有所不同,需要使用 .value 属性来访问具体的值。 这是因为 Vue3.x 中的响应式系统使用了 ES6 的 Proxy,而 .value 非常巧妙地利用了 ES6 Proxy 的 get 和 set 方法。每个 ref 对象本身其实不是一个值,而是一个包含一个值的对象,并且这个值…

    Vue 2023年5月27日
    00
  • TypeScript类型使用示例剖析

    接下来我将为您详细讲解“TypeScript类型使用示例剖析”的完整攻略。首先,我们需要了解什么是TypeScript。 TypeScript是由微软开发的开源编程语言,基于JavaScript语言语法之上,它可以在开发大型项目时提供更好的代码维护性和可读性。TypeScript支持静态类型、类和接口,并兼容ES6规范。接下来,我将通过两个示例说明如何使用T…

    Vue 2023年5月28日
    00
  • ant-design-vue 快速避坑指南(推荐)

    Ant Design Vue 快速避坑指南 Ant Design Vue 是一款基于 Vue.js 的 UI 组件库,它提供了许多丰富的组件,如按钮、表单、弹窗等等。使用 Ant Design Vue 可以大大缩短前端开发时间,但是使用过程中也会遇到一些坑点,本文将介绍 Ant Design Vue 的使用指南及避坑秘籍。 安装 要使用 Ant Design…

    Vue 2023年5月28日
    00
  • vue中的事件修饰符once,prevent,stop,capture,self,passive

    下面我将详细讲解Vue中的事件修饰符。 什么是事件修饰符 Vue允许在利用v-on绑定事件时添加事件修饰符,以便对事件的一些特殊处理。Vue为我们提供了6种常用的事件修饰符,分别是v-once、v-prevent、v-stop、v-capture、v-self和v-passive。 事件修饰符示例 v-once 当我们需要对某个事件仅绑定一次,可以使用v-o…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部