Vue2 的@hook 、 hook: 与生命周期

这篇具有很好参考价值的文章主要介绍了Vue2 的@hook 、 hook: 与生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何实现父组件监听子组件的生命周期

方法一:$emit

// 父组件
<template>
  <div>
    <Child
      @mounted="onMounted"
      @updated="onUpdated"
      @beforeDestroy="onBeforeDestroy"
    ></Child>
  </div>
</template>

// 子组件
...
  mounted () {
	  this.$emit('mounted')
  }
  updated () {
	  this.$emit('updated')
  }
  beforeDestroy () {
	  this.$emit('beforeDestroy')
  }
...

优点:简单易上手

缺点:此种方法子组件必须是自己编写的组件,若引用第三方库这种方式则不可行

方法二:@hook

// 父组件
<template>
  <div>
    <Child
      @hook:mounted="onMounted"
      @hook:updated="onUpdated"
      @hook:beforeDestroy="onBeforeDestroy"
    ></Child>
  </div>
</template>

// 子组件
<!--无-->

官方文档并没有太多相关解释,只在处理边界情况 #程序化的事件侦听器— Vue.js (vuejs.org)里有出现。

子组件无需相关处理就能实现侦听,这块的实现原理可以从源码里探究部分

在组件生命周期的每个函数内都调用了callHook它支持两个参入,分别是实例vm和对应的生命周期钩子名称。而callHook里面就执行了vm.$emit('hook:' + hook),此为方法一!

当在子组件上传入了对应的@hook:mounted钩子,也就是执行了vm.$on('hook:mounted'),而vue实例在生命周期里本身就会执行vm.$emit('hook:mounted'),其实就连带着触发了我们绑定给子组件的回调函数了。

Vue2 的@hook 、 hook:  与生命周期
Vue2 的@hook 、 hook:  与生命周期

ps:使用callHook的好处

callHook(vm, 'beforeCreate') 调用后, const handlers = vm.$options[hook] 即读取到了当前 vm 实例上的任务队列,然后通过 for 循环依次传递给 invokeWithErrorHandling(handlers[i], vm, null, vm, info) 进行处理, 调用 invokeWithErrorHandling 如果发生异常, 则会统一报错处理。

拓展

1.hook:提升代码简洁性

在编写组件时,我们往往需要在各个生命周期里都针对某个业务逻辑做一些处理,业务散落在各个生命周期钩子里:

<script type="text/ecmascript-6">
export default {
  mounted () {
      // 挂载时执行一些业务A相关逻辑
      // 挂载时执行一些业务B相关逻辑
  }
  updated () {
      // 更新时执行一些业务A逻辑
      // 更新时执行一些业务B逻辑
      // 更新时执行一些业务C逻辑
  }
  beforeDestroy () {
    // 销毁时执行一些业务A逻辑
    // 销毁时执行一些业务C逻辑
  }
}
</script>

业务逻辑散落在各个生命周期里,有时候是不利于我们阅读代码的,尤其是当该业务是一个复杂的长段代码时,这个时候我们就可以考虑利用hook:来梳理某一块的业务代码,提升可阅读性:

<script type="text/ecmascript-6">
export default {
  created() {
    this.$on('hook:mounted', () => {
      挂载时执行一些业务A相关逻辑
    })
    this.$on('hook:updated', () => {
      挂载时执行一些业务A相关逻辑
    })
    this.$once('hook:beforeDestroy', () => {
      挂载时执行一些业务A相关逻辑
    })
  }
}
</script>

这样就可以将散落的业务逻辑,都在一个created钩子函数里书写完毕,而且仍保持原来的生命周期逻辑。

2.避免data里的无用变量的定义

例如我们在编写组件时会执行一些事件监听或者定时器函数,我们希望在组件销毁的时候都能去销毁这些监听或者定时器,但是由于夸生命周期的问题,常常会将定时器赋值给一个全局变量或者绑定到this上,然后在另一个生命周期里获取并执行销毁操作。

// 优化前
<script type="text/ecmascript-6">
export default {
  data() {
    return {
        timer:null
      }
  }
  mounted () {
    this.timer = setInterval(() => {
	// todo
    }, 1000);
  }
  beforeDestroy () {
    clearInterval(this.timer)
  }
}
</script>


// 优化后
<script type="text/ecmascript-6">
export default {
  mounted () {
    const timer = setInterval(() => {
	// todo
    }, 1000);
    this.$once('hook:beforeDestroy', function () {
        clearInterval(timer)
    })
  }
}
</script>

Vue3.X

参考 https://v3-migration.vuejs.org/zh/breaking-changes/vnode-lifecycle-events.html文章来源地址https://www.toymoban.com/news/detail-749313.html

