鸿蒙OS ArkTS 省市县级联选择框,封装组件

news2024/9/24 11:22:19

背景:

公司现在要开发纯血鸿蒙版本APP,我被抽调过来做点功能。现在要做一个省市县级联选择框,并且要封装为组件,供其他页面模块使用。

效果图:

难点:

1. 现在官方文档上只是查到了TextPicker组件是可以做这样级联选择的效果

2. 这种弹窗,官方文档上是有半模态转场,只是这个半模态是一个严格和宿主节点绑定在一起的弹窗,需要绑定在触发的地方,才可以触发弹出,而且半模态转场中的bindSheet,需要初始化Builder类型装饰器(即模态框中要展示的内容),只是Builder装饰器不允许在组件外调用。

实现:

1. 创建一个组件,组件中内容包括选择器所需要的数据数组、选择器TextPicker所在的Builder装饰器,在TextPicker中去实现级联效果、组件build主体;通过状态(Link、State)来实现在目标页面调用选择器组件

2. 数据数组包括省市县的数据,可以静态写,也可以读取数据文件,我这是读的他们提供的地区xml文件

3. Builder装饰器是半模态专场初始化时的模态框中的内容,其中包括弹框顶部 “取消”、弹窗标题、“确定”布局和事件,下边的省市县三级选择器

@Builder
  selectRegion() {
    Column() {
      Flex({
        justifyContent: FlexAlign.SpaceBetween,
        alignItems: ItemAlign.Center
      }) {
        Text($r('app.string.cancel_txt'))
          .width('36lpx')
          .fontColor('#4976EE')
          .onClick(() => {
            this.showSheet = false;
          })

        Text(this.title)
          .fontColor('#000')
          .fontSize(18)
          .fontWeight(600)

        Text($r('app.string.ok_txt'))
          .width('36lpx')
          .fontColor('#4976EE')
          .onClick(() => {
            this.showSheet = false;
            if (this.okCallback) {
              this.okCallback(this.values);
            }
          })
      }
      .width('92%')
      .height('36lpx')
      .margin({ left: '4%', right: '4%', top: '6lpx' })

      TextPicker({
        range: this.range, //['北京', '北京市', '东城区']
        selected: $$this.selected, //[0, 0, 0]
      })
        .canLoop(false)// 不要循环
        .onChange((values) => {
          //进行防抖处理,防止滚动期间多次发送请求
          clearTimeout(this.timeId)
          this.timeId = setTimeout(async () => {
            let p = this.getProvince(values[0]);
            //当省份被改变
            if (this.values[0] !== values[0]) {

              this.range[1] = this.getCityArray(p.city) //市
              this.range[2] = this.getDistrictArray(p.city) //区

              //当省份发生变化需要把城市置零,当城市发生变化需要把地区置零
              this.selected[1] = 0
              this.selected[2] = 0

              //内容页面展示需要同步
              this.values[0] = values[0]
              this.values[1] = this.range[1][0]
              this.values[2] = this.range[2][0]

              //当城市被改变
            } else if (this.values[1] !== values[1]) {
              this.range[2] = this.getDistrictArrayByName(values[1], p.city) //区

              //当城市发生变化需要把地区置零
              this.selected[2] = 0

              //内容页面展示需要同步
              this.values[1] = values[1]
              this.values[2] = this.range[2][0]

              //当地区被改变
            } else if (this.values[2] !== values[2]) {

              //内容页面展示需要同步
              this.values[2] = values[2]
            }

          }, 100)
        })
    }

  }

4. 组件build主体,是封装的组件主体,是将来要放到要使用此组件的页面中的。在此主体中,绑定初始了半模态框,并定义了半模态框的一些样式

build() {
    Column()
      .bindSheet($$this.showSheet, this.selectRegion(), {
        height: 260,
        showClose: false,
        shouldDismiss: ((sheetDismiss: SheetDismiss) => {
          console.log("bind sheet shouldDismiss")
          //sheetDismiss.dismiss()
        }),
        onWillDismiss: ((DismissSheetAction: DismissSheetAction) => {

        })
      })
  }

