返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue2中@hook的解析与妙用实例
  • 319
分享到

vue2中@hook的解析与妙用实例

vue2 @hookvue2hooksvue @hook 2023-03-06 11:03:01 319人浏览 八月长安
摘要

目录前言几种用法用法一 将放在多个生命周期的逻辑,统一到一个生命周期中用法二 监听子组件生命周期运行的情况运用场景场景一场景二场景三所有生命周期执行的顺序第一次渲染更新时组件摧毁时总

前言

@hook是什么?用来监听组件生命周期的回调函数。

这和生命周期函数mounted,created,updated有什么区别?

区别1:@hook 会在对应的生命周期函数执行后执行。

区别2:@hook 可以在父组件监听子组件的生命周期运行情况。

从这段Vue源代码中我们能看到hook的部分调用逻辑,vm.$emit('hook:' + hook) 其实就是在调用我们写的@hook:mounted="xxx",@hook这个api却没有在官方文档中出现,所以鲜有人知道它的存在和用法。

几种用法

用法一 将放在多个生命周期的逻辑,统一到一个生命周期中

通常写法

export default {
  components: {},
  data: () => {
    return {
      name: 'dx',
    };
  },
  created() {
    console.log('created')
  },
  beforeMount() {
    console.log('beforeMount')
  },
  mounted() {
    console.log(this.name);
    // 每一个小时刷新一次页面
    setInterval(() => {
      location.reload()
    }, 60 * 60 * 1000);
  },
}

@hook的用法

export default {
  components: {},
  data: () => {
    return {
      name: 'dx',
    };
  },
  created() {
    console.log('created');
    this.$on('hook:beforeMount', () => {
      console.log('beforeMount');
    });
    this.$on('hook:mounted', () => {
      console.log(this.name); // this 就是组件实例自己
      // 每一个小时刷新一次页面
      setInterval(() => {
        location.reload();
      }, 60 * 60 * 1000);
    });
  },
};

注意

  1. 按照生命周期执行的先后周期,我们只能mounted生命周期里,写这之后的生命周期,而不能写hook:beforeMount
  2. this.$on第二个回调函数的this指的是当前组件实例本身,无论这个回调函数是否是箭头函数。

用法二 监听子组件生命周期运行的情况

通常写法

// 父组件
<Children @buttonRender="ButtonRender"/>

export default {
  name: 'Parents',
  components: {
  	Children
  },
  data: () => {
    return {
      name: 'dx',
    };
  },
  methods: {
    ButtonRender() {
      console.log('渲染完成')
    }
  }
}
// 子组件
export default {
  name: 'Children',
  components: {},
  data: () => {},
  methods: {},
  mounted() {
  	this.$emit('buttonRender')
  }
}

@hook的写法

<Children @hook:mounted="ButtonRender"/>

export default {
  name: 'Parents',
  components: {
  	Children
  },
  data: () => {
    return {
      name: 'dx',
    };
  },
  methods: {
    ButtonRender() {
      console.log('渲染完成')
    }
  }
}

注意

  1. @hook的写法可以不需要在子组件里面编写其它代码
  2. 从vue源码中可以发现 vm.$emit('hook:' + hook) 这里虽然调用了hook但没有返回参数,也就是说,上面代码中ButtonRender没有默认参数。
  3. 同样承接着2来说,由于ButtonRender没有默认参数,所以我们无法在ButtonRender函数中获取子组件Children的实例。

为了解决3的问题,我尝试着想到一种方法,利用ref获取子组件的实例,将子组件的实例拿到父组件的this中。ButtonRender中的this就是父组件实例,和寻常methods中的函数没区别。

<Children ref="child1" @hook:mounted="ButtonRender"/>
export default {
  name: 'Parents',
  components: {
  	Children
  },
  data: () => {
    return {
      name: 'dx'
    };
  },
  mounted() {},
  methods: {
    ButtonRender() {
      console.log(this.$refs.child1) // this.$refs.child1就是子组件Children的实例了
      console.log('渲染完成')
    }
  }
};

但是,我们都知道,vue ref的绑定都是挂载完成之后,所以这个方法也只能用在@hook:mounted@hook:updated等mounted之后执行的生命周期中,而不能用在 比如@hook:beforeMount中。

运用场景

场景一

许多时候,我们不得不在不同的生命周期中执行某些逻辑,并且这些逻辑会用到一些通用的变量,这些通用变量按照之前的方式,我们不得不存在data中。

