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

yizhihongxing

下面就是“通过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组件中的自定义事件你了解多少

    当我们在vue组件中进行数据交互时,父组件向子组件传递了数据,在子组件中操作了这些数据,并根据需求将结果返回给父组件时,我们就需要用到自定义事件。自定义事件可以让我们在父组件中监听到子组件事件的触发并获取子组件中需要返回的数据,从而完成父子组件间的数据交互。 以下是自定义事件的步骤和示例: 步骤一:在子组件中定义自定义事件并触发 在子组件中通过 this.$…

    Vue 2023年5月28日
    00
  • webpack构建vue项目的详细教程(配置篇)

    下面是“webpack构建vue项目的详细教程(配置篇)”的完整攻略: 1. 安装webpack和相关插件 在开始配置webpack之前,需要先安装一些必要的包。可以使用npm进行安装: npm install webpack webpack-cli webpack-dev-server –save-dev 安装webpack、webpack-cli和we…

    Vue 2023年5月27日
    00
  • 关于Vue v-on指令的使用

    关于Vue v-on指令的使用 在Vue中使用v-on指令可以实现事件监听和处理,常用于页面交互中。下面详细介绍v-on指令的使用方法。 语法 v-on指令是Vue提供的一种事件绑定方法,语法如下: v-on:事件名="事件处理函数" 其中,事件名指绑定的事件名称,事件处理函数是一个在Vue实例中定义的方法。 示例说明 示例1:点击事件 …

    Vue 2023年5月27日
    00
  • VSCode搭建Vue项目的方法

    接下来我会详细讲解如何使用VSCode搭建Vue项目的方法。 准备工作 在使用VSCode搭建Vue项目之前,首先需要在电脑上安装以下几个软件: Node.js (https://nodejs.org) npm (安装好Node.js后默认已经安装好了) VSCode (https://code.visualstudio.com/) 安装完成后,打开VSCo…

    Vue 2023年5月29日
    00
  • VUE重点问题总结

    VUE重点问题总结攻略 1. Vue组件之间通信方式 在Vue组件开发中,组件之间通信是一个重要的问题。Vue提供了多种组件之间通信的方式,包括props、$parent/$children、$emit/$on、$refs等,下面分别进行详细说明。 Props 使用props向子组件传递数据是最常用的方式。父组件通过props向子组件传递数据,子组件通过pr…

    Vue 2023年5月28日
    00
  • VUE中$refs的基本用法举例

    接下来将为您详细讲解“VUE中$refs的基本用法举例”的完整攻略。 简介 在Vue中,$refs 指令用于获取子组件或子 dom 元素的引用。通过$refs指令,可以获取组件或元素的所有属性和方法,实现父子组件之间的通信。 基本用法 在使用Vue中的$refs指令时,通常需要在组件或dom元素上设置ref属性,这样在,就可以在父组件中使用$refs访问到子…

    Vue 2023年5月27日
    00
  • Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示

    下面是关于“Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示”的完整攻略: 1. 确定需求和设计方案 在编写Vue日历组件之前,我们需要先确认我们的需求和设计方案。首先,我们需要支持周模式和月模式的日历显示,同时还需要支持自定义日历内容的显示。为了实现这些需求,我们可以考虑使用如下设计方案: 使用Vue.js框架编写日历组件,使用组件的方式实现周…

    Vue 2023年5月29日
    00
  • Vue中接收二进制文件流实现pdf预览的方法

    要在Vue中接收二进制文件流实现pdf预览,需要考虑以下几个步骤: 发送请求获取二进制文件流 首先,需要使用Vue的异步请求库,例如axios,发送获取二进制文件流的请求。请求返回的数据类型是一个arraybuffer,需要注意设置responseType为arraybuffer。 示例代码: axios.get(‘http://example.com/fi…

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