HarmonyOS 「校园二手交易商城」App应用实战 48:直播与购物袋联动

发布时间:2026/10/30 17:52:12

HarmonyOS 「校园二手交易商城」App应用实战 48:直播与购物袋联动 48 直播与购物袋联动系列五直播与画中画 · 第 8 篇对应工程features/multishoppinglivefeatures/multishoppingpayLiveUtil.ets、LiveBroadCastPage.ets、ShopBag.ets、PayCard.ets引言直播带货的闭环是看 → 点 → 买。前几篇把看做完了这篇打通点和买直播页底部购物袋入口LiveUtil→ 打开购物袋面板ShopBag→ 展示直播商品live_bag_product_1-4→ 点击「立即购买」拉起支付卡PayCard。整个联动横跨multishoppinglive与multishoppingpay两个特性模块靠LiveBroadCastPage的Event回调和panelType状态机串成一条完整的购买链路。入口LiveUtil 的购物袋按钮LiveUtil是直播页底部操作栏评论输入 分享/点赞/购物袋。购物袋按钮是红色圆钮点击通过Event上报父级Row(){SymbolGlyph($r(sys.symbol.bag_fill)).fontSize(24).fontColor([$r(sys.color.font_on_primary)])}.height(40).width(40).borderRadius(20).backgroundColor(#CF0A2C).justifyContent(FlexAlign.Center).alignItems(VerticalAlign.Center).onClick((){this.onOpenShopBag();})Event public onOpenShopBag: () void是 V2 组件的事件出口组件只负责我点了购物袋至于打开面板还是跳页面由父级决定。LiveBroadCast把它一路转发最终LiveBroadCastPage接住并打开面板。打开购物袋panelType 状态机LiveBroadCastPage用三个Local字段管理面板状态LocalpublicisDialogOpen:booleanfalse;// 面板是否显示LocalpublicisMoreDetail:booleantrue;// 是否展开更多详情LocalpublicpanelType:stringShopBag;// 当前面板类型购物袋入口统一走到同一段逻辑LiveBroadCast({onOpenShopBag:(){this.panelTypeShopBag;this.isMoreDetailtrue;this.isDialogOpentrue;}})这里做了三件事切换到购物袋面板、重置为更多详情态、打开面板。panelType是面板内容的状态机——只有两个值ShopBag购物袋与detailPayCard支付卡。面板内容区按panelType用visibility互斥显示Column(){ShopBag({...}).visibility(this.panelTypeShopBag?Visibility.Visible:Visibility.None)PayCard({...}).visibility(this.panelTypedetailPayCard?Visibility.Visible:Visibility.None)}面板呈现bindSheet 与侧栏同样的面板内容在不同断点下用不同容器承载小屏XS/SMColumn上挂bindSheet($$this.isDialogOpen, this.panelContent(), { height: 620vp, preferType: SheetType.CENTER, ... })620vp 的半屏居中弹窗$$双向绑定让面板收起时自动同步isDialogOpen false。大屏MD/LG/XLif (this.isDialogOpen) { this.sidePanel() }把面板作为右侧栏宽 37.5%直接嵌入页面左侧直播舞台压缩到 62.5%。小屏的bindSheet还配了enableOutsideInteractive: false禁止点击外部交互保证直播画面不被误操作与showClose: false用面板内部的关闭按钮。购物袋列表ShopBag 与 ShopListShopBag是购物袋容器头部ShopBagHeaderTabs分类 ShopList商品列表。头部图标来自ShopBagModel.getHeaderIcons正是资源文件icon_bag.svg购物袋、icon_search.svg搜索、icon_order.svg订单staticgetHeaderIcons(context:Context):ShopBagHeaderIconConfig[]{return[{icon:$r(app.media.icon_bag),name:...},{icon:$r(app.media.icon_search),name:...},{icon:$r(app.media.icon_order),name:...}];}ShopList渲染购物袋商品图片正是直播专属的live_bag_product_1-4.png与直播商品的live_product_1-8是两套资源购物袋是已加购的精选集合{image:$r(app.media.live_bag_product_1),name:iPad Air 5,remark:g($r(app.string.SHOP_BAG_P1_REMARK)),discounts:[g($r(app.string.SHOP_BAG_DISCOUNT_POINTS)),g($r(app.string.SHOP_BAG_DISCOUNT_FLAGSHIP))],price:2199}每件商品卡片尾部是立即购买按钮——它来自ShopBag向下注入的BuilderParam payCardButtonBuilderParampublicpayCardButton:()voidthis.payCardBuilder;// ShopList 内Row(){Text(this.currencyPrefixJSON.stringify(item.getPrice()))...Blank()this.payCardButton()// 渲染父级注入的按钮}BuilderParam让按钮成为可注入的插槽LiveBroadCastPage注入的正是payCardButton构建器——点击后panelType detailPayCard、打开支付卡面板BuilderprivatepayCardButton(){Text($r(app.string.LIVE_PAGE_BUY_NOW)).height(28).borderRadius(14).fontSize(12).backgroundColor(#CF0A2C).onClick((){this.panelTypedetailPayCard;this.isDialogOpentrue;})}购买流程从直播发起立即购买后链路变为ShopBag→PayCard。PayCard是支付卡组件通过两个Event与页面双向同步PayCard({isOpen:this.isDialogOpen,detailType:this.panelType,onIsOpenChange:(value:boolean){this.isDialogOpenvalue;},onDetailTypeChange:(value:string){this.panelTypevalue;if(valueShopBag){this.isDialogOpentrue;// 从支付卡返回购物袋}}})PayCard内部用SelectItem/SelectProjectItem提供支付方式选择getPayCardSelectList头部有关闭/返回按钮detailType detailPayCard时关闭面板否则onDetailTypeChange(ShopBag)退回购物袋。至此从直播页发起的看 → 点 → 买闭环完成。注意事项与总结事件只传意图onOpenShopBag是纯事件出口打开什么面板、怎么呈现由页面根据断点决定——小屏弹窗、大屏侧栏同一事件两套承载。panelType 互斥渲染ShopBag与PayCard用visibility互斥显示而非条件渲染两个组件常驻内存、切换零重建真实项目组件重时可改为if/else。BuilderParam 注入按钮payCardButton作为插槽从页面注入ShopBag再注入ShopList按钮的样式与行为可以完全自定义组件不感知。**双向绑定∗∗‘bindSheet( 双向绑定**bindSheet(双向绑定∗∗‘bindSheet(this.isDialogOpen, …)让面板关闭事件自动回写状态不用手动监听onDisappear 之外的回调。购买链路在直播页内部闭环入口按钮 → 购物袋 → 支付卡。接下来两篇回到视频本身播放控制与异常处理、以及 rawfile 资源管理。
延伸阅读

更多相关文章

2026/10/25 4:43:05

Python自动化求职机器人开发实战:从爬虫到邮件通知全流程

最近在技术社区看到不少关于“机器人找工作”的讨论,这背后其实是一系列自动化、智能化技术在招聘领域的深度应用与探索。对于开发者而言,这不仅是行业趋势,更是一个充满挑战和机遇的技术实践领域。本文将从一个技术实现者的角度,…

2026/10/25 16:09:48

2020秋招奇安信Java笔试题解析:从基础到安全编码全覆盖

2020年秋招的Java笔试题,现在回看依然很有参考价值。奇安信这份Java方向试卷2,我当时做完最大的感受是:常规知识点占了七成,但真正拉开分差的,是那三成带有安全思维烙印的题目。如果你准备的是网络安全类企业的Java岗&…

2026/10/30 17:51:03

C语言+easyX实现Flappy Bird:图形编程底层实战指南

简介:这是一份面向C语言初学者与图形编程入门者的Flappy Bird像素鸟游戏实战源码包,聚焦Windows平台下基于easyX图形库的游戏开发实践,帮助学习者掌握双缓冲绘图、物理模拟(重力/碰撞)、状态机管理及音效集成等核心技能…

2026/10/30 17:51:03

extract-xiso完全指南:Xbox光盘镜像提取与打包实战

简介:extract-xiso 是一款开源的光盘映像备份工具,专注于创建和提取 Xbox 游戏光盘的 .iso 文件,适用于 Linux、FreeBSD、macOS、Windows 等多个操作系统,目标用户是游戏备份爱好者、模拟器玩家及需要处理 Xbox 镜像的开发者。这份…

2026/10/30 17:46:02

地铁BAS PLC为何必须用STEP7 V5.5?兼容性与现场准入硬约束

简介:本资源是一套完整的地铁环境监控系统(BAS)PLC控制程序工程包,面向自动化、轨道交通及工业控制领域的工程师、高校师生与PLC初学者,聚焦西门子S7系列PLC在真实地铁场景中的工程化应用。资源基于STEP7 V5.5开发&…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