#HarmonyOS NEXT 体验官# 手把手教你实现省市区镇-四级地址选择弹窗组件 原创 精华
前言
hello 大家好,我是无言,因为地址级联
选择功能其实还是非常常见的,而且官方有TextPicker文本选择组件也可以实现地址级联选择,但是我发现超过3级之后,文字就太多了,会很难看,不好操作等相关问题。所以有必要自己来实现一个好看的省市区镇-四级地址
级联选择组件。
目的
通过本篇文章小伙伴们能学到什么?我简单的总结了一下大概有以下几点。
- 了解到鸿蒙Next 自定义弹窗 的核心用法。
- 了解到 实现
级联选择
的实现思路和过程,不仅限于鸿蒙,也适用于其他框架和场景。 - 了解到
鸿蒙Next
中如何封装自己的自定义组件。 - 了解到
鸿蒙Next
中组件之间是如何通信的,以及如何实现自己想要的功能。
效果提前看一看
实现过程
一、准备工作
- 安装好最新DevEco Studio 开发工具,创建一个新的空项目。
- 新增目录结构
ets/components/cascade/
,在下面添加文件addressObj.ts
用于存放地址Obj对象
,index.ets
用来初始化弹窗容器,CustomAddress.ets
用来存放具体的级联选择业务代码,Cascade.d.ts
TS 声明文件。
二、实现自定义弹窗
- 将官网自定义弹窗的示例3复制过来,放入到
ets/components/cascade/index.ets
中后稍微修改一下,修改的地方我都添加注释了。 主要是 去掉@Entry
页面的入口组件装饰,修改组件命名并用export
暴露组件供外部使用。
- 修改
ets/pages/index.ets
去掉无关的代码,在页面中引入我们的组件。
预览一下看看效果。
三、实现父子组件的通信
在讲后续功能前,这里有必要讲一下鸿蒙开发组件状态。
-
@State用于装饰当前组件的状态变量而且必须初始化,@State装饰的变量在发生变化时,会驱动当前组件的视图刷新。
-
@Prop用于装饰子组件的状态变量而且不允许本地初始化,@Prop装饰的变量会同步父组件的状态,但只能单向同步。
-
@Link用于装饰子组件的状态变量而且不允许本地初始化,@Prop变量同样会同步父组件状态,但是能够双向同步。
-
@Provide和@Consume用于跨层级传递状态信息,其中@Provide用于装饰祖先组件的状态变量,@Consume用于装饰后代组件的状态变量。@Provide装饰变量必须本地初始化,而@Consume装饰的变量不允许本地初始化,
而且他们能够双向同步。 -
@Props与@Link声明接收的属性,必须是@State的属性,而不能是@State属性对象中嵌套的属性解决办法将嵌套对象的类型用class定义, 并使用@Observed来装饰,子组件中定义的嵌套对象的属性, 使用@ObjectLink来装饰。
-
@Watch用来监视状态数据的变化,包括:@State、@Prop、@Link、@Provide、@Consume
一旦状态数据变化,监视的回调就会调用,这里我有必要加一个示例。
四、完善逻辑
好了回到我们的主题,前面我们的示例中,只是子组件自己调用弹窗了,我们要实现以下几个功能。
- 父组件调用子组件方法唤醒子组件弹窗。
- 父组件传参控制选择地址的层级数量。
- 子组件选好数据之后回调方法传给父组件。
修改 /ets/components/cascade/index.ets
,实现父组件传参给子组件,子组件回调方法传值给父组件。然后还修改了弹窗的样式以及位置,详细请看下面代码。
修改/ets/pages/index.ets 文件实现功能主要是父元素调用子组件方法,以及子组件的回调方法调用
运行效果如下,点击 点我关闭弹窗
按钮可以发现 子组件的回调信息 aaa
在父组件中成功打印。
五、完善地址级联逻辑
- 因为对象取值性能最好,速度也快,所以我这里采用的是对象信息结构,在
addressObj.ts
文件中存放我们的所有城市信息,因为内容过多,我就只举例展示部分,我将完整的城市信息,放在了本文末尾,有需要的小伙伴可以自己下载下来尝试一下。
- 声明文件
Cascade.d.ts
添加类型
- 修改
CustomAddress.ets
完成我们主要的核心业务代码,内容比较多,该添加注释的地方我都添加了,具体功能代码请看下面内容。
- 修改
/ets/components/cascade/index.ets
文件
重新运行一下,当街道选好之后,即可发现弹窗自动关闭,而且选好地址信息成功拿到。
总结
本文详细介绍了关于在华为鸿蒙系统 去实现一个自定义弹窗的详细教程,主要是提供一些思路,了解组件之间通信的技巧,以及如何实现一个地址级联选中的详细过程。
希望这篇文章能帮到你,最后我把完整代码放到了gitee上有需要的小伙伴可以自己拉下来去试一试。
已star,感谢分享
嘿嘿,共建鸿蒙社区