尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

鸿蒙自定义弹出框响应式更新数据

鸿蒙自定义弹出框响应式更新数据
📅 发布时间:2026/6/20 13:36:53

鸿蒙自定义弹出框响应式更新数据

1.原因:

openCustomDialog不支持自定义组件使用@Reusable、@Link、@Provide、@Consume等装饰器,来同步弹出框弹出的页面与ComponentContent中自定义组件的状态

2.解决

class Params { // 要调用@Component里面的方法需要使用参数接收onClose?: () => void; // 关闭弹窗方法selStockroom?: (index:number) => void; // 选择方法stockroomList: IPartsStockItem[]; // 数据传入constructor(onClose?: () => void, stockroomList?: IPartsStockItem[], selStockroom?: (index:number) => void) { // 通过constructor接收this.onClose = onClose;this.stockroomList = stockroomList || [];this.selStockroom = selStockroom}
}@Builder
function shareDialog(params: Params) { // 弹框主体Column() {Row() {Text('请选择仓库').fontColor('#333').fontSize(fts('33lpx')).margin({ bottom: '40lpx' })}.width('100%').justifyContent(FlexAlign.Center)Column() {ForEach(params.stockroomList, (item: IPartsStockItem, i: number) => {Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {Text(item.name).fontSize(fts("32lpx"))if (item.selected) {Image($rawfile("icon/fukuanzhong_ico_select.png")).width("32lpx").height("32lpx")} else {Image($rawfile("icon/fukuanzhong_ico_noselect.png")).width("32lpx").height("32lpx")}}.onClick(() => {params.selStockroom?.(i) // 通过params调用@Component方法}).margin({ bottom: "24lpx" })})}}.backgroundColor('#FFFFFF').width('70%').padding('60lpx').borderRadius('20lpx')
}
@Component
export struct PartsCollection {
  
controller: SearchController = new SearchController();
  @State stockroomList: IPartsStockItem[] = []
  private contentNode: ComponentContent<Object> =
  new ComponentContent(this.ctx, wrapBuilder(shareDialog), new Params((): void => this.closeDialog(), this.stockroomList)) // 创建conetntNode,此时不可以传入异步数据,否则会是undefined
  private options: promptAction.BaseDialogOptions = { alignment: DialogAlignment.Center, offset: { dx: 0, dy: 50 } } // 设置弹框显示位置

openDialog() {
if (this.contentNode !== null) {
// 确保传递正确的参数类型
this.contentNode = new ComponentContent(
this.ctx,
wrapBuilder(shareDialog),
new Params((): void => this.closeDialog(), this.stockroomList, (index:number): void => this.selStockroom(index)) // 此时可以传入异步数据
);
this.ctx.getPromptAction()
.openCustomDialog(this.contentNode, this.options)
.then(() => {
Log.info('OpenCustomDialog complete.')
})
.catch((error: BusinessError) => {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
Log.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);
})
}
}

closeDialog() {
if (this.contentNode !== null) {
this.ctx.getPromptAction()
.closeCustomDialog(this.contentNode)
.then(() => {
Log.info('closeCustomDialog complete.')
})
.catch((error: BusinessError) => {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
Log.error(`closeCustomDialog args error code is ${code}, message is ${message}`);
})
}
}

selStockroom(index: number) {
const arr = [...this.stockroomList]
for (let i = 0; i < arr.length; i++) {
arr[i].selected = index == i;
}
this.stockroomList = arr // 修改了传入的数据
if (this.contentNode) {
this.contentNode.update( // 动态修改传入的数据,让数据更新达到响应式效果
new Params(
(): void => this.closeDialog(),
this.stockroomList, // 传递已更新的列表
(index: number): void => this.selStockroom(index)
)
);
}
}

}

 

相关新闻

  • 多机动模型PHD滤波算法
  • 时序InSAR形变结果合并操作说明 - ENVI
  • 第一周博客作业-介绍自己

最新新闻

  • 零投诉零纠纷!2026沈阳黄金回收标杆品牌合扬实力认证 - 奢侈品交易观察员
  • 夸克网盘链接解析直链链接_在线解析网盘链接
  • 【图像隐写】基于DWT、SVD和扩频技术混合可见-隐形水印系统(将彩色标志和强大的隐藏水印嵌入图像中附Matlab代码
  • Qwen3-VL技术报告实操解剖:双塔对齐、动态桥接与工业级微调指南
  • HDRI转立方体贴图终极指南:3步让3D场景光照真实感翻倍
  • 5分钟搞定M3U8视频下载:免费工具让加密视频轻松保存

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号