低代码平台组件间通信方案复盘|全球观热点
3年前我开发了一款零代码搭建平台 H5-Dooring, 主要目的是想用更低的成本, 更快的效率, 上线 web 页面(其实是不想写重复的代码了,写麻了). 好在陆陆续续折腾了3年, 目前已经可以满足基本的页面设计和搭建能力, 并能快速上线页面.
之前也在社区分享了很多低代码和零代码的技术实现, 接下来继续和大家聊聊低代码平台中组件与组件之间的通信方案设计.
可视化搭建平台的基本能力根据我自己设计可视化搭建平台的经验, 其需要具备最最基本的两个能力:
(资料图片仅供参考)
静态页面设计能力(也就是可以用可视化平台制作我们想要的页面的能力)组件交互能力(制作好静态页面之后, 页面元素能具备一定的交互, 比如跳转链接, 打开弹窗等)以上的能力可以让我们将页面通过拖拽的方式搭建出来:
虽然这已经可以满足很多展示型的需求, 但是仍然存在局限性, 比如可视化平台的组件与组件之间, 没办法相互通信.
更灵活自主的可视化搭建平台这里给大家举一个实际的场景, 比如我们要做一个转盘H5页面, 它由转盘组件和按钮组件组成, 当点击按钮时, 转盘开始运动:
这种场景就需要转盘组件和按钮组件相互通信, 来实现交互功能. 所以在可视化搭建平台中, 如果能实现组件间的通信, 那将覆盖更多的业务场景, 从而为个人或者企业带来更大的价值.
接下来我将和大家分享一下低代码平台中组件间通信的几种方案, 共大家学习参考.
组件间通信的几种实现方案说到组件通信我们也许并不陌生, 比如在 vue或者 React框架中, 经常会涉及到父子组件通信以及组件与组件间的通信, 常用的方案也有很多, 比如:
props/$emit子组件向父组件传值eventBus($emit/$on)vuex / redux$attrs/$listenersprovide/inject当然还有很多方式能帮我们实现传统组件间的通信, 那我们在低代码组件中, 也可以参考类似的方式来实现, 但是唯一的区别是需要设计一套规则, 来保证组件间通信可以通过用户配置的方式来运转.
接下来我们来分析几种低代码组件间的通信方案.
1.websocket在设计组件通信方案前, 我们需全局维护一个公共的状态, 拿 H5-Dooring可视化平台 举例, 我们用 redux管理公共状态, 组件间通信本质就是触发公共状态的更新:
为了保证低代码组件库足够纯净, 比如不应该在组件里连接 redux, 所以我们需要把 redux触发器 dispatch放在页面的全局, 这里就可以用 websocket, 在组件里触发 socket指令, 在页面全局来监听, 并触发 dispatch:
当然使用 socket的方式仍然会让低代码组件库负重前行(虽然能实现更自由的通信场景, 比如组件自更新, 生命周期回调, 控制业务钩子等), 因为我们不得不为其搭建 socket服务, 并且需要为其设计稳定的通信桥梁, 比如 socket心跳连接等.
2.iframe通信 postmessage利用 iframe的 postmessage等 API虽然也能实现组件间通信, 但是我们需要设计一套通信机制, 保证 iframe能接受组件传送的指令, 并对外暴露共享状态:
我们从 Iframe的通信模式可以发现它不仅可以作为中间桥梁起到通信作用, 有点类似于 eventBus的模式, 而且还可以实现页面间的通信, 比如目前很多微前端架构的底层支持也有采用 iframe 来设计的. 但是对于更细粒度的低代码组件来说, 有点小题大作了.
接下来给大家分享一下 iframe通信的基本代码实现:
//父页面和子页面通信//A.html(父)3.Event Emittersconstmsg={name:"H5-Dooring"}window.onload=()=>{//自动调用必须放在onload中,通过事件调用则不用//letframe=document.querySelector("#Bframe").contentWindowletframe=window.frames[0]frame.postMessage(msg,"http://h5.dooring.cn/preview")}//B.htmlwindow.addEventListener("message",(e)=>{console.log(e.data)console.log(e.origin)console.log(e.source)})//子页面和父页面通信//A.html(父) window.addEventListener("message",(e)=>{console.log(e.data)console.log(e.origin)console.log(e.source)})//B.htmlconstmsg={name:"DooringH5"}window.top.postMessage(msg,"http://h5.dooring.cn/preview")
Event Emitters的方式我觉得是最适合低代码组件间通信的方案, 类似于 js里的事件监听机制, 我们可以给 dom绑定监听, 并暴露事件给用户来实现手动触发机制. (虽然不一定是用户手动触发, 也有一种情况是逻辑触发, 比如当页面某个组件到达某一状态的时候, 后自动触发事件, 来改变其他组件的状态)
Event Emitters类似一种观察者模式, 我们可以利用 javascript 的设计模式来实现它, 并在组件内部来监听或者触发, 一个简单的实现如下:
interfaceEvents{[key:string]:Function[];}exportclassEventEmitter{publicevents:Events;constructor(events?:Events){this.events=events||{};}publicsubscribe(name:string,cb:Function){(this.events[name]||(this.events[name]=[])).push(cb);return{unsubscribe:()=>this.events[name]&&this.events[name].splice(this.events[name].indexOf(cb)>>>0,1)};}publicemit(name:string,...args:any[]):void{(this.events[name]||[]).forEach(fn=>fn(...args));}}
具体设计流程有点像我之前设计的 iframe通信架构, 不过使用起来会更简单:
低代码组件事件队列设计以上只实现了组件的通信, 并没有将通信和实际的应用场景结合起来, 比如低代码用户需要如何操作,才能实现组件通信. 这里我之前也设计了一套模型:
每个组件都有一套事件列表, 用户可以给一个组件添加多个交互事件, 在第代码内部通过循环遍历来依次触发事件队列:
事件通信就可以用上面介绍的 Event Emitters来实现, 具体的低代码模式可以参考我之前的项目:
H5-Dooring可视化低代码平台
总结后续我会继续和大家分享一下 H5-Dooring 低代码的更多实践和思考, 如果大家对可视化低代码感兴趣也可以参考我的低代码可视化专栏.
下一篇文章我会和大家分享一下低代码印章组件的实现方案, 大家有更多好的建议也可以随时和我反馈.
H5-dooring低代码
V6.Dooring可视化大屏搭建平台
从零搭建全栈可视化大屏制作平台V6.Dooring
从零设计可视化大屏搭建引擎
Dooring可视化搭建平台数据源设计剖析
可视化搭建的一些思考和实践
基于Koa + React + TS从零开发全栈文档编辑器(进阶实战
点个在看你最好看
精彩推送
新闻快讯
X 关闭
X 关闭
新闻快讯
- 低代码平台组件间通信方案复盘|全球观热点
- 首款天玑9000平板发布:双c口好评 世界焦点
- 叮当钱包借款逾期15个月延迟还款会影响征信吗|今日最新
- 打击黑灰产、更改会员登录规则 长视频平台能否借此破局?
- 环球热头条丨央视春晚最新动态!朱迅挑大梁,赵本山潘长江蔡明,确认无缘
- 美媒:美众议院投票决定休会,议长之争再延一天
- 环球快播:特斯拉国产车型降价
- 中矿资源:公司整体经营情况良好_当前资讯
- 佛山南风古灶怎么预约?(预约平台+预约流程) 当前观点
- 世界快消息!四维图新董秘回复:公司严格按照相关法律法规进行信息披露
- 美媒:美执法机构依赖技术导致错误抓捕 有色人种被误识可能性高于白人100倍_热门
- 速读:今年将帮助10万名高校毕业生实现就业
- 环球热讯:汽车经销商年末盈利状况不佳 一半出现亏损
- 男子在航班上喊飞机要出事并冲击前舱门,海航回应
- 长三角铁路2023年春运方案出台 预计发送旅客6000万人次
- 【时快讯】直播砍价套路深 虚情假意的表演该下课了
- 国电南瑞董秘回复:二级市场的股价波动受诸多因素影响,请投资者客观看待市场波动并注意投资风险
- 全球热议:李商隐的一首借古讽今的咏史诗,抒发自己壮志难酬的感伤!
- 当前讯息:过年相亲,没条“战袍”怎么行?
- 资阳:一季度推进重点项目379个 总投资2577.5亿元
- A股异动 | 赛力斯涨4% 12月赛力斯汽车销量同比增逾3倍-当前讯息
- 广告语频受质疑,海信“擦边营销”能走多远?
- 恶意消遣孩子拍短视频违背立法精神-每日报道
- 连拉8涨停!发生了什么?交易所紧急下发关注函
- 京东物流(02618.HK)授出523.86万股奖励股份
- 有色金属|枯木逢春?2023年的工业金属,券商怎么看?
- 我的世界熊猫怎么驯服 我的世界熊猫的驯服和喂养方法 今日精选
- 九龙坡区10岁小孩抚养费给付的方式有哪些
- 世界热资讯!晚上玩手机的毛病怎么改?
- 成都成华区吸入式新冠疫苗到苗通知(持续更新)_环球速递
- 【龙虎榜】鼎际得12月30日成交明细 世界快消息
- 蓝帆医疗董秘回复:公司生产、销售正常,各类订单充足,但因为防疫政策的调整
- 84消毒液味道多久散尽 84消毒液味道怎么消除_环球焦点
- 当前最新:美股异动 | 教育部文件称非学科类培训机构不得一次性收费超5000元 中概教育股普跌
- 聚和材料(688503.SH):2022年度净利预增49.93%-58.04%
- 懵了!亚太股市集体杀跌,发生了什么?
- 2022职业院校同上一堂思政大课人民网观看入口(指南)-当前要闻
- ppmoney借款逾期一年拖欠多久会上征信
- 明美新能拟在深交所创业板上市募资4.5亿元,投资者可保持关注
- 每日快讯!湖南岳阳城陵矶港成长江中上游第三个百万标箱港口
- [快讯]万顺新材:民生证券股份有限公司汕头万顺新材集团股份有限公司使用募集资金向全资子公司增资并由全资子公司向全资下属公司增资以实施募集资金投资项目的核查意见 全球热点评
- 公司遭重罚,原董事长被捕, *ST吉药保壳能成功么?
- 每日信息:2022年山东省年终决算期间暂停办理税费缴纳业务的通知
- 2023春运中山哪些人返乡需要隔离?
- 西北妇女儿童医院病毒性感冒线上咨询操作步骤(附入口)
- 租客不搬走也没有租房合同怎么办?-环球聚焦
- 东北证券:公司暂无定增相关计划 焦点速看
- 即时:我国黑土资源分布特征、土层结构等情况基本查清
- 国家规定的产假是怎么休息的?
- 最火发型17款,百变还时尚,看看有没有你的菜_天天观察