Vue3.x 推荐使用 mitt.js

摘要:
Vue2.x使用EventBus进行组件通信,而Vue3。x建议使用mitt.js。与Vue实例上的EventBus相比,mitt.jss有什么更好的地方?快速启动npminstall--savemit模式1,全局总线,并在主内存中装入全局属性。js文件。从“vue”导入{createApp};importAppfrom'。/应用程序vue';从“mitt”constapp=createApp导入mitt。配置。全局属性$mybus=mitt()方法2,封装自定义事务总线文件mybus.js,创建一个新的js文件,并将其导入到您想要的任何位置import_from'mit'importHelloWorldfrom'./components/HelloWorld.vue'exportdefault{components:{HelloWorld},setup{constformItemMitt=mit()return{formItemMitt}}}}mit的用法与EventEmitter的用法类似。通过on方法添加事件,通过off方法删除事件,然后全部清除。

Vue3.x 推荐使用 mitt.js第1张

Vue2.x 使用 EventBus 进行组件通信,而 Vue3.x 推荐使用 mitt.js。

比起 Vue 实例上的 EventBus,mitt.js 好在哪里呢?首先它足够小,仅有200bytes,其次支持全部事件的监听和批量移除,它还不依赖 Vue 实例,所以可以跨框架使用,React 或者 Vue,甚至 jQuery 项目都能使用同一套库。

快速开始

npm install --save mitt

方式1,全局总线,vue 入口文件 main.js 中挂载全局属性。

import { createApp } from 'vue';

import App from './App.vue';

import mitt from "mitt"

const app = createApp(App)

app.config.globalProperties.$mybus = mitt()

方式2,封装自定义事务总线文件 mybus.js,创建新的 js 文件,在任何你想使用的地方导入即可。

import mitt from 'mitt'

export default mitt()

方式3,直接在组件里面导入使用。推荐大家使用这种方式,因为分散式更方便管理和排查问题。

<template>
  <img alt="Vue logo" src="http://t.zoukankan.com/assets/logo.png" />
  <HelloWorld msg="Hello Vue 3.0 + Vite" />
</template>
 
 
<script>
import mitt from 'mitt'
import HelloWorld from './components/HelloWorld.vue'
 
 
export default {
  components: {
    HelloWorld
  },
  setup (props) {
    const formItemMitt = mitt()
    return {
      formItemMitt
    }
  }
}
</script>

使用方式

其实 mitt 的用法和 EventEmitter 类似,通过 on 方法添加事件,off 方法移除,clear 清空所有。

import mitt from 'mitt'
 
 
const emitter = mitt()
 
 
// listen to an event
emitter.on('foo', e => console.log('foo', e) )
 
 
// listen to all events
emitter.on('*', (type, e) => console.log(type, e) )
 
 
// fire an event
emitter.emit('foo', { a: 'b' })
 
 
// clearing all events
emitter.all.clear()
 
 
// working with handler references:
function onFoo() {}
emitter.on('foo', onFoo)   // listen
emitter.off('foo', onFoo)  // unlisten

需要注意的是,导入的 mitt 我们是通过函数调用的形式,不是 new 的方式。在移除事件的需要传入定义事件的名字和引用的函数。

核心原理

原理很简单,就是通过 map 的方法保存函数。经过我的删减代码不到 30 行。

export default function mitt(all) {
    all = all || new Map();
 
 
    return {
        all,
 
 
        on(type, handler) {
            const handlers = all.get(type);
            const added = handlers && handlers.push(handler);
            if (!added) {
                all.set(type, [handler]);
            }
        },
 
 
        off(type, handler) {
            const handlers = all.get(type);
            if (handlers) {
                handlers.splice(handlers.indexOf(handler) >>> 0, 1);
            }
        },
 
 
        emit(type, evt) {
            ((all.get(type) || [])).slice().map((handler) => { handler(evt); });
            ((all.get('*') || [])).slice().map((handler) => { handler(type, evt); });
        }
    };
}

  Vue3 从实例中完全删除了 $on、$off 和 $once 方法。$emit 仍然是现有API的一部分,因为它用于触发由父组件以声明方式附加的事件

  

  

免责声明:文章转载自《Vue3.x 推荐使用 mitt.js》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇phpexcel 使用一,解决自动加载问题linux boost 安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用HBuilderX 打包 vue 项目 为 App 的步骤

首先打包你的vue项目生成dist文件夹,教程请移步https://www.cnblogs.com/taohuaya/p/10256670.html 看完上面的教程,请确保你是将: 项目目录下的config文件夹里的index.js文件中,将build对象下的assetsPublicPath中的“/”,改为“./”后,打包生成的dist文件。 开始使用HB...

pywinauto客户端自动化---自动打开PC端程序

继续介绍pywinauto,上一篇已经可以打开记事本了,这里安静在提供其他方法进行打开记事本和非电脑自带程序 运行指定程序 这里安静分别拿电脑自带程序和电脑非自带程序进行模拟打开。 1、windows自带程序: 这里需要start后面的参数,可以通过上一篇介绍的工具进行获取,也可以通过鼠标右键--属性查看 #coding:utf-8 from pywin...

Windows上实现iOS APP自动化测试:tidevice + WDA + facebook-wda / appium

本文介绍如何在Windows下构建iOS APP自动化测试环境,采用的主要工具为tidevice,WebDriverAgent,facebook-wda或者appium。 目录 测试架构介绍 WebDriverAgent原理分析 tidevice原理分析 iOS 设备安装 wda 1、安装Xcode 2、下载WebDriverAgent 3、...

iOS 崩溃

一、什么情况下会产生崩溃日志? 两种主要情况会产生崩溃日志: 1.应用违反操作系统规则。 2.应用中有Bug。 违反iOS规则包括在启动、恢复、挂起、退出时watchdog超时、用户强制退出和低内存终止。 Watchdog 超时机制 从iOS 4.x开始,退出应用时,应用不会立即终止,而是退到后台。但是,如果你的应用响应不够快,操作系统有可能会终止你的应用...

2012开源项目计划-WPF企业级应用整合平台

2012开源项目计划-WPF企业级应用整合平台 开篇         2012年,提前祝大家新年快乐,为了加快2012年的开发计划,特打算年前和大家分享一下2012年的开发计划和年后具体的实施计划,希望有兴趣或者有志之士共 同加盟,我们一起完成一项属于自己的项目,实现共赢,无论是工作或者是学习上的双赢。         我为什么要现在发布这样的文章呢,其...

Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台

系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 本篇文章操作系统信息       Linux:ubuntu 16.04.3 amd64 查看NetCore支持的Linux系统       NetCore不是支持Linux的所有系统,只支持部分,所以在Linux上安装NetCore之前要查看系...