首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )

> 集合 ; // 获取 接收 type 事件类型的 订阅者集合 // MySubscription 中封装了订阅者对象...> type: types) { // 获取 接收 type 事件类型的 订阅者集合 // MySubscription 中封装了订阅者对象 +...- 订阅者对象 * Value - 订阅者对象中所有的订阅方法的事件参数类型集合 * * 根据该订阅者对象 , 查找所有订阅方法的事件参数类型 , 然后再到...METHOD_CACHE 中 , * 根据事件参数类型 , 查找对应的 MySubscriberMethod 集合 * MySubscriberMethod 中封装...* 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) * 通过事件类型到 * Map<Class<?

71910

【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )

文章目录 一、注册订阅方法 二、完整代码示例 一、注册订阅方法 订阅方法注册的过程就是将 订阅方法参数类型 和 订阅类 + 订阅方法 封装类 , 保存到 Map, CopyOnWriteArrayList> subscriptionsByEventType 集合中 , 该集合的键值含义如下 : Key - 订阅者方法事件参数类型...获取事件类型 : 获取订阅方法接收的参数类型 ; // 获取订阅方法接收的参数类型 Class>> typesBySubscriber 集合用于取消注册时 , 通过订阅者对象 查找 该订阅者对象中所有订阅方法的 事件参数类型 集合 , 然后通过事件类型 , 就可以去 Map<Class<?...- 订阅者对象 * Value - 订阅者对象中所有的订阅方法的事件参数类型集合 * * 根据该订阅者对象 , 查找所有订阅方法的事件参数类型 , 然后再到

