鸿蒙中选择地区

news2025/1/21 10:03:03

1.首页ui


import { CustomDialogExampleSelectRegion } from './selectRegion/SelectRegionDialog';


@Entry
@Component
struct Index {
  @State selectedRegion: string = '选择地区'
  // 地区
  dialogControllerSelectRegion: CustomDialogController | null = new CustomDialogController({
    builder: CustomDialogExampleSelectRegion({
      selectedRegion: this.selectedRegion
    }),
    autoCancel: true,
    alignment: DialogAlignment.Center,
    onWillDismiss: (dismissDialogAction: DismissDialogAction) => {
      console.info("reason=" + JSON.stringify(dismissDialogAction.reason))
      console.log("dialog onWillDismiss")
      if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {
        dismissDialogAction.dismiss()
      }
      if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
        dismissDialogAction.dismiss()
      }
    },
    width: 300,
    height: 340,
    offset: { dx: 0, dy: -25 }
  })

  build() {
    Column() {
      Button(this.selectedRegion).onClick(() => {
        this.dialogControllerSelectRegion?.open()
      })
    }
    .width('100%')
    .height("100%")
  }
}

2.弹窗ui

import { SelectRegionComponent } from "./SelectRegionConponent"

// 选择地区
@CustomDialog
export struct CustomDialogExampleSelectRegion {
  controllerSelectRegion?: CustomDialogController
  @Prop changeFontSize: number = 0;
  @State provincesOrMunicipalities: string = 'country'
  @Link selectedRegion: string

  backPrevious() {
    if (this.provincesOrMunicipalities === 'country') {
      this.controllerSelectRegion?.close()
    }
    if (this.provincesOrMunicipalities === 'provinces') {
      this.provincesOrMunicipalities = 'country'
    }
    if (this.provincesOrMunicipalities === 'city') {
      this.provincesOrMunicipalities = 'provinces'
    }
    if (this.provincesOrMunicipalities === 'district') {
      this.provincesOrMunicipalities = 'city'
    }
  }

  isSelectedRegionFn(area: string) {
    this.selectedRegion = area
    this.controllerSelectRegion?.close()
  }

  build() {
    Column() {
      Row() {
        Row() {
          Text('上一级').fontSize(22)
        }.width('33.33%')
      }.width('100%').margin({ left: 20, bottom: 10 }).justifyContent(FlexAlign.SpaceBetween).onClick(() => {
        this.backPrevious()
      })

      SelectRegionComponent({
        provincesOrMunicipalities: this.provincesOrMunicipalities,
        isSelectedRegionFn: this.isSelectedRegionFn.bind(this)
      }).layoutWeight(1)
    }.width('100%').height('100%')
  }
}

3.弹窗组件ui

import { common } from '@kit.AbilityKit';
import { util } from '@kit.ArkTS';
// 区县
export class DistrictType {
  name: string = '';
  code: string = '';
}

//省或市
export class ProvinceType {
  name: string = '';
  code: string = '';
  districts?: DistrictType[];
}

// 国家
export class CountryType {
  name: string = '';
  subName: string = '';
  provinces?: ProvinceType[];
}
@Component
export struct SelectRegionComponent {
  @State areaData_Country: CountryType[] = [] //国家
  @State areaData_Provinces: ProvinceType[] = [] //省直辖市
  @State areaData_City: ProvinceType[] = [] //市
  @State areaData_District: DistrictType[] = [] //区县
  @Link provincesOrMunicipalities: string
  isSelectedRegionFn: (area: string) => void = (area) => {

  }

