先安装 mitt

npm
npm install mitt

# 1.App.vue

App 与 eventbus.js 文件为根组件 下面 Home 与 About 例子都被引用

vue
// App.vue
<template>
  <div>
    <home/>
    <about/>
  </div>
</template>
<script>
  import Home from './Home.vue';
  import About from './About.vue';
  export default {
    components: {
      Home,
      About
    }
  }
</script>
<style scoped></style>

# 2.js 文件

js
// eventbus.js
import mitt from 'mitt';
const emitter = mitt();
// 可以创建多个 mitt 对象
// export const emitter1 = mitt();
// export const emitter2 = mitt();
// export const emitter3 = mitt();
export default emitter;

# 3. 监听单一事件

# About.vue 组件

vue
<template>
  <div>
    <button @click="btnClick">按钮点击</button>
  </div>
</template>
<script>
  import emitter from './eventbus';
  export default {
    methods: {
      btnClick() {
        console.log("about按钮的点击");
        emitter.emit("Neko", {name: "Neko", age: 16}); // 发出事件:事件名与参数
      }
    }
  }
</script>
<style scoped></style>

# Home.vue 组件

vue
<template>
  <div></div>
</template>
<script>
  import emitter from './eventbus';
  export default {
    created() {
      //  监听到事件名后执行回调函数.
      emitter.on("Neko", (info) => {
        console.log("Home.vue:", "info",info);
      });
    }
  }
</script>
<style scoped></style>

参考结果:

![Single_event_ source](Single_event_ source.gif)

# 4. 监听所有事件

# About.vue 组件

vue
<template>
  <div>
    <button @click="btnClick">按钮点击</button>
  </div>
</template>
<script>
  import emitter from './eventbus';
  export default {
    methods: {
      btnClick() {
        console.log("about按钮的点击");
        emitter.emit("Neko", {name: "Neko", age: 16}); // 发出事件 事件名与参数
        emitter.emit("Nico", {name: "Nico", age: 16}); // 发出事件 事件名与参数
      }
    }
  }
</script>
<style scoped></style>

# Home.vue 组件

vue
<template>
  <div></div>
</template>
<script>
  import emitter from './eventbus';
  export default {
    created() {
      // 监听到事件名后执行回调函数.
      //type: 事件名 info: 参数
      emitter.on("*",(type,info) => {
        console.log("listener * :",type,info);
      })
    }
  }
</script>
<style scoped></style>

参考结果:

Multiple_data_sources

# 5.Mitt 事件取消

# 1. 取消 emitter 中所有的监听

Home.vue

vue
<template>
  <div></div>
</template>
<script>
  import emitter from './eventbus';
  export default {
    created() {
      // 监听到事件名后执行回调函数.
      //type: 事件名 info: 参数
      emitter.on("*",(type,info) => {
        console.log("listener * :",type,info);
      })
     
      let counter = 3;
      // 定义一个 2s 倒计时,取消所有注册的函数监听
      let timer = setInterval(() => {
        counter--
        if(counter === 1 ){
          clearInterval(timer)
          emitter.all.clear() // 取消 emitter 中所有的监听
        }
        console.log(`还剩${counter}s取消所有监听`);
      }, 1000);
    }
  }
</script>
<style scoped></style>

参考结果:

Cancel_all_emitter

# 2. 取消 emitter 中某个监听

Home.vue

vue
<template>
  <div></div>
</template>
<script>
  import emitter from './eventbus';
  export default {
    created() {
      // 监听到事件名后执行回调函数.
    function onFoo(params) {
      console.log("Nico已被监听");
    }
     emitter.on("Nico",onFoo)
      let counter = 3;
      // 定义一个 2s 倒计时,取消注册 (目前监听了一个为:Nico) 的函数监听
      let timer = setInterval(() => {
        counter--
        if(counter === 1 ){
          clearInterval(timer)
          emitter.off("Nico",onFoo) // 取消 emitter 中某个监听
          setTimeout(() => {
            console.log("已经取消对 Nico 的监听");
          }, 1000);
        }
        console.log(`还剩${counter}s取消对 Nico 监听`);
      }, 1000);
    }
  }
</script>
<style scoped></style>

参考结果:

Cancel_single_event_listening

# 6. 总结

  • emitter.emit 用于发出事件 (有两个参数分别是事件名与要传递的数据)
  • emitter.on 用于监听事件名后执行回调函数。第一个参数就是函数名,第二个参数是一个回调函数,回调函数中有个参数就是传递的数据
  • emitter 监听所有事件,第一个参数 用 * 号代替事件名,第二个参数返回回调函数。回调函数有两个参数 type 与 data (type 为事件名,data: 为数据)
  • emitter.all.clear () 取消对所有函数的监听
  • emitter.off ("Nico",onFoo) 取消对某一个函数的监听:Nico 为事件名,第二个为回调函数名,因此需要对回调函数起个名字。
Update on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

Nico Niconi WeChat Pay

WeChat Pay

Nico Niconi Alipay

Alipay