Lightning Message Service — Publish & Subscribe

DEX475 - Lightning App Builder

📄 第 363 页 🎬 视频课程

课程章节介绍

咱们这节课来聊聊 Lightning Web Components 里组件之间怎么互相通知消息,也就是“发布-订阅”模式。你想象一下,两个组件在不直接认识的情况下,一个组件发消息,另一个组件收消息,就像广播电台和收音机。 先看发布消息这一边。你调用一个叫 `publish()` 函数,它需要三个东西: - 第一个,是当前页面的消息上下文,这个通过 `@wire(MessageContext)` 自动帮你拿到。 - 第二个,是你之前导入的那个,消息通道,引用,相当于你选定了要往哪个频道广播。 - 第三个,是你要发出去的,有效负载,,就是一个普通的 JavaScript 对象,里面装你想传的数据。 注意哦,那个用 `@wire(MessageContext)` 拿到的上下文,会自动在组件销毁时注销,你完全不用手动去清理它,非常省心。 接下来是订阅消息这一边,它要老老实实跟着组件的生命周期走: - 在 `connectedCallback` 里执行订阅。为了防止你重复订阅,框架已经帮你做了保护,即使这个回调被调用多次,也不会出问题。 - 在 `disconnectedCallback` 里一定要取消订阅,不然组件被移除了,它还在那傻等消息,就可能出内存问题。 订阅者收到消息后,拿到了那个有效负载,通常怎么用呢?一般就是顺手更新组件里的某个,反应属性,,比如 `recordId`,这样就能触发用 `@wire` 装饰器重新加载数据,界面也就跟着刷新了。 那可能你会问,如果我的组件不是继承自 `LightningElement`,而是那种 API 模块组件(比如一段纯 JS 逻辑),我还能用 `@wire(MessageContext)` 吗?答案是不能,因为 `@wire` 只能在 LWC 组件里用。那怎么发消息呢?这时候就要用 `deliverMessage()` 函数来发,订阅方则用 `releaseMessage()` 来取消,这两个函数专门给非 UI 场景准备的。 最后说说这个消息发布订阅服务(我们常叫它 MPS)能用在哪儿: - 它在 ,Flex 页面,、,移动应用程序,(而且这里只支持 LWC 和 Aura 混用)以及 ,Experience Builder, 的站点里都能正常工作。 - 但是!在 Salesforce 经典选项卡加 Visualforce 页面的组合里,或者 Experience Builder 里嵌入 Visualforce 时,它是不支持的。 - 那在这些不支持的容器里怎么办呢?你就得用老式的 ,pubsub 模块,(遗留工具)来实现了。 好了,记住这几个点,你就能灵活地在组件之间传递消息,实现更解耦的设计了。下节课我们聊聊具体的代码怎么写。

关键词

LWC Lightning Web Components Salesforce