首页 > 其他分享 >鸿蒙(HarmonyOS) - 实现省市区三级联动

鸿蒙(HarmonyOS) - 实现省市区三级联动

时间:2024-09-25 22:16:01浏览次数:7  
标签:string 鸿蒙 color value HarmonyOS let selectCity 省市区 selectProvince

电商App在填写收货地址时,需要用户选择省市区,今天我们使用鸿蒙自带的TextPicker组件实现省市区三级联动。

效果图如下:

数据准备

Github上有一个开源项目,支持中华人民共和国行政区划(五级):省级、地级、县级、乡级和村级,数据很全,并且很新,支持不同的组合,json数据格式跟sqlite3数据库格式。

Github地址:

https://github.com/modood/Administrative-divisions-of-China/tree/master

本案例中只下载“省份、城市”的Json数据,复制到项目的rawfile文件夹下,举例:

项目名称/entry/src/main/resources/rawfile/pc.json

封装三级联动弹窗组件

封装一个自定义弹窗组件,在aboutToAppear方法中初始化数据。

aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

@CustomDialog
export default struct SelectRegionDialog {
    controller: CustomDialogController

    map: Map<string, string[]> = new Map<string, string[]>();//省市数据

    @State selectProvince:string=''//选择的省份
    selectCity:string=''//选中的城市

    confirm!: (province:string,city:string) => void //确定按钮点击回调

    aboutToAppear(): void {
        this.initData();
    }

    build() {
        ...
    }

    //初始化数据
    initData(){
        let result=AppUtil.getRawFileContent(this,'pc.json');//获取json字符串
        let jsonObj: Record<string, Object> = JSON.parse(result);//解析称对象
        let newMap: Map<string, object> = new Map<string, object>(Object.entries(jsonObj));

        newMap.forEach((value, key) => {
            let valueData = value as string[];
            this.map.set(key,valueData);//key value格式存储到map中
        })
    }

    //获取省份字符串数组
    getProvinceStrList(){
        let keysArray: string[] = Array.from(this.map.keys());
        return keysArray;
    }

    //获取城市字符串数组
    getCityStrList(){
        let cityList=this.map.get(this.selectProvince);
        return cityList;
    }
}

SelectRegionDialog自定义弹窗中的UI布局也简单,使用Row布局放两个TextPicker组件,宽度各占屏幕的50%,在省份的onChange方法中,当然省份的第一个城市默认选中。

TextPicker组件的基础用法参考官方文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/ts-basic-components-textpicker-0000001427744824-V2

build() {
    Column(){
        Row(){
            Button("取消").onClick(event=>{
                this.controller.close();
            })
            Blank().layoutWeight(1)
            Button("确定").onClick(event=>{
                this.confirm(this.selectProvince,this.selectCity);
                this.controller.close();
            })
        }.margin({
            left:15,right:15,top:30
        })

        Row(){
            TextPicker({ range: this.getProvinceStrList(), value: this.selectProvince })
                .onChange((value: string|string[], index: number| number[]) => {
                    this.selectProvince = Array.isArray(value) ? value[0] : value;

                    //省份改变,默认选择第一个城市
                    let cityList=this.map.get(this.selectProvince);
                    if (cityList != null && cityList?.length>0){
                        this.selectCity = cityList[0];
                    }
                }).width('50%')
                .canLoop(false)//是否循环
                .textStyle({
                color:'#888888'
            }).selectedTextStyle({
                color:$r('app.color.title_color')
            })

            TextPicker({ range: this.getCityStrList(), value: this.selectCity })
                .onChange((value: string|string[], index: number| number[]) => {
                    this.selectCity = Array.isArray(value) ? value[0] : value;
                }).width('50%').canLoop(false).textStyle({
                color:'#888888'
            }).selectedTextStyle({
                color:$r('app.color.title_color')
            })
        }.margin({
            top:30,bottom:30
        })
    }
}

弹窗使用

选中的省份跟城市字段用@State修饰,这样当字符串变化时会刷新UI界面,使用CustomDialogController显示自定义弹窗,用户点击【选择省市区】按钮,显示对话框。

@Entry
@Component
struct SelectRegionPage {
    @State selectProvince:string=""//选中的省份
    @State selectCity:string=""//选中的城市

    selectRegionDialog: CustomDialogController = new CustomDialogController({
        builder: SelectRegionDialog({
            selectProvince:this.selectProvince,
            selectCity:this.selectCity,
            confirm:this.onConfirm.bind(this)
        }),
        alignment: DialogAlignment.Bottom,  // 可设置dialog的对齐方式,设定显示在底部或中间等,默认为底部显示
        cornerRadius:{
          topLeft:13,topRight:13,bottomLeft:0,bottomRight:0
        },
        autoCancel:false,
        width:'100%'
    })