到了这里,关于Vue2 的@hook 、 hook: 与生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Angular--父子组件生命周期钩子(lifecycle hooks)执行过程

    组件初始化过程中,生命周期钩子执行顺序: constructor()构造函数,初始化class,(constructor不属于Angular生命周期钩子的范畴,这里只是说明组件组件初始化会先调用构造函数)。 ngOnChanges()--如果组件没有输入属性(@Input()),或者使用时没有提供任何输入属性,那么angular不会调用它

    2024年01月20日
    浏览(51)
  • Vue2-replace属性、编程式路由导航、缓存路由组件、两个新的生命周期钩子、路由守卫、路由器工作模式

    🥔:如果事与愿违,那一定是上天另有安排 更多Vue知识请点击——Vue.js 1.作用:控制路由跳转时操作浏览器历史记录的模式 2.浏览器的历史记录有两种写入方式:分别为 push 和 replace , push是追加历史记录,replace是替换当前记录 。路由跳转时候 默认为push 3.如何开启replace模

    2024年02月10日
    浏览(47)
  • 计算属性和监听属性,生命周期钩子,组件介绍

    # 计算属性是基于它们的依赖进行缓存的 # 计算属性只有在它的相关依赖发生改变时才会重新求值 # 计算属性就像Python中的property,可以把方法/函数伪装成属性 # 计算属性必须要有返回值 基本使用 首字母变大写 通过计算属性,重写过滤案例 只要属性发生变化,就会执行 函数

    2024年01月21日
    浏览(42)
  • 面试中问:React中函数组件和class组件的区别,hooks模拟生命周期

    React 的函数组件和类组件在很多方面都相似,但它们也有一些关键的差异。以下是这两种组件之间的主要区别: 定义方式 : 函数组件 : 是简单的 JavaScript 函数,接受 props 为参数,并返回 React 元素。 类组件 : 是 ES6 的类,继承的时候要用到 extends React.Component,至少包含一个名

    2024年02月11日
    浏览(43)
  • Angular 17+ 高级教程 – Component 组件 の 生命周期钩子 (Lifecycle Hooks)

    之前在 Component 组件 の Angular Component vs Custom Elements 文章中,我们有学习过几个基础的 Lifecycle Hooks。 比如 OnChanges、OnInit、AfterViewInit、OnDestroy,但那篇只是微微带过而已。 这篇让我们来深入理解 Angular 的 Lifecycle Hooks。   在 Component 组件 の Dependency Injection NodeInjector 文章中

    2024年03月09日
    浏览(50)
  • Vue - 实现类似小程序 onShow() 一样的生命周期钩子方法(监听页面的显示,只要页面显示就执行代码)

    我们都知道,在微信小程序和 uni-app 项目中,页面有一个 onShow() 生命周期,当页面显示时就会触发。 但在 Vue.js / Nuxt.js 项目中是没有这个钩子函数的, 本文将提供 最简单、高效 的解决方案, 另外兼容性亲测完美。 如下效果图所示,首页每次显示的时候都会触发(您看控制

    2024年02月11日
    浏览(41)
  • Vue2基础四、生命周期

    1、生命周期 Vue生命周期:一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 创建阶段:创建响应式数据 挂载阶段:渲染模板 更新阶段:修改数据,更新视图 销毁阶段:销毁Vue实例 2、生命周期钩子 Vue生命周期过程中,会 自动运

    2024年02月15日
    浏览(76)
  • Vue2的生命周期(详解)

    Vue实例的生命周期: 从创建到销毁的整个过程 Vue框架内置函数,随着组件的生命周期阶段,自动执行 作用:特定的时间点,执行特定的操作 分类:四大阶段 八大方法 new Vue() – Vue实例化(组件也是一个小的Vue实例) Init Events Lifecycle – 初始化事件和生命周期函数 beforeCreate – 生命周期

    2024年02月03日
    浏览(67)
  • 【vue2】vue生命周期的理解

    🥳博       主: 初映CY的前说(前端领域) 🌞个人信条: 想要变成得到,中间还有做到! 🤘 本文核心 :vue生命周期的介绍、vue生命周期钩子函数详解,vue生命周期的执行顺序 目录 一、生命周期介绍 二、生命周期的构成 1. 生命周期的四个阶段 : 2.八大钩子作用: 1.bef

    2024年02月02日
    浏览(70)
  • vue2面试题:对vue生命周期的理解

    生命周期(life cycle)的概念应用很广泛,在政治、经济、环境、技术、社会等诸多领域都会经常出现,可通俗理解为“从摇篮到坟墓”的整个过程,在vue中从实例的创建到销毁过程就是生命周期,即从创建、初始化数据、编译模板、挂载Dom–渲染、更新–渲染、卸载等一系列

    2024年01月25日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包