72310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一看就晕的React事件机制

    ,首先生成合成事件,注意同一事件类型只能生成一个合成事件Event,如onclick这个类型事件,dom上所有带有通过jsx绑定的onClick的回调函数都会按顺序(冒泡或者捕获)会放到Event...._ownerDocument; // 2、在document上注册事件同一事件类型只会被注册一次 listenTo(registrationName, doc); // 3、...) { var mountAt = contentDocumentHandle; // 检测document上是否已经监听onClick事件,所以前面说同一类型事件只会绑定一次 var..._ownerDocument; // 2、在document上注册事件同一事件类型只会被注册一次 listenTo(registrationName, doc); // 3、...总的来说,整个click事件被分发的过程就是: 1、用EventPluginHub生成合成事件,这里注意同一事件类型只会生成一个合成事件,里面的_dispatchListeners里储存了同一事件类型的所有回调函数

    1.8K80

    你不知道的JavaScript(中卷)二

    换句话说,JS引擎本身并没有时间的概念,只是一个按需执行JS做生意代码片段的环境。“事件”(JS代码执行)调度总是由包含它的环境进行。 2.程序通常被分成了很多小块,在事件循环队列中一个接一个地执行。...可以把并发看作“进程”级(或者任务级)的并行,与运算级的并行(不同处理器上的线程)相对 2.单线程事件循环是并发的一种形式 3.非交互:两个或多个“进程”在同一个程序内并发地交替运行它们的步骤/事件时,...这种类型检查(type check)一般用术语鸭子类型(duck typing)来表示——“如果它看起来像鸭子,叫起来像鸭子,那它一定就是鸭子” 3.对thenable的鸭子类型检测:if(p!...• 任何通过then()注册的(每个)回调只会被调用一次,如果把同一个回调注册了不止一次,那它被调用的次数就会和注册次数相同。...://github.com/zhangyue0503/html5js/blob/master/你不知道的JS中/7.html 九、生成器 A.打破完整运行 1.生成器是一类特殊的函数,可以一次或多次启动和停止

    79720

    react底层原理

    2、比较组件(component diff) React对于组件的策略有两种方式,分别是类型相同和类型不同的组件 相同的直接继续比较组件内部的dom,不同的类型的会直接替换掉组件内部所有节点(可能虚拟DOM...并没有任何变化,所以用户可以通过shouldComponentUpdate() 来判断是否需要更新) 3、比较节点(element diff),对于同一层级的子节点,通过唯一的key比较。...,包括事件注册、合成、冒泡、派发等,这套机制称之为合成事件。...合成事件的好处: • 对事件进行归类,可以在事件产生的任务上包含不同的优先级 • 提供合成事件对象,抹平浏览器的兼容性差异 • 减少内存消耗,提升性能,不需要注册那么多的事件了,一种事件类型在 Root...上注册一次 原生事件先于React事件执行 JSX 在js里面写html是一件很舒服且效率很高的事情,而react通过jsx实现了。

    1.1K10

    React 进阶 - 事件系统

    ,由于 React 事件源 e 也是独立组建的,所以 preventDefault 也是单独处理的 # 事件合成 React 事件系统组成 事件合成系统,初始化会注册不同的事件插件 在一次渲染过程中...fiber 对象( hostComponent )的 memoizedProps 属性上: React 根据事件注册事件监听器: // react-dom/src/client/ReactDOMComponent.js...新版本顺序:捕获阶段 -> 事件监听 -> 冒泡阶段 # 事件绑定 在 React 新版的事件系统中,在 createRoot 会一次向外层容器上注册完全部事件: // react-dom/client.js...经过这第一步,在初始化阶段,就已经注册了很多的事件监听器了。 此时如果发生一次点击事件,就会触发两次 dispatchEvent : 第一次捕获阶段的点击事件; 第二次冒泡阶段的点击事件。...得到了 dispatchQueue 之后,就需要 processDispatchQueue 执行事件了,这个函数的内部会经历两次遍历: 第一次遍历 dispatchQueue,通常情况下,只有一个事件类型

    1.1K10

    Vue.js前端开发快速入门与专业应用

    就是路过编译这个元素和子元素,显示原始的{{}}标签,用来减少编译时间 11.v-cloak,相当于在元素上添加了一个[v-cloak]属性,直到关联的实例结束编译 12.v-once,用于标明元素或组件渲染一次...,id是指令的唯一标识,定义对象则是指令的相关属性及钩子函数;也可以通过在组件 的directives选项注册一个局部的自定义指令 2.定义对象主要包含三个钩子函数: bind:被调用一次,在指令第一次绑定到元素上时使用...update:指令在bind之后以初始值为参数进行第一次调用,之后每次当绑定值发生变化时调用,接收到的参数为newValue和oldValue ubind:指令从元素上解绑时调用,调用一次 3.指令属性...,可以直接传给选项events一个对象;也在可以在特定情况下或方法内采用$on方法来监听事件; 3.事件触发 $emit,在实例本身上触发事件 $dispatch,事件沿父链冒泡,并且在第一次触发回调之后自动停止冒泡...不再是component标签的属性,而是成为了单独的标签 3.slot不再支持多个相同plot属性的DOM插入到对应的slot标签中,一个slot被使用一次,不再保存自身的属性及样式,均由父元素或被插入的元素提供样式和属性

    2.8K20

    前端的设计模式系列-发布订阅模式

    大部分讲设计模式的文章都是使用的 Java、C++ 这样的以类为基础的静态类型语言,作为前端开发者,js 这门基于原型的动态语言,函数成为了一等公民,在实现一些设计模式上稍显不同,甚至简单到不像使用了设计模式...image-20220130171806687 观察者通过 on 向 EventBus 注册事件,然后 Subject 通过 emit 向 EventBus 发射事件,由 EventBus 来向观察者更新...== -1) { fns.splice(findIndex, 1); } } }; // 同一种功能可能会见到不同名字,这里都导出去 export const...上边的解决方案很粗略,适用于有一个事件并且只有一个 on 的场景,不然的话比如下边的情况: WindLiang.writePost("新文章-观察者模式,balabala"); EventBus.on...emit ,因为执行一次 listen 就把缓存清空了。

    35440

    客户端的js js脚本的引入 js的解析过程

    在core.js执行的时候读取这段文本,然后动态执行一次。浏览器不会执行之间的代码 html中的事件处理程序 当脚本所在的html文件被载入的时候。脚本里的js会执行一次。...为了可交互,js会定义事件处理程序即web浏览器先注册函数,并在之后调用其作为事件的响应。其中事件处理程序的属性可以包含任意条js语句。相互之间用逗号分隔。...url中的js 应用用途 书签 通过协议类型指定url内容为任意字符串,该字符串是会被js解释器运行的js代码,其会被当成单独的一行代码实现。即语句之间必须使用分号作为分割。 即,书签的实现。...不会出现js阻塞页面ui的渲染。异步的时候执行是无序。 事件驱动的js js还能通过注册事件程序函数写程序。之后在发生该事件的时候异步调用这些函数。...不能和主线程或者其他worker共享状态,可进行异步事件进行通信。

    13.1K80

    事件高级

      btn.onclick = function() {}        特点: 注册事件的唯一性        同一个元素同一事件只能设置一个处理函数,最 后注册的处理函数将会覆盖前面注册的处理函数...:同一个元素同一事件可以注册多个监听器  按注册顺序依次执行 1.2 事件监听 addEventListener()事件监听(IE9以后支持) eventTarget.addEventListener...事件侦听注册事件 addEventListener // (1) 里面的事件类型是字符串 必定加引号 而且不带on // (2) 同一个元素 同一事件可以添加多个侦听器(事件处理程序)...事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即 DOM 事件流。 注意   1. JS 代码中只能执行捕获或者冒泡其中的一个阶段。   ...事件委托的原理 给父元素注册事件,利用事件冒泡,当子元素的事件触发,会冒泡到父元素,然后去控制相应的子元素。 事件委托的作用 我们操作了一次 DOM ,提高了程序的性能。

    1.2K10

    24 事件绑定、事件修饰符与事件三阶段

    3,阻止默认行为 使用修饰符,不监听事件,例如: <!...当一个元素嵌套了另一个元素,并且两个元素都对同一事件注册了一个处理函数时,所发生的事件冒泡和事件捕获是两种不同的事件传播方式。事件传播模式决定了元素以哪个顺序接收事件。...但如果在同一个节点上,或相邻的其它节点上,使用useCapture=false注册事件监听,其事件函数仍然是会执行的。 5,self 在目标阶段监听事件,例如: <!...以js方式实现同样的效果,需要启用捕捉阶段的监听,并判断当前的事件对象是不是这个div,远不如加一个self修饰符简单。 6,once 监听一次,例如: once 这个最简单,监听事件执行函数,执行完了就把事件监听移除了。在vue的事件机制中,vm.

    1.3K10

    深入理解事件

    w3c正统标准,IE9及以上、Chrome、Firefox等支持该方法; ②事件类型不加on; ③第三个参数不设置的时候,默认为false即冒泡; ④ 同一事件处理函数可以绑定2次,一次用于事件捕获,...一次用于事件冒泡;如果绑定的是同一事件处理函数,并且都是事件冒泡类型或者事件捕获类型,那么只能绑定一次; ⑤ 不同的事件处理函数可以重复绑定,这点与上面attachEvent是一样的 2....假如outA、outB、outC都注册了click类型事件处理函数,当点击outC的时候,触发顺序是A–>B–>C,还是C–>B–>A呢?...对同一个绑定对象(这里是outC)而言,同处于目标阶段的多个函数的执行顺序:先注册的先执行,后注册的后执行。...,且每次执行一次dom操作,如果li数量很多的话,将大大减少dom的操作,优化的性能可想而知!

    83640

    阿里前端常见面试题总结

    useCapture 决定了注册事件是捕获事件还是冒泡事件一般来说,我们希望事件触发在目标上,这时候可以使用 stopPropagation 来阻止事件的进一步传播。...函数节流是指规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。...为 JS 添加类型支持,以及提供最新版的 ES 语法的支持,是的利于团队协作和排错,开发大型项目图片懒加载实现:getBoundClientRect 的实现方式,监听 scroll 事件(建议给监听事件添加节流...思路:setTimeout的特性是在指定的时间内执行一次,我们只要在setInterval内部执行 callback 之后,把定时器关掉即可。...JavaScript中的对象是引用类型的数据,当多个实例引用同一个对象时,只要一个实例对这个对象进行操作,其他实例中的数据也会发生变化。

    99610

    我不知道的 Event Loop

    我们都知道Js是单线程语言,即同一时间只能做一件事情,但是为了协调各种事件、用户交互、脚本加载、UI渲染和网络处理等行为,避免主线不阻塞,出现了EventLoop => ==事件循环==也就是我们常说的...在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下: 1、在此次 tick 中选择最先进入队列的任务(oldest task),如果有则执行(...注意: 异步并不是Js同时执行两段操作,它只是设定了定时的时间,然后放到任务队列的最后面,然后去执行其他操作,当设定的时间到了之后在把事件拿回来继续执行。 5、微任务和宏任务?...宏任务队列macrotask一次从队列中取一个任务执行,执行完后就去执行微任务队列中的任务; 微任务队列中所有的任务都会被依次取出来执行,知道microtask queue为空; 5.1 宏任务(MacroTask...参考资料 js同步和异步 前端中的事件循环eventloop机制 带你彻底弄懂Event Loop 用大白话告诉你什么是Event Loop 一次弄懂Event Loop(彻底解决此类面试问题) 从一道题浅说

    50910

    Node.js EventEmitter 和 Buffer

    Node.js EventEmitter Node.js 所有的异步 I/O 操作在完成时都会发送一个事件事件队列。Node.js 中许多对象都会分发事件。...当事件触发的时候,注册到这个事件上的事件监听器将依次被调用,事件参数作为回调函数参数传递。...)为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数once(event, listener)为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器removeListener...(event, listener)移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。...Node.js Buffer(缓冲区) 因为JavaScript只有字符串数据类型没有二进制数据类型。但是在处理TCP流或文件流时,必须使用二进制数据。

    1.5K40

    Vue 2.0 学习总结,精华全在这里了

    https://vuefe.cn/guide vue也是一个数据驱动框架,做spa页面的 vue如果不做页面可以当做一个单独使用的js库,做双向数据绑定用 vue的核心库关注视图层,但是vue并不只关注视图...局部注册组件 在要使用的组价中增加components属性,注册引入的组件并改名,之后才可以在html代码中使用 一般局部注册的组件都是通过.vue文件实现的 ? ?...☆注意在JavaScript中对象和数组是引用类型,指向同一个内存空间,如果prop是一个对象或数组,在子组件内部改变它会影响父组件的状态。...slot 分发 在自定义组件使用的时候,如果页面中有内容,又想让内容在自定义组件中使用,我们需要养slot标签 slot标签在一个html标签中只能出现一次 作用域插槽是一种特殊类型的插槽,用作使用一个...$refs在组件渲染完成后才填充,并且它是非响应式的。

    4K110
    领券