sf-utils2 sf-utils2
版本v3.3.3-beta1
首页
  • 01.快速开始 🔥
  • 02.基础-Base
  • 03.对象-Object
  • 04.数组-Array
  • 05.方法-Function
  • 06.字符串-String
  • 07.数学-Math
  • 08.dom
  • 09.拓展
  • webpack5.x教程学习 (opens new window)
  • 例子
  • 教程 🔥
  • 例子配置
企业级后台模版 (opens new window)
版本v3.3.3-beta1
首页
  • 01.快速开始 🔥
  • 02.基础-Base
  • 03.对象-Object
  • 04.数组-Array
  • 05.方法-Function
  • 06.字符串-String
  • 07.数学-Math
  • 08.dom
  • 09.拓展
  • webpack5.x教程学习 (opens new window)
  • 例子
  • 教程 🔥
  • 例子配置
企业级后台模版 (opens new window)
  • 快速开始

  • 基础-Base

  • 对象-Object

    • 序言 👏
    • has【对象含有属性(功能更强大)】
    • hasOwn【对象含有属性(扩展)】
    • deepClone【深度克隆】
    • setPropPath【给每个对象设置路径节点名】
    • findPropPath【从对象中找到键名路径名】
    • get【获取对象属性值】🔥🔥🔥
    • flatten 【将对象进行扁平化】
    • readonly【定义只读属性】
    • def【定义不可枚举属性】
    • cache【内存缓存对象】
    • bus【发布订阅】🔥🔥🔥
      • 1.示例
      • 2.入参说明
        • 2.1 实例方法说明
      • 3.源码
    • merge 【合并对象】
    • deepMerge 【递归深合并对象】
    • transformObjectKeys【对象属性字段全部转成大写或者小写】
    • convertPropToLower【对象属性字段全部转成大写或者小写】
    • looseEqual【比较对象内部结构和数据】🔥🔥🔥
    • omit【忽略对象属性】
    • pick【取出对象属性】
  • 数组-Array✨✨✨

  • 方法-Function

  • 字符串-String

  • 数学-Math

  • 文件-Buffer

  • 节点-dom

  • 拓展

  • nodejs

目录

bus【发布订阅】🔥🔥🔥

描述

用于发布订阅,解决一些跨组件通讯问题,订阅、卸载、发布。 v3.0.15+
支持跨页面通讯,比如在小程序 webview、浏览器不同的 tab 页实现通讯(注意:只支持同源策略的站点),跨 tab 页通讯,底层内部使用BroadcastChannel, 如果不支持BroadcastChannel,降级处理通过监听localStorage变化来监听v3.0.23+

警告

⚠️⚠️⚠️ bus 默认是开启跨浏览器tab页通讯的,可以通过设置 isTabCross属性
isTabCross属性是 v3.3.2-beta1+
v3.3.3-beta1+ 新增属性isCrossDomain支持跨域通讯,底层对postMessage二次封装

# 1.示例

import { bus } from 'sf-utils2'

const effects = [] // 事件副作用
let increment = 0

// 1、订阅: listen for different types of events
bus.on('message', handler)
bus.on('message', () => console.log('Message event fired'))
bus.on('increment', () => increment++)

// 2、发布事件: emit events to invoke all handlers subscribed to them, passing the data to them as an argument
bus.emit('message', 'hello world') // logs 'hello world' and 'Message event fired'
bus.emit('message', { hello: 'world' }) // logs the object and 'Message event fired'
bus.emit('increment') // `increment` variable is now 1

// 3、关闭发布跨tab或者小程序不同页面通讯
第一种方式,默认关闭跨tab或者小程序不同页面通讯,针对所有的订阅事件
bus.isTabCross = false

第二种方式,在emit的时候,传递参数,最后一个参数对象`{isCrossTab: boolean}`为是否跨浏览器tab页或者小程序不同页面通讯,默认为true,设置为false,则取消跨浏览器tab页或者小程序不同页面通讯
bus.emit('[时间名称]', { isCrossTab: false })
bus.emit('[时间名称2]', {id: 1}, 1, 2, { isCrossTab: false })  // 最后一个参数是普通对象且属性isCrossTab设置为false即可

第三种方式
bus.on('[时间名称3]', (...args) => {}, {isCrossTab: false})
或
const handler = (...args) => {}
handler.isCrossTab = false
bus.on('[时间名称3]', handler)


// 4、普通方式取消订阅: stop a specific handler from listening to the 'message' event
bus.off('message', handler)

// 5、也可以通过自身返回值,取消事件
const busListener = bus.on('increment', () => increment++)
busListener.off()

// 6、也可以调用方法取消,清除所有副作用,主要为了防止使用者忘记销毁事件订阅,导致内存泄漏
const effects = []
effects.push(
  bus.on('message2001', () => console.log('Message event effects001')),
  bus.on('message2002', () => console.log('Message event effects002'))
)
bus.clearEffects(effects) // 这将会把message2001和message2002监听事件取消

// 7、根据订阅时间名称,取消所有订阅示例
bus.on('messge001', () => {})
bus.on('messge001', () => {})
bus.offEntire('messge001') // ⚠️这里将会取消所有message001 订阅事件


// 跨浏览器tab页或者小程序不同的webview,统一站点下通讯
// 最后一个参数 eventTarget,BroadcastChannel中onmessage事件中 或者 storage事件 回调参数
bus.on('[自定义事件名]', (...args, eventTarget) => {
})

// 8、跨域访问或者iframe通讯
bus.emit('[自定义事件名]', ...args, { isCrossDomain: true }) // 在最后的参数设置 isCrossDomain true,则表示跨域访问或者iframe通讯 

// 方式一
bus.on('[自定义事件名]', () => {}, { isCrossDomain: true })
// 方式二
const handler = (...args) => {}
handler.isCrossDomain = false
bus.on('[自定义事件名]', handler)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

:::

# 2.入参说明

参数 说明 类型 是否必填 默认值

# 2.1 实例方法说明

方法名 说明 入参
emit 通知 --------
dispatchEvent 等价于 emit --------
on 订阅事件 --------
addEventListener 等价于 on --------
off 移除监听事件 --------
removeEventListener 等价于 off --------
offEntire 移除监听事件【整个】 --------
removeEventListenerEntire 等价于 offEntire --------
clearEffects 清除监听事件 --------

# 3.源码

import _helperEventBus from '@/_helper/_helperEventBus'

/**
 * bus事件总线
 * @version v3.0.9+
 * @type {{offEntire(String): void, dispatchEvent(): void, removeEventListener(): void, hub: null, removeListenerEventEntire(): void, emit(String): void, off(String, Function): void, on(String, Function): void, addEventListener(): void}}
 */
const bus = _helperEventBus()

export default bus
1
2
3
4
5
6
7
8
9
10
上次更新: 2025/07/03, 11:09:16
cache【内存缓存对象】
merge 【合并对象】

← cache【内存缓存对象】 merge 【合并对象】→

Theme by Vdoing | Copyright © 2022-2025 bianpengfei
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×