<script>
export default {
  data() {
    return {
        timer:null
      }
  }
  mounted () {
    this.timer = setInterval(() => {
	// todo
    }, 1000);
  }
  beforeDestroy () {
    clearInterval(this.timer)
  }
}
</script>

优化后,就不存在这个问题,是不是很好用。

<script>
export default {
  mounted () {
    const timer = setInterval(() => {
	// todo
    }, 1000);
    this.$once('hook:beforeDestroy', function () {
        clearInterval(timer)
    })
  }
}
</script>

场景二

如果属于同一业务的逻辑要在不同的生命周期中执行,下面这样会更利于阅读和维护。

export default {
  created() {
    this.$on('hook:mounted', () => {
      挂载时执行一些业务A相关逻辑
    })
    this.$on('hook:updated', () => {
      挂载时执行一些业务A相关逻辑
    })
    this.$once('hook:beforeDestroy', () => {
      挂载时执行一些业务A相关逻辑
    })
  }
}

场景三

想要监听别人封装好的组件(第三方组件)的生命周期,你不可能去第三方子组件的生命周期中写代码。

比如 element-ui 的button组件,在子组件渲染完成后,我想做某些逻辑变更。

<el-button type="primary" @hook:mounted="ButtonRender" :disabled="disabled">{{name}}</el-button>

export default {
  name: 'Parents',
  data: () => {
    return {
      name: 'dx',
      disabled: true
    };
  },
  methods: {
    ButtonRender() {
      this.disabled = false
      this.name = 'yx'
    }
  }
}

所有生命周期执行的顺序

第一次渲染

父beforeCreate
父 hook:beforeCreate
父created
父 hook:created
父beforeMount
父 hook:beforeMount
子beforeCreate
子hook:beforeCreate
子created
子hook:created
子beforeMount
子hook:beforeMount
子mounted
子hook:mounted
父mounted
父 hook:mounted

更新时

父beforeUpdate
父hook:beforeUpdate
子beforeUpdate
子hook:beforeUpdate
子updated
子hook:updated
父updated
父hook:updated

组件摧毁时

父beforeDestroy
父hook:beforeDestroy
子beforeDestroy
子hook:beforeDestroy
子destroyed
子hook:destroyed
父destroyed
父hook:destroyed

以上内容涉及到vue父子组件生命周期执行顺序的知识,但对于@hook:xxx来说,在xxx执行后就会立即执行@hook:xxx

总结

到此这篇关于vue2中@hook的解析与妙用的文章就介绍到这了,更多相关vue2 @hook妙用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue2中@hook的解析与妙用实例

