通过vue手动封装on、emit、off的代码详解

下面就是“通过Vue手动封装on、emit、off的代码详解”的攻略。

什么是on、emit、off

on、emit、off是Vue中的三个方法。其中,on用于监听自定义事件的回调函数,emit用于触发子组件中自定义事件,off用于移除事件监听器。

封装on、emit、off

在Vue框架中,我们不需要手动封装on、emit、off,可以直接在组件中使用这三个方法。不过,如果你想要手动封装这三个方法,可以按照以下步骤进行。

封装on方法

我们可以在Vue原型上添加一个$on方法,用于监听自定义事件的回调函数。

Vue.prototype.$on = function(event, fn){
  const vm = this;
  if(Array.isArray(event)){
    for(let i = 0, l = event.length; i < l; i++){
      this.$on(event[i], fn);
    }
  }else{
    (vm._events[event] || (vm._events[event] = [])).push(fn);
  }
  return vm;
};

上述代码中,我们判断如果event是一个数组,则遍历数组中每一个事件名称,执行$on方法,将所有事件全部监听;如果event是一个字符串,则将监听函数推入对应事件的回调函数数组里。

封装emit方法

我们可以在Vue原型上添加一个$emit方法,用于触发子组件中的自定义事件。

Vue.prototype.$emit = function(event){
  const vm = this;
  let cbs = vm._events[event];
  if(cbs){
    const args = Array.prototype.slice.call(arguments, 1);
    for(let i = 0, l = cbs.length; i < l; i++){
      try{
        cbs[i].apply(vm, args);
      }catch(e){
        console.error(e);
      }
    }
  }
  return vm;
};

上述代码中,我们通过判断当前组件是否存在对应的回调函数数组,然后执行回调函数,并传入参数。

封装off方法

我们可以在Vue原型上添加一个$off方法,用于移除事件的监听器。

Vue.prototype.$off = function(event, fn){
  const vm = this;
  if(!arguments.length){
    vm._events = Object.create(null);
    return vm;
  }
  if(Array.isArray(event)){
    for(let i = 0, l = event.length; i < l; i++){
      this.$off(event[i], fn);
    }
    return vm;
  }
  const cbs = vm._events[event];
  if(!cbs){
    return vm;
  }
  if(!fn){
    vm._events[event] = null;
    return vm;
  }
  let cb;
  let i = cbs.length;
  while(i--){
    cb = cbs[i];
    if(cb === fn || cb.fn === fn){
      cbs.splice(i, 1);
      break;
    }
  }
  return vm;
};

上述代码中,我们加入了移除所有事件监听器、移除多个事件监听器和移除单个事件监听器三种情况,可以进行跟细粒度的操作。

示例说明

假如我们有一个子组件中有一个按钮,点击此按钮时触发自定义事件,实现父组件监听该事件打印日志。

子组件:

<template>
  <div>
    <button @click="handleClick">触发事件</button>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  methods: {
    handleClick(){
      this.$emit('my-event');
    }
  }
}
</script>

父组件:

<template>
  <div>
    <child-component @my-event="handleLog"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  },
  methods: {
    handleLog(){
      console.log('自定义事件my-event被触发');
    }
  }
}
</script>

当我们点击子组件中的按钮时,console中会输出“自定义事件my-event被触发”的日志。

再看一个示例,此次我们需要给子组件中的多个事件添加监听器,并移除相应的监听器。

子组件:

<template>
  <div>
    <button @click="handleClick">触发事件1</button>
    <button @click="handleClick">触发事件2</button>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  methods: {
    handleClick(){
      this.$emit('my-event1');
      this.$emit('my-event2');
    }
  }
}
</script>

父组件:

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  },
  created(){
    this.$on(['my-event1', 'my-event2'], this.handleLog);
  },
  methods: {
    handleLog(){
      console.log('自定义事件my-event1、my-event2被触发');
      this.$off(['my-event1', 'my-event2'], this.handleLog);
    }
  }
}
</script>

在父组件中created钩子中,我们监听了两个事件my-event1和my-event2,并分别在handleLog方法中处理二者并移除监听器。当我们在子组件中点击两个按钮时,console中会输出“自定义事件my-event1、my-event2被触发”的日志,且日志只会输出一次。

