当前位置: 首页 > article >正文

发布订阅模式(TS)

源码:

class EventBus{
    event:Record<string,Set<(...args:Array<any>)=>void>> = {}
    on(eventName:string,cb:(...args:Array<any>)=>void){
      ( this.event[eventName] ??= new Set()).add(cb)
    }
    emit(eventName:string,...args:Array<any>){
      this.event[eventName].forEach(cb=>cb(...args as Array<any>))
    }
    off(eventName:string,cb:(...args:Array<any>)=>void){
     this.event[eventName].delete(cb)
    }
    once(eventName:string,cb:(...args:Array<any>)=>void){
        const handler = (...args:Array<any>)=>{
            cb(...args)
            this.off(eventName,handler)
        }

        this.on(eventName,handler)
    }
}
export const bus = new EventBus()

使用:
子组件:

<script setup lang="ts">
import { ref, watchEffect } from 'vue'
import { bus } from '../../event';
const count = ref(0)
const addCount = (val:number)=>{count.value+=val}
bus.on('addCount', addCount)

watchEffect(()=>{
  if(count.value >10){
    bus.off('addCount',addCount)
  }
})


</script>

<template>
  <div>
    <div>{{ count }}</div>
  </div>
</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>

父组件:

<script setup lang="ts">
import { bus } from '../event';
import child from './test/child.vue';
function addCount(){
  bus.emit('addCount',2)
}
</script>

<template>
  <div>
    <child></child>
    <button @click="addCount">Count++</button>
    
  </div>

</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>

在这里插入图片描述


http://www.kler.cn/a/410114.html

相关文章:

  • React(六)——Redux
  • Vue 3 动态组件教程
  • C# 特性与反射
  • FreeRTOS——事件标志组
  • 小蒋聊技术:大数据驱动决策——技术落地与业务深度融合
  • 1-测试go-redis缓存数据
  • [less] Operation on an invalid type
  • 数据治理:在企业数据管理中的关键角色与实现路径——《DAMA 数据管理知识体系指南》读书笔记- 第 3 章
  • 从入门到精通:解析如何使用亚马逊云服务器(AWS EC2)
  • 证明面积不超过1/8的一组凸形状可以平移填充进面积为1的凸形状内而不重叠
  • 非root用户安装CUDA
  • [M最短路] lc743. 网络延迟时间(spfa最短路+单源最短路)
  • 【Redis_Day6】Hash类型
  • leetcode hot100【LeetCode 238.除自身以外数组的乘积】java实现
  • Flink Standalone集群模式安装部署全攻略
  • leetcode day12 贪心 605+44
  • 漫谈 module caching——PyCharm jupyter notebook 在导入模块被更新后无法及时同步问题
  • rabbitmq exchange queue topic的关系
  • 前端---HTML(一)
  • 【CSP CCF记录】201809-2第14次认证 买菜
  • SpringMVC-03-HelloSpring
  • 人工智能之数学基础:线性代数在人工智能中的地位
  • HttpServletRequest req和前端的关系,req.getParameter详细解释,req.getParameter和前端的关系
  • docker 安装arm架构mysql8
  • 全面解读RuoYi 系列项目不同版本与应用场景
  • Java中的集合体系