当前位置: 首页
前端开发
手把手带你实现Vue源码中的发布订阅模式

手把手带你实现Vue源码中的发布订阅模式

热心网友 时间:2026-07-18
转载

发布订阅模式通过调度中心中转信息,实现发布者与订阅者解耦。Vue响应式系统结合数据劫持与发布订阅,核心角色包括订阅者、调度中心和发布者。代码示例展示了典型实现:订阅者注册事件到调度中心,发布者触发事件时执行对应回调。

今天聊聊发布订阅模式。这玩意儿其实挺生活化的——你微信上关注了一堆公众号,哪天这些号更新了,微信就会弹个通知告诉你。说白了,这就是发布订阅的一种简单写照。

关键点在于:发布者和订阅者之间并不直接打交道,而是通过一个调度中心来中转信息。一个事件可以被多个订阅者监听,一个订阅者也能同时关心多个不同的事件

手把手带你实现发布订阅模式--Vue源码

Vue的响应式系统,本质上就是数据劫持跟发布订阅模式结合后的产物。想真正理解Vue的设计思路,绕不开对这个模式的理解。

整个模式里,有三个核心角色:

  • 订阅者:把自己想监听的事件,提前登记到调度中心里。
  • 调度中心:当发布者通知有任务时,由它负责唤起所有相关的订阅者(也就是执行他们留下的代码)。
  • 发布者:把任务或事件,推送到调度中心。

理论说太多容易晕,直接看代码实现。

 复制代码html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
head>
<body>
    <script>
        class Publish {
            constructor() {
                // 调度中心,订阅者把自己要订阅的东西注册到这里
                // this.events = {
                //      event1: [fn1, fn2, fn3]
                //      event2: [fn1, fn2]
                //}
                this.events = {}
            }            // 订阅,订阅者把把事件注册到调度中心
            $on(type, fn) {
                if (!this.events[type]) {
                    this.events[type] = []
                }                this.events[type].push(fn)
            }            // 发布,通过调度中心发布
            $emit(type) {
                if (this.events[type]) {
                    const args = Array.prototype.slice.call(arguments, 1)
                    this.events[type].forEach(fn => {
                        fn(...args)
                    });
                }
            }
        }        const eventHub = new Publish()        // 订阅:把事件注册到调度中心
        eventHub.$on('sum', function() {
            const total = [...arguments].reduce((x, y) => x + y)
            console.log(total)
        })        // 发布:如果有人订阅,那么就执行注册的代码
        eventHub.$emit('sum', 1, 2, 3)
    script>
body>
html>

发布订阅的实现方式有很多种,上面这段代码展示的,是Vue里比较典型的一种思路。

接下来,再看看观察者模式。

来源:https://juejin.cn/post/7660707431753891846

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
如何用JavaScript动态修改页面Meta元数据

如何用JavaScript动态修改页面Meta元数据

使用JavaScript可通过document querySelector定位并修改已有meta标签的content属性,或动态创建meta元素插入文档头部。该方法适用于单页应用更新页面描述、OpenGraph及Twitter卡片数据,但搜索引擎爬虫与社交平台通常不执行JS,动态修改对SEO和分享抓取无效,可靠方案仍需服务端渲染或静态生成。

时间:2026-07-18 18:23
原生HTML模态对话框焦点陷阱无障碍实现原理

原生HTML模态对话框焦点陷阱无障碍实现原理

使用`dialog showModal()`可自动实现焦点陷阱与Tab循环,无需JavaScript。纯CSS或`inert`属性无法循环焦点,只有正确声明模态上下文才能满足WCAGA级无障碍标准。

时间:2026-07-18 18:23
VS Code扩展调试获取当前工作目录与项目根路径

VS Code扩展调试获取当前工作目录与项目根路径

在VSCode扩展开发中,`process cwd()`默认指向扩展目录而非用户项目,且不能`chdir`。应使用`vscode workspace workspaceFolders`API动态获取项目根目录,注意处理空值并避免已弃用的`rootPath`。

时间:2026-07-18 18:22
React Leaflet地图中心与缩放动态控制实战教程完整版

React Leaflet地图中心与缩放动态控制实战教程完整版

在React-Leaflet中,通过按钮点击跳转至指定坐标并调整缩放级别,应使用whenCreated获取Leaflet原生地图实例,调用setView或flyTo方法,避免依赖center zoomprops的响应式更新,以确保性能与状态一致性。

时间:2026-07-18 18:19
如何用事件委托实现动态卡片翻转的原生JS

如何用事件委托实现动态卡片翻转的原生JS

针对动态生成的卡片列表,采用事件委托将监听器挂载到父容器,利用事件冒泡精准捕获点击目标。通过class替代重复ID,使用card querySelector()限定局部作用域,配合closest()定位卡片容器,实现翻转与还原功能。该方法避免全局查询与状态污染,确保多卡片独立控制,提升性能与可扩展性。

时间:2026-07-18 18:18
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