《仿盒马》app开发技术分享-- 分类模块顶部导航列表弹窗(16)

举报
yd_215151764 发表于 2025/06/30 10:24:40 2025/06/30
【摘要】 ## 技术栈Appgallery connect## 开发准备上一节我们实现了分类页面的顶部导航栏列表,并且实现了首页金刚区跟首页导航栏的联动,这一节我们实现导航栏列表的弹窗功能,需要学习的知识点有自定义弹窗,同时我们的数据源需要跟分类页保持一一致。## 功能分析**1.弹窗**自定义弹窗的实现,然后我们需要在弹窗创建的时候实现数据的同步,当我们在弹窗未出现的时候进行列表下标的切换,打开弹窗...


## 技术栈

Appgallery connect


## 开发准备

上一节我们实现了分类页面的顶部导航栏列表,并且实现了首页金刚区跟首页导航栏的联动,这一节我们实现导航栏列表的弹窗功能,需要学习的知识点有自定义弹窗,同时我们的数据源需要跟分类页保持一一致。

## 功能分析

**1.弹窗**
自定义弹窗的实现,然后我们需要在弹窗创建的时候实现数据的同步,当我们在弹窗未出现的时候进行列表下标的切换,打开弹窗的时候需要把对应的index传递进去,选中状态要保持同步。同时在弹窗内选择分类,外部列表也要同步切换,并且每次切换都要在list允许居中的情况下实现选中的item居中。

## 代码实现

首先实现弹窗的创建数据的传入,和选择后的回调
@Link select:number;
  @Link dataSource: SplitLayoutModel[];
   onItemSelected: (item: number) => void= () => {
   };
  controller: CustomDialogController;

然后实现相关布局以及逻辑
build() {
    Column() {
      Text('全部分类')
        .fontSize(14)
        .margin(12)
        .width('100%')
        .textAlign(TextAlign.Start)
        .fontColor(Color.Black)


      Grid() {
        ForEach(this.dataSource, (item: SplitLayoutModel,index:number) => {
          GridItem() {
            Column() {
              // 图片部分
              Image(item.url)
                .width(40)
                .height(40)
                .borderRadius(20)
                .border({width:this.select === index?2:0,color:"#409EFF"})

              // 文本部分
              Text(item.txt)
                .textAlign(TextAlign.Center)
                .fontColor(Color.Black)
                .fontSize(10)
                .padding(2)
                .margin({top:5})
                .fontColor(this.select === index?"#FFFFFF":"#000000")
                .backgroundColor(this.select === index ? '#409EFF' : '#FFFFFF')
                .borderRadius(this.select === index ? 15:0)
            }
            .onClick(() => {
              if (this.select === index) {
                this.select = 0
              } else {
                this.select = index
              }
              this.onItemSelected?.(index);
              this.controller.close();
            })
          }
        })
      }
      .columnsTemplate('1fr 1fr 1fr 1fr 1fr')
      .layoutDirection(GridDirection.Row)
      .maxCount(5)
      .layoutWeight(1)
      Text("收起")
        .padding(10)
        .fontSize(16)
        .width('100%')
        .textAlign(TextAlign.Center)
        .fontColor(Color.Black)
        .onClick(()=>{
          this.controller.close()
        })
    }
    .margin({top:80})
    .width('90%')
    .backgroundColor(Color.White)
    .borderRadius(16)
    .padding(12)
  }
}
可以看到我们已经在item的点击事件中引用了回调,然后我们回到列表组件页面,实现回调
dialogController: CustomDialogController = new CustomDialogController({
    builder: CustomImageGridDialog({
      select:this.selectedIndex,
      dataSource: this.list,
      onItemSelected: (item: number) => {
        this.onItemClick!(item)
      }
    }),
    alignment: DialogAlignment.Top,
    customStyle:true
  });
在这里我们实现下标的修改监听
 onChange(){
    this.listScroller.scrollToIndex(this.selectedIndex, true, ScrollAlign.CENTER)
  }
  确保每一次下标的修改,list都能实现居中,到这里我们的弹窗和金刚区以及列表的联动都已经实现了

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。