通过这两个例子,相信您已经明白了如何手动封装on、emit、off方法了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:通过vue手动封装on、emit、off的代码详解 - Python技术站

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

相关文章

  • vue中get请求如何传递数组参数的方法示例

    关于“vue中get请求如何传递数组参数的方法示例”的攻略,我来详细讲解一下。 1. 为什么需要传递数组参数 在使用vue进行数据传递的过程中,有时会遇到需要传递数组参数的场景。例如,我们需要向后台发送一组数据,这些数据可能是用作查询条件或者是数据的集合等等。此时,我们需要了解如何传递数组参数。 2. 传递数组参数的方法示例 在vue中,我们可以通过修改请求…

    Vue 2023年5月29日
    00
  • 详解Vue如何自定义hooks(组合式)函数

    我很乐意为您详细讲解如何自定义Vue的组合式(Hooks)函数。 什么是Vue的组合式(Hooks)函数? Vue的组合式函数,也称为Hooks,是一种类似于React Hooks的编程模式,可以在Vue组件中复用逻辑,并且不需要使用mixin和继承。当我们需要在多个组件之间共享逻辑时,可以使用Hooks来进行抽象,并将其作为可复用的函数进行重用。 当我们使…

    Vue 2023年5月28日
    00
  • Vue 打包体积优化方案小结

    下面我来详细讲解一下“Vue 打包体积优化方案小结”的完整攻略。 1. 按需引入第三方插件 第一步,可以通过按需引入第三方插件来减小打包体积。对于一些比较大的第三方插件,我们可以使用按需引入的方式,在需要使用插件的具体页面中引入。具体实现方式可以使用 babel-plugin-import 插件来完成。 例如,在使用 Element UI 的项目中,可以通过…

    Vue 2023年5月28日
    00
  • Vue CLI 2.x搭建vue(目录最全分析)

    Vue CLI是一个基于Vue.js的官方CLI工具,可以帮助我们快速搭建Vue.js项目。在Vue CLI 2.x版本中,我们可以按照以下步骤来搭建Vue.js项目: 1. 安装Vue CLI 2.x 首先我们需要安装Vue CLI,可以使用以下命令来安装: npm install -g vue-cli@2.9.6 2. 创建项目 创建一个Vue.js项目…

    Vue 2023年5月28日
    00
  • Vue3.2 新增指令 v-memo 用法详解(提高性能利器)

    我将为您详细讲解“Vue3.2 新增指令 v-memo 用法详解(提高性能利器)”的完整攻略。 简介 Vue 3.2 新增了 v-memo 指令,它专门用于对 Vue 组件进行记忆化优化。记忆化优化可以提高应用程序的运行效率,减少重复渲染和计算,从而大大提高应用程序的性能。 记忆化优化是一种重新运行的策略,该策略中,在组件生成后,不在计算过程中多次工作。所以…

    Vue 2023年5月29日
    00
  • Vue+Canvas绘图使用的讲解

    下面是Vue+Canvas绘图的攻略: 1. 准备工作 在Vue项目中引入canvas,你可以在main.js文件中引入VueKonva插件,该插件使得Canvas的使用更简单,也方便了对canvas的管理,引入方式如下: import Vue from ‘vue’ import VueKonva from ‘vue-konva’ Vue.use(VueKo…

    Vue 2023年5月28日
    00
  • Vue计算属性与监视属性详细分析使用

    Vue.js是一个非常流行的JavaScript前端框架,其中计算属性和监视属性是Vue.js中的两个重要概念。它们都被用来监听数据的变化,但是它们有着不同的用途和适用场景。 一、 Vue计算属性 Vue计算属性是指根据现有的属性计算得出的另一属性,即Vue.js中的“computed”。Vue计算属性可以非常方便地进行数据处理和关联操作,并且具有缓存功能,…

    Vue 2023年5月28日
    00
  • vue插件vue-resource的使用笔记(小结)

    vue插件vue-resource的使用笔记 什么是vue-resource vue-resource是一个Vue.js的插件,它为我们提供了一个服务,用于在Vue.js应用程序中轻松地处理Web API请求和响应。它和jQuery的Ajax非常类似,不过它更适合Vue.js。 安装 npm install vue-resource –save 使用 在V…

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