放肆青春的博客
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)

放肆青春

一个前端菜鸟的技术成长之路
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)
  • 前端

    • 前端 概览
    • 前端汇总

    • front 博文

    • front 项目总结

    • front 高级

    • front tools

  • vue

    • vue 概览
    • vue 汇总

    • vue 博文

      • vue对比
      • vue-router
      • vuex
      • vue2生命周期
      • vue组件通信
      • vue修饰符
      • vue异步组件
      • vue插槽
      • vue2 hook
        • vue2 hook
          • Hook Event 实现原理
          • hook 使用场景
          • 1. 在同一个组件中
          • 2.在父组件监听子组件的生命周期方法
    • vue 项目总结

    • vue 高级

  • html

    • html 概览
    • html 汇总

    • html 博文

  • css

    • css 概览
    • css 汇总

    • css 博文

    • sass

    • less

  • js

    • javascript 概览
    • JS 汇总

    • ES6

    • JS 博文

    • JS 工具

  • node

    • node 概览
    • node 汇总

    • node 框架

    • node 博文

  • react

    • react 概览
    • react 汇总

    • react 博文

    • react 高级

  • 微信小程序

    • 微信小程序 概览
    • 微信小程序总结
    • 微信小程序文章
    • 微信小程序 博文

    • 微信小程序 高级

  • 微信公众号

    • 微信公众号 概览
    • 微信公众号总结
    • 微信公众号文章
  • 多端开发

    • 多端开发
    • dsbridge 概览
    • jsbridge 概览
    • webview
    • uniapp

      • uniapp 概览
    • taro

      • taro 概览
    • flutter

      • flutter 概览
      • flutter 环境搭建
    • electron

      • electron 概览
  • front
放肆青春
2022-02-24

vue2 hook

# vue2 hook

什么是 Hook Event?

Hook Event 是 Vue 的自定义事件结合生命周期钩子实现的一种从组件外部为组件注入额外生命周期方法的功能。

作用:

  1. 可以避免了许多 data 里的无用变量的定义

# Hook Event 实现原理

<comp @hook:lifecycleMethod="method" />

处理组件自定义事件的时候(vm.$on) 如果发现组件有 hook:xx 格式的事件(xx 为 Vue 的生命周期函数),则将 vm._hasHookEvent 置为 true,表示该组件有 Hook Event

在组件生命周期方法被触发的时候,内部会通过 callHook 方法来执行这些生命周期函数,在生命周期函数执行之后,如果发现 vm._hasHookEvent 为 true,则表示当前组件有 Hook Event,通过 vm.$emit('hook:xx') 触发 Hook Event 的执行

# hook 使用场景

# 1. 在同一个组件中

  1. 在同一个组件中注册/停止一个监听事件

hook 实现:可以用 hook 来监听 beforeDestory 生命周期。因为只要监听一次就够了,所以用$once 来注册监听。

export default {
  methods: {
    fn() {
      const timer = setInterval(() => {
        //具体执行代码
        console.log("1");
      }, 1000);
      this.$once("hook:beforeDestory", () => {
        clearInterval(timer);
        timer = null;
      });
    },
  },
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14

惯用方法:

export default{
  data(){
    timer:null
  },
  mounted(){
      this.timer = setInterval(()=>{
      //具体执行内容
      console.log('1');
    },1000);
  }
  beforeDestory(){
    clearInterval(this.timer);
    this.timer = null;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

缺点:

  1. vue 实例中需要有这个定时器的实例,感觉有点多余;
  2. 创建的定时器代码和销毁定时器的代码没有放在一起,通常很容易忘记去清理这个定时器,不容易维护;

# 2.在父组件监听子组件的生命周期方法

父组件如何在子组件的 mounted 生命周期里做某些处理?

// 父组件
<rl-child
  :value="40"
  @hook:mounted="childMountedHandle"
/>
method () {
  childMountedHandle() {
  // do something...
  }
},
1
2
3
4
5
6
7
8
9
10

惯用方法:

//父组件
<rl-child
  :value="40"
  @childMounted="childMountedHandle"
/>
method () {
  childMountedHandle() {
  // do something...
  }
},

// 子组件
mounted () {
  this.$emit('childMounted')
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

参考:Vue 源码解读(7)—— Hook Event (opens new window) vue hook 使用 (opens new window)

更新时间: 2/24/2022, 7:37:44 PM
vue插槽
vue 配置

← vue插槽 vue 配置→

最近更新
01
前端权限管理
02-24
02
vue2指令
02-24
03
webpack版本
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2022 放肆青春
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式