美文网首页
关于鸿蒙的自定义弹窗Dialog 数据绑定 功能--思来想去

关于鸿蒙的自定义弹窗Dialog 数据绑定 功能--思来想去

作者: 林下人水边兵 | 来源:发表于2023-03-30 21:30 被阅读0次

方案1 :(不是很优雅):可以通过@link 将数据进行绑定

缺点: 弹窗的公用性 就差了点(如果公用的话,绑定的数据结构 有可能是 string list , number 大概就是这个意思)

步骤 1: 将 builder的布局 自定义组件 再通过 @link @state 搭配使用,效果是可以实现的
  dialogController: CustomDialogController = new CustomDialogController({
    builder: DialogOperation({ list: $dialogItemList}),
    autoCancel: true,
    alignment: DialogAlignment.Bottom,
    offset: { dx: 0, dy: -20 },
    gridCount: 4,
    customStyle: false
  })

自定义组件代码

import { DialogItem } from '../model/DialogItem';

@CustomDialog
export struct DialogOperation {
  controller: CustomDialogController

  @Link list: Array<DialogItem>

  build() {
    Column() {
      List({ space: 1, initialIndex: 0 }) {
        ForEach(this.list, (item: DialogItem) => {
          ListItem() {
            Column() {
              Text(item.name)
                .fontSize(16)

            }
            .width('100%')
            .height(56)
            .justifyContent(FlexAlign.Center)
            .alignItems(HorizontalAlign.Center)
            .onClick(() => {
              this.controller.close()
            })
          }
        })
      }.width('100%')

    }
  }
}

方案2: 通过添加 callback 将数据回调出来,再进行绑定 , 这样我们就不用跟dialog 强绑定了。

步骤1. 在自定义组件 新增回调方法,直接看代码
import { DialogItem } from '../model/DialogItem';

@CustomDialog
export struct DialogOperation {
  controller: CustomDialogController
  onItemClick: (item: DialogItem) => void
  @Link list: Array<DialogItem>

  build() {
    Column() {
      List({ space: 1, initialIndex: 0 }) {
        ForEach(this.list, (item: DialogItem) => {
          ListItem() {
            Column() {
              Text(item.name)
                .fontSize(16)

            }
            .width('100%')
            .height(56)
            .justifyContent(FlexAlign.Center)
            .alignItems(HorizontalAlign.Center)
            .onClick(() => {
              this.controller.close()
              this.onItemClick(item)
            })
          }
        })
      }.width('100%')

    }
  }
}

这里的 list的元素 我们用一个结构类包裹,不同数据 直接扔在 DialogItem 里面就好 ,大概代码 如下

export class DialogItem {
  constructor(name, data) {
    this.name = name
    this.data = data
  }

  name: string
  data?: {
    [key: string]: any;
  }
  
}
步骤 2 : 在主页里 接受回调回来的数据,再渲染到ui界面上。大致如下
  //
  dialogController: CustomDialogController = new CustomDialogController({
    builder: DialogOperation({ list: $dialogItemList,
      onItemClick: es=>{ this.item.dialogItem=es} }),
    autoCancel: true,
    alignment: DialogAlignment.Bottom,
    offset: { dx: 0, dy: -20 },
    gridCount: 4,
    customStyle: false
  })

通过 onItemClick 回调 返回 es数据, 再绑定到ui上, 这里需要注意

不要将onItemClick方法,直接在里面写** es=>{绑定逻辑}** 单独抽离出去,抽离出去绑定就失效了,具体原因 大概就是 this发生变化。不是主页的this引用了

记录一下 遇到的问题,如有错误,欢迎纠正
-------by Sandsboy

相关文章

  • Android轻量级浮层弹窗。封装Dialog。

    UpperDialog Android轻量级弹窗。 自定义Dialog弹窗,自定义大小和位置,进出场方式。链式调用...

  • Android-Dialog正常化配置

    Android上的弹窗,一般使用Dialog来实现,如果需要自定义弹窗,也是继承Dialog来实现,但是往往有一些...

  • Android-Dialog正常化配置

    Android上的弹窗,一般使用Dialog来实现,如果需要自定义弹窗,也是继承Dialog来实现,但是往往有一些...

  • 关于弹窗Dialog,Toast,PopupWindow,Sna

    关于弹窗Dialog,Toast,PopupWindow,SnackBar总结分析目录介绍:0.关于弹窗概述1.关...

  • WebView自定义长按图片功能

    关于Webview长按图片功能,系统默认自带菜单弹窗,但是某些场景我们需要自定义菜单功能,此时就需要屏蔽系统弹窗,...

  • WebView自定义长按图片功能

    关于Webview长按图片功能,系统默认自带菜单弹窗,但是某些场景我们需要自定义菜单功能,此时就需要屏蔽系统弹窗,...

  • 自定义vue组件

    (1) 自定义组件dialog.vue (2) 页面调用 (3) 弹窗效果展示 拓展:vue自定义组件点击页面其他...

  • flutter自定义Alert Dialog弹窗

    作为一个ios的开发,很瞧不上系统flutter Dialog弹窗太丑了,不过我们可以通过继承Dialog来自定义...

  • Android XPopup弹窗

    一、前言: 功能强大,UI简洁,交互优雅的通用弹窗,可能是Android平台最好的弹窗库!可以替代Dialog,P...

  • Dialog

    安卓dialog的使用+如何自定义dialog自定义Dialog自定义Dialog 自定义

网友评论

      本文标题:关于鸿蒙的自定义弹窗Dialog 数据绑定 功能--思来想去

      本文链接:https://www.haomeiwen.com/subject/gfmcddtx.html