本文链接: https://lsjlt.com/news/198642.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue2中@hook的解析与妙用实例
    目录前言几种用法用法一 将放在多个生命周期的逻辑,统一到一个生命周期中用法二 监听子组件生命周期运行的情况运用场景场景一场景二场景三所有生命周期执行的顺序第一次渲染更新时组件摧毁时总...
    99+
    2023-03-06
    vue2 @hook vue2hooks vue @hook
  • vue2中的@hook怎么使用
    这篇文章主要讲解了“vue2中的@hook怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue2中的@hook怎么使用”吧!前言@hook是什么?用来监听组件生命周期的回调函数。这和...
    99+
    2023-07-05
  • vue2.x中keep-alive源码解析(实例代码)
    目录一、前世尘缘二、keep-alive内置组件1.缓存动态组件2.缓存路由组件3.原理解析三、LRU算法一、前世尘缘 vue中内置组件keep-alive的设计思想源于HTTP中的...
    99+
    2023-02-14
    vue2.x keep-alive源码 vue keep-alive源码 vue2.x源码解析
  • Flex中Hook机制的示例分析
    小编给大家分享一下Flex中Hook机制的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在前一篇简要介绍了基于Flex的界面组合SDK,其中使用Hook机制实现UI Part生命周期管理、Master-Detail...
    99+
    2023-06-17
  • vue2源码解析之全局API实例详解
    目录前言Vue.extend()基本使用整体源码Vue.nextTick,Vue.set,Vue.deleteVue.directive、Vue.filter、Vue.co...
    99+
    2022-11-13
    vue2全局api vue2.0源码解析 vuejs源码解析
  • vue3和vue2中mixins的使用解析
    目录前言Vue21、封装的mixin方法2、具体页面引用 abc.vue3、具体页面使用 abc.vuevue3官方入口(个人建议,不要再mixin用setup)一、封装mixin里...
    99+
    2024-04-02
  • vue2中使用AntV 以g2plot为实例
    目录使用AntV以g2plot为例效果代码AntV g2的简单运用安装语法介绍使用AntV以g2plot为例 效果 代码 nmp 导入: npm install @antv/g2p...
    99+
    2024-04-02
  • 解析Vue2实现composition API的原理
    自从 Vue3 发布之后,composition API 这个词走入写 Vue 同学的视野之中,相信大家也一直听到 composition API 比之前的 options API 有多好多强,如今由于 @vue/composition-a...
    99+
    2023-05-14
    Vue.js 前端
  • vue2使用swiper4踩坑的示例分析
    vue2使用swiper4踩坑的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言一开始打算采用最新的swiper7,后来好像是vue2兼容性问题,各种报错,所以从...
    99+
    2023-06-26
  • Vue2.X中钩子函数的示例分析
    这篇文章给大家分享的是有关Vue2.X中钩子函数的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。$route可以在子组件任何地方调用,代表当前路由对象,这个属性是只读的,...
    99+
    2024-04-02
  • React Hook中的useState函数的详细解析
    useState => 让函数组件具有维持状态的能力useState 这个 Hook 是用来管理 state 的,它可以让函数组件具有维持状态的能力。即在一个函数组件的多次渲染...
    99+
    2022-11-13
    React Hook  useState函数 React Hook
  • 浅析React Hook中useEffecfa函数的使用
    我们知道在类组件中是可以有生命周期函数的, 那么如何在函数组件中定义类似于生命周期这些函数呢Effect Hook 可以让你来完成一些类似于class中生命周期的功能;事实上,类似于网络请求、手动更新DOM、一些事件的监听,都是React更...
    99+
    2022-11-22
    React Hook React
  • linux中SUID,SGID与SBIT的奇妙用途详解
    前言  linux对文件的权限管理简直是让人叹为观止,又回顾了一下SUID,SGID和SBIT的作用,总结一下。 其实SUID和SGID的作用跟sudo是相似的。当用户A想执行一个原本属于用户B的可执行文件时,...
    99+
    2022-06-04
    suid sgid 取消 suid sgid linux sgid
  • do...while(0)的妙用详细解析
    在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视...
    99+
    2022-11-15
    do_while
  • Vue2中使用axios的3种方法实例总结
    目录第一种 原始方法 直接在项目中使用(不建议使用)第二种 将请求挂载到全局( 推荐使用 )第三种 将代码进行封装总结第一种 原始方法 直接在项目中使用(不建议使用) 这种方法最简单...
    99+
    2024-04-02
  • 解析Android AIDL的实例与原理
    目录一、概述二、创建 .aidl 文件三、生成 .java 文件四、传输复杂数据五、建立 service六、获取服务七、分析调用过程一、概述 简单来说,AIDL 就是定义一个接口,客...
    99+
    2024-04-02
  • Vue2.x中虚拟DOM diff原理的示例分析
    这篇文章主要介绍Vue2.x中虚拟DOM diff原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言经常看到讲解Vue2的虚拟Dom diff原理的,但很多都是在原代码...
    99+
    2024-04-02
  • React中hook函数与useState及useEffect的使用
    目录1. 简介2. useState使用3. useEffect使用useEffect发起网络请求1. 简介 在 React 的世界中,有容器组件和 UI 组件之分,在 React ...
    99+
    2024-04-02
  • 架构解密:剖析 PHP 负载均衡的妙用与本质
    提高性能:通过将 Web 请求分配给多台 Web 服务器,可以有效地提高 Web 应用程序的性能。 提高可用性:如果一台 Web 服务器发生故障,其他 Web 服务器仍然可以继续处理 Web 请求,从而提高了 Web 应用程序的可用性。...
    99+
    2024-02-03
    PHP 负载均衡的妙用主要体现在以下几个方面:
  • Vue2 Observer实例dep和闭包中dep区别详解
    目录start1. 依赖收集2. 通知更新思考拓展一拓展二手动通知的案例endstart 此前学习 Vue2 源码。对 Vue 源码中两次出现的new Dep(),不清楚它们的区别,...
    99+
    2022-11-13
    Vue2 Observer与dep闭包 Vue2 闭包
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作