    build() {
        Column(){
            HdNav({
                title:"省市区三级联动"
            })

            Text(this.selectProvince+this.selectCity).fontColor($r('app.color.title_color')).fontSize(24).margin({
                top:150
            })

            Button("选择省市区").onClick(event=>{
                this.onSelectRegion();
            }).margin({
                top:20
            })
        }
    }

    onSelectRegion(){
        this.selectRegionDialog.open();
    }

    onConfirm(province:string,city:string){
        this.selectProvince = province;
        this.selectCity = city;
    }
}

源码下载

这个案例的代码都提交到github上了,这个库我会一直维护,这个一个鸿蒙API使用案例的工具库,后续会陆续增加功能以及维护。

https://github.com/ansen666/harmony_tools

标签:string,鸿蒙,color,value,HarmonyOS,let,selectCity,省市区,selectProvince
From: https://www.cnblogs.com/yishaochu/p/18432356

相关文章

  • 鸿蒙HarmonyOS HCIP认证题库
    鸿蒙HarmonyOSHCIP认证题库学习分享,本题库一共409道。反复刷考场得来,手打不易。记住不要光背选项,考试时可能打乱顺序,主要还是记住内容。一、单选题和填空题1.某开发者想要使用类Web开发范式的属性样式动画设置text组件的颜色变化动效,以下代码空白处应该填写什么?text......
  • flutter开发适配鸿蒙HarnomyNext系统过程步骤以及问题记录
    flutter项目适配鸿蒙HarnomyNext系统步骤记录本人是在Window环境下开发第一:环境搭建1.下载鸿蒙next开发工具DevEchoStudio,类似AndroidStudio的工具,页面都类似鸿蒙开发套件官方下载地址:https://developer.huawei.com/consumer/cn/download/下载之前需要先登录,后面的模拟......
  • 关于HarmonyOS的学习
    day35一、回调地狱  //比如我们发送三个ajax请求  //-第一个正常发送  //-第二个请求需要第一个请求的结果中的某一个值作为参数  //-第三个请求需要第二个请求的结果中的某一个值作为参数  ajax_get({    url:'http://localhost......
  • 关于HarmonyOS的学习
    day36一、可选链和空集合并符1.?  //?作用:1、三目运算符2、可选链  constobj={    id:1,    //info:{    //  name:'张',    //  age:18    //} }  console.log(obj.id)  cons......
  • HarmonyOS开发之BLE蓝牙扫描
    随着物联网技术的发展,短距离通信技术如蓝牙成为了连接各种智能设备的关键。HarmonyOSNEXT作为面向未来的操作系统,不仅支持传统的蓝牙技术,还特别优化了低功耗蓝牙(BLE)的支持,使得开发者能够轻松实现设备间的高效数据交换。本文将通过具体案例介绍如何在HarmonyOSNEXT中实现BLE蓝牙扫......
  • 鸿蒙入门到实战
    简介本套课程是up主精心根据鸿蒙api12最新版本设计,总体课程分为以下几个方向鸿蒙应用开发-前置课鸿蒙应用开发-基础课鸿蒙应用开发-进阶课鸿蒙应用开发-高级课鸿蒙应用开发-项目实战计划鸿蒙应用开发-前置课鸿蒙应用开发-基础课鸿蒙应用开发-进阶课鸿蒙应用......
  • 《鸿蒙/Harmony | 开发日志》预览文件
    APP中常有需求就是点击文件打开预览。鸿蒙中,可以借助访问的预览文件服务来实现。测试下来,常见的文档类型txt,doc,excel,ppt,pdf,图片,视频等都是默认可以打开的。遇到不能打开的,界面也会按钮是否使用其他APP来打开。支持的文件类型官方文档列出的支持类型,实际测试下来......
  • 技术解读:华为云如何携手昇腾、鸿蒙等根生态,助力开发者技术创新
    摘要:分享在华为云上通过生态协同,基于昇腾云服务、HarmoyOS、盘古大模型等产品实现技术创新、商业成功的故事,了解根生态各技术趋势及最新前沿科技。本文分享自华为云开发者联盟公众号《华为云携手根生态,助力开发者成长》9月21日,华为全联接大会2024期间,华为云开发者联盟成功......
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息
    场景介绍通知消息通过PushKit通道直接下发,可在终端设备的通知中心、锁屏、横幅等展示,用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。开通权益PushKit根据消息内容,将通知消息分类为服务与通讯、资讯营销两大类别,开放通知消息自分类权益。两种类型的通知消息......
  • 【HarmonyOS】开启沉浸式(全屏)并获取顶部状态栏和底部导航条高度
    鸿蒙开启沉浸式(全屏)并获取顶部状态栏和底部导航条高度1.获取主窗口constwin=windowStage.getMainWindowSync()2.开启沉浸式win.setWindowLayoutFullScreen(true)3.顶部状态栏高度//获取状态栏区域 letarea=win.getWindowAvoidArea(window.AvoidAreaType.......