5.组件中状态和回调函数

  @Link range: string[][] //TextPicker的values数组 [[], [], []]
  @Link selected: number[] //TextPicker的index数组
  @Link values: string[] //选中后用于展示的数组 ['北京', '北京市', '东城区']
  @Link showSheet: boolean; //半模态框
  @Link title: string;
  timeId: number = -1 //防抖处理的延时器Id
  private okCallback?: (values: string[]) => void

6.在页面中引入并触发显示弹框组件

import { AreaRegion } from '../../model/AreaRegion'

......

 @State isShowSelectRegion: boolean = false;

 showAreagion() {
        this.isShowSelectRegion = true;
  }

build() {
    Column() {
      ......
      AreaRegion({
        showSheet: $isShowSelectRegion,
        title: $regionSelectTitle,
        values: $regionData,
        selected: $regionSelected,
        range: $regionRange,
        okCallback: (values) => {
          /*更新账号所属地区*/
          let region = values[0] + values[1] + values[2]
          console.info(region)
          }).catch((msg: string) => {

          })
        }
      });

        Button('选择省市区')
          .width('60%')
          .margin({ left: '20%' })
          .fontColor('#fff')
          .fontSize('22fp')
          .backgroundColor('#2E74FE')
          .onClick(() => {
             this.showAreagion();
          })

    }
}

7。这种做法感觉不是那么标准,因为是要在所使用的页面UI中先加载AreaRegion组件,然后再通过改变@State变量,传递到组件中,实现组件的展示与否。不过现在暂时没有想到其他方案,如果好办法,欢迎交流。

8.注意文中所贴代码不是全部的代码,可以参考这种方式以及重要实现步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

建筑设计遇上这几个工具,就是锦上添花!

声明:此篇为 ai123.cn 原创文章,转载请标明出处链接:https://ai123.cn/2161.html 当AI遇上建筑,设计界的火花就这样擦出来了!👀 身为一名内外饰设计工程师,你是否也在担心作品不经意间借鉴过了头…

Tomcat启动控制台乱码解决方案

前言 事情的起因是这样的,当时我用了阿里云osssdk里的代码下载文件,如下 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName)); ,开始一切顺利,直到部署正式环境后,用了一段时间…

【Material-UI】Button 组件中的尺寸设置(Sizes)详解

文章目录 一、基础尺寸选项1. 小尺寸(Small)2. 中等尺寸(Medium)3. 大尺寸(Large) 二、尺寸的应用场景三、高级用法和最佳实践1. 使用主题调整默认尺寸2. 确保一致性3. 考虑无障碍设计 四、总结 在用户界面…

代码随想录算法训练营第五十二天|101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿

101. 孤岛的总面积 DFS搜索: dfs 函数是一个递归函数,用于深度优先搜索(DFS)遍历网格中的陆地区域。它将访问过的陆地标记为0,并统计陆地的数量。 我们首先定义了四个方向的移动偏移量 dir。 global count 语句用于声…

C++入门2

函数重载 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…

数据结构和算法|递归算法那些事(递归算法的时间复杂度、尾递归优化、斐波那契数列)

对于文章的第一部分,递归算法的时间复杂度,来自于代码随想录文章:通过一道面试题目,讲一讲递归算法的时间复杂度! 对于第二节尾递归优化来自于B站:尾递归优化:你的递归调用是如何被优化的? 文章…

Spring Boot - 通过ApplicationListener实现接口请求的性能监控

文章目录 概述1. ServletRequestHandledEvent事件2. 实现步骤3. 优缺点分析4. 测试与验证小结其他方案1. 自定义拦截器2. 性能监控平台3. 使用Spring Boot Actuator4. APM工具 概述 在Spring框架中,监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。…

【Java日志系列】日志概述