  aboutToAppear(): void {
    let context = getContext(this) as common.UIAbilityContext;
    let resourceManager = context.resourceManager;
    resourceManager.getRawFileContent("area.json").then(value => {
      let rawFile = value;
      let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM: true })
      let retStr = textDecoder.decodeWithStream(rawFile, { stream: false });
      this.areaData_Country = JSON.parse(retStr)
      this.areaData_Provinces = this.areaData_Country[1].provinces as ProvinceType[]
    })
  }

  getFullPath_City(districtCode: string) {
    for (const country of this.areaData_Country) {
      const countryName = country.name; // 中国
      for (const province of (country.provinces as ProvinceType[])) {
        const provinceName = province.name; // 北京市
        for (const district of (province.districts as DistrictType[])) {
          if (district.code === districtCode) {
            return `${countryName} ${provinceName} ${district.name}`; // 返回完整路径
          }
        }
      }
    }
    return null; // 如果没有找到
  }

  getFullPath_Other(districtCode: string) {
    if (!this.areaData_Country || this.areaData_Country.length === 0) {
      return null; // 检查数据是否为空
    }
    // 遍历国家列表
    for (const country of this.areaData_Country) {
      const countryName = country.name; // 获取国家名称
      if (!country.provinces || country.provinces.length === 0) {
        continue; // 检查省是否存在
      }
      // 遍历省份列表
      for (const province of country.provinces) {
        const provinceName = province.name; // 获取省份名称
        if (!province.districts || province.districts.length === 0) {
          continue; // 检查城市是否存在
        }
        // 遍历城市列表
        for (const city of province.districts) {
          const cityName = city.name; // 获取城市名称
          if (!(city as ProvinceType).districts || ((city as ProvinceType).districts as DistrictType[]).length === 0) {
            continue; // 检查区是否存在
          }
          // 遍历区县列表
          for (const district of ((city as ProvinceType).districts as DistrictType[])) {
            if (district.code === districtCode) {
              // 找到匹配的区,返回完整路径
              return `${countryName} ${provinceName} ${cityName} ${district.name}`;
            }
          }
        }
      }
    }
    return null; // 如果没有找到匹配的区县,返回 null
  }

  ConfirmRegion(item: CountryType | ProvinceType | DistrictType) {
    if ((item as CountryType).provinces?.length === 0 || (item as ProvinceType).districts?.length === 0) {
      this.isSelectedRegionFn(item.name)
      return
    }
    if ((item as CountryType).provinces?.length !== 0 || (item as ProvinceType).districts?.length !== 0) {

      if (this.provincesOrMunicipalities === 'district') {
        const area = this.getFullPath_Other((item as DistrictType).code)
        this.isSelectedRegionFn(area as string)
      }

      if (this.provincesOrMunicipalities === 'city') {
        if ((item as DistrictType).code.includes("110") || (item as DistrictType).code.includes("120") ||
        (item as DistrictType).code.includes("310") || (item as DistrictType).code.includes("500")) {
          const area = this.getFullPath_City((item as DistrictType).code)
          this.isSelectedRegionFn(area as string)

          return
        }
        this.provincesOrMunicipalities = 'district'
        this.areaData_District = (item as ProvinceType).districts as DistrictType[]

      }
      if (this.provincesOrMunicipalities === 'provinces') {
        this.provincesOrMunicipalities = 'city'
        this.areaData_City = (item as ProvinceType).districts as ProvinceType[]
      }
      if (this.provincesOrMunicipalities === 'country') {
        this.provincesOrMunicipalities = 'provinces'
      }
    }
  }

  @Builder
  areaListBuilder(item: CountryType | ProvinceType | DistrictType) {
    Text(item.name)
      .height(50)
      .width('100%')
      .border({ width: { bottom: 1 }, color: "#cccccc" })
      .margin({ left: 20 })
      .onClick(() => {
        this.ConfirmRegion(item)
      })
  }

  build() {
    Column() {
      List() {
        ForEach(this.provincesOrMunicipalities === 'country' ? this.areaData_Country :
          this.provincesOrMunicipalities === 'provinces' ? this.areaData_Provinces :
            this.provincesOrMunicipalities === 'city' ? this.areaData_City : this.areaData_District,
          (item: CountryType | ProvinceType | DistrictType, i: number) => {
            ListItem() {
              this.areaListBuilder(item)
            }
          })
      }
    }.width('100%').height('100%')
  }
}

注意!!!!图中的数据来自于rawfile文件下的json文件

文件地址:世界国家地区,以及省市区-CSDN博客

世界国家地区,以及省市区资源-CSDN文库,,想给大家免费下载,但是不知道怎么弄,知道方法的朋友可以分享一下,

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

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

相关文章

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块 在本篇文章中,我们将一步步走过如何创建一个简单的 HarmonyOS NAPI 模块。通过这个模块,你将能够更好地理解 NAPI 的工作原理,并在你的应用中开始使用 C 与 JavaScript 的…

excel实用工具

持续更新… 文章目录 1. 快捷键1.1 求和 2. 命令2.1 查找 vloopup 1. 快捷键 1.1 求和 windows: alt mac : command shift T 2. 命令 2.1 查找 vloopup vlookup 四个入参数 要查找的内容 (A2 6xx1)查找的备选集 (C2:C19)…