目录 前言 一、日志概述 二、日志文件 1. 调试日志 2. 系统日志 三、日志框架 1. 日志框架的作用 2. 日志框架的价值 3. 市面上流行的日志框架 4. 日志门面和日志实现的区别 总结 前言 在软件开发中,日志记录是一项至关重要的任务。无论是简单的命令行应…

微服务架构-SpringCloud

1.单体应用架构 将项目所有模块(功能)打成jar或者war,然后部署一个进程。 优点: 部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。技术单一:项目不需要复杂的技术栈,往往一套熟悉的技术栈就…

Netty技术全解析:LineBasedFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

【leetcode】杨辉三角(Java语言描述)

杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] …

XIAOJUSURVEY 重磅升级,推出图形化逻辑编排能力

&#x1f389;&#x1f389;&#x1f389;XIAOJUSURVEY 是滴滴开源的企业级问卷系统&#xff0c;现已重磅升级&#xff01;&#xff01;&#xff01; 本次升级基于自研规则引擎&#xff0c;全面支持复杂的问卷逻辑编排&#xff0c;实现了显示逻辑与跳转逻辑的无缝整合。突破了…

MySQL Galera Cluster 部署与介绍

目录 主要特点 组件 一. 环境准备 二. 配置 1. 配置 galera1 主机的my.cnf的文件 2. 配置 galera2 主机的my.cnf的文件 3. 配置 galera3 主机的my.cnf的文件 4. 在给galera1 主机的my.cnf的文件增加节点 5. 写入数据验证同步 6. 配置 galera4 主机的my.cnf的文件 M…

线性回归Pytorch方法

借助 PyTorch 实现深度神经网络 - 线性回归 PyTorch 方法 - 第 3 周 | Coursera 随机梯度下降和数据加载器 在每个epoch中&#xff0c;使用一个样本进行更新的方法称为随机梯度下降&#xff0c;而使用所有样本进行更新的方法称为批量梯度下降。 随机梯度下降&#xff1a; 随…

第五代数字产业园入驻西安,西安国际数字影像产业园究竟能带来哪些颠覆性变革?

西安&#xff0c;这座承载着千年历史文化底蕴的古老城市&#xff0c;在时代的洪流中不断焕发出新的生机与活力。如今&#xff0c;西安第五代数字产业园入驻西安&#xff0c;犹如一颗璀璨的新星在这片土地上冉冉升起&#xff0c;为这座城市的发展注入了强大的动力。而在这一重大…

AFSim 仿真系统---- 通信、传感器与干扰系统方程

概述 本文档旨在描述在WSF中对象之间交互所使用的方程和算法。这包括&#xff1a; 传感器交互通信交互干扰&#xff08;干扰&#xff09;交互 常见无线电频率方程 WSF使用一套通用类来封装涉及无线电频率&#xff08;RF&#xff09;交互的组件&#xff08;实际上&#xff0…

基于B/S模式的JSP二手车交易网站

你好&#xff0c;我是计算机专业的学生&#xff0c;专注于Web开发。希望我的论文能够为您提供一些有价值的信息。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;ECLIPSE、Tomcat 系统展示 首页 用户界面 管理员界面 汽车评…

新加坡服务器延迟大吗?如何进行优化

新加坡服务器延迟大吗&#xff1f;新加坡服务器的延迟通常在全国平均延迟111ms左右&#xff0c;其中移动网络约为90ms&#xff0c;联通网络106ms&#xff0c;电信网络最低约为85ms。为了进行优化&#xff0c;一般可以采取使用CDN、优化路由线路、增加带宽和服务器升级等方法。 …

VBA高级应用30例应用3在Excel中的ListObject对象:创建表

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

Linux 内核源码分析---简单文件系统

顺序文件 debugfs 文件系统 允许只用几个函数调用&#xff0c;就实现一个双向的调试接口。 小的文件系统中的文件&#xff0c;通常用户层是 从头到尾顺序读取 的&#xff0c;其内容可能是遍历一些数据项创建的。 kprobe 机制包含了到上述 debugfs文件系统 的一个接口。一个顺…