Linux中的基本指令(一)

一、Linux中指令的存在意义 Linux中,通过输入指令来让操作系统执行,以此达到控制操作系统的目的,类似于Windows中的双击,右键新建文件,新建文件夹等 1.补:关于屏幕的几个操作指令 ①清屏指令 clear 回…

深入解析 C++17 中的 u8 字符字面量:提升 Unicode 处理能力

在现代软件开发中,处理多语言文本是一个常见需求,特别是在全球化的应用场景下。C17 标准引入的 u8 字符字面量为开发者提供了一个强大的工具,以更有效地处理和表示 UTF-8 编码的字符串。本文将详细探讨 u8 字符字面量的技术细节、实际应用&am…

2025年国产化推进.NET跨平台应用框架推荐

2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费(MIT License)的跨平台框架(支持Android、iOS、macOS 和 Windows多平台运行),是 Xamarin.Forms 的进化版,从移动场景扩展到…

C++和OpenGL实现3D游戏编程【连载21】——父物体和子物体模式实现

欢迎来到zhooyu的专栏。 🔥C和OpenGL实现3D游戏编程【专题总览】 1、本节要实现的内容 上节课我们已经创建了一个基础Object类,以后所有的游戏元素都可以从这个基类中派生出来。同时为了操作方便,我们可以为任意两个Object类(及其…

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类:DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…

【数据结构篇】顺序表 超详细!

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口: 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…

vulnhub靶场【IA系列】之Tornado

前言 靶机:IA-Tornado,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 本文所用靶场、kali镜像以及相关工具,我放置在网盘中,可以复制后面链接查看 htt…

云上贵州多彩宝荣获仓颉社区先锋应用奖 | 助力数字政务新突破

在信息技术应用创新的浪潮中,仓颉社区吸引了众多企业和开发者的积极参与,已有多个应用成功落地,展现出蓬勃的创新活力。仓颉编程语言精心遴选了在社区建设、应用创新、开源共建、技术布道等方面做出突出贡献的优秀项目应用,并颁发…

第十二章:算法与程序设计

文章目录: 一:基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二:程序设计 基础 1.常数 …

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递? 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别? 4.简述Dart语音特性 5. Navigator 是什么?在 Flutter 中 Routes 是什么? 6、Dart 是不是…

BUUCTF_Web([GYCTF2020]Ezsqli)

1.输入1 ,正常回显。 2.输入1 ,报错false,为字符型注入,单引号闭合。 原因: https://mp.csdn.net/mp_blog/creation/editor/145170456 3.尝试查询字段,回显位置,数据库,都是这个。…

HTML学习笔记(4)

目录 一、背景相关样式 二、定位position 三、javascript 1、变量的定义 2、数据类型 3、绑定事件 一、背景相关样式 background-image: url(); // 背景图片 background-repeat: repeat; // 背景图片是否平铺 no-repeat background-size: 200px; // 背景图片尺寸 cover把…

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读:本篇文章是“2024,我想和 TDengine 谈谈”征文活动的优秀投稿之一,作者从数据库运维的角度出发,分享了利用 TDengine Cloud 提供的迁移工具,从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

Excel 技巧11 - 如何使用Excel作成简单的排班表(★★),weekday 函数,TEXT函数

本文讲了如何在Excel中制作简单的排班表。 1,排班表Layout效果 - B2 单元格找那个输入 日期 - C3 - AG3 输入日,就是该月份的几号,比如1月5号,就输入5 如果是周六周日,背景色显示为绿色 - B4 ~ 输入员工名称 当 B2…

mac m1下载maven安装并配置环境变量

下载地址:Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令: 1. 确保你已经安装了 Visual Studio…

w-form-select.vue(自定义下拉框组件)

文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…

Flutter项目和鸿蒙平台的通信

Flutter项目和鸿蒙平台的通信 前言Flutter和Harmonyos通信MethodChannelBasicMessageChannelEventChannel 前言 大家在使用Flutter开发项目的时候, Flutter提供了Platfrom Channel API来和个个平台进行交互。 Flutter官方目前提供了一下三种方式来和个个平台交互&…

【KOA框架】koa框架基础入门

koa是express的一层封装,语法比express更加简洁。所以有必要了解下koa的相关开发方法。 代码实现 package.json {"name": "koapp","version": "1.0.0","main": "index.js","scripts": {&…