自定义导航栏与自定义构建函数

在这里插入图片描述

文章概叙

本文主要讲的是自定义导航栏Tabs,并使用到@builder装饰器来做自定义构建函数,本文的代码较长,建议使用电脑端查看。

书接上回

以Tabs作为例子介绍鸿蒙组件的结构

上回的代码使用了Tabs实现了切换卡片的效果,但很多时候,我们的底部栏并不是只有一个文字,还要有图标以及切换的效果,甚至还要求我们的某一个TabBar是独一无二的,所以自定义导航栏是一定要实现的。

在ArkUI中,自然有自定义导航栏的实现,而由于这一部分是公共的,所以我们可以将其抽出来,作为一个函数去"渲染",而由于该效果是只有当前页面才有的,因此我们只需要将其定义在当前的组件中,无需再去定义一个组件,所以我们选择的是@Builder的自定义函数。

ArkUI还提供了一种更轻量的UI元素复用机制@Builder,@Builder所装饰的函数遵循build()函数语法规则,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。

自定义函数的语法如下:

@Builder MyBuilderFunction(paramsA,paramsB){ // ui布局}

而当我们使用的时候,只需要很方便地去调用该方法即可,因为是在内部的,所以需要添加this。

this.MyBuilderFunction()

开始代码

作为轻量级的UI元素复用机制,自定义函数的最大好处自然是复用,以及可以在函数中调用我们的参数,而不需要具体的将之前定义好的参数传进去.

按照自然的思路,我们想要实现的效果是tabBar中既有文字,又有icon,且当前tab被渲染的时候,还会显示出另一个icon。

因此,我们的自定义函数需要传入四个参数,分别是文字,未被选中的icon,被选中的icon,以及当前tabbar的下标,既

  @Builder TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {Column() {Image(this.currentIndex === targetIndex ? selectedImg : normalImg).size({ width: 25, height: 25 })Text(title).fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')}.width('100%').height(50).justifyContent(FlexAlign.Center)

需要注意的是,第三行的"currentIndex"代表的是当前tab选中,而这个参数是在tabs的“onChange”监听函数中获得的。

想使用这个函数的时候,我们可以在tabBar这么写

 .tabBar(this.TabBuilder(this.tabList[1].name,1,this.tabList[1].selected_icon,this.tabList[1].unselected_icon))

因为返回的是一个组件,所以不需要再做啥了。

最后的代码如下

@Entry
@Component
struct Index {@State currentIndex: number = 0tabList: {name: string,unselected_icon: Resource,selected_icon: Resource}[] = [{ name: "发现",unselected_icon: $r("app.media.found_unselect"),selected_icon: $r("app.media.found_select"),},{ name: "我的",unselected_icon: $r("app.media.mine_unselect"),selected_icon: $r("app.media.mine_select")}]
​@Builder TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {Column() {Image(this.currentIndex === targetIndex ? selectedImg : normalImg).size({ width: 25, height: 25 })Text(title).margin({ top: 5 }).fontSize(16).fontColor(this.currentIndex === targetIndex ? '#FFAA00' : '#3A9B78')}.width('100%').height(50).justifyContent(FlexAlign.Center)}build() {Tabs({ barPosition: BarPosition.End }) {TabContent() {Text(`这个是${this.tabList[0].name}`)}.tabBar(this.TabBuilder(this.tabList[0].name,0,this.tabList[0].selected_icon,this.tabList[0].unselected_icon)).backgroundColor("#ccc")TabContent() {Text(`这个是${this.tabList[1].name}`)}.tabBar(this.TabBuilder(this.tabList[1].name,1,this.tabList[1].selected_icon,this.tabList[1].unselected_icon)).backgroundColor("#ccc")}.width("100%").height("100%").onChange((index) => {this.currentIndex = index})}
}

效果图如下

在这里插入图片描述

对于自定义构建函数,没啥好讲的,记得添加一个@builder就可以了。

而代码中的四个文件的资源,都是放在media目录下的,使用"$r"的形式去读取到本地的resourece​

个人公众号

呜呜呜,个人公众号求关注,主要讲的是React、NodeJs、Javascript以及鸿蒙等的开发文章,主要是公众号上的都是连贯的,对大佬们观看比较方便。

公众号上的文章

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GoogleNetv1:Going deeper with convolutions更深的卷积神经网络

文章目录 GoogleNetv1全文翻译论文结构摘要1 引言2 相关工作3 动机和高层考虑稀疏矩阵 4 结构细节引入1x1卷积核可以减少通道数 5 GoogleNet6 训练方法7 ILSVRC 2014 分类挑战赛设置和结果8 ILSVRC 2014检测挑战赛设置和结果9 总结 论文研究背景、成果及意义论文图表 GoogleNet…

48道Linux面试题

本博客将汇总 Linux 面试中常见的题目,并提供详细的解答。 文章目录 1、绝对路径用什么[符号表](https://so.csdn.net/so/search?q符号表&spm1001.2101.3001.7020)示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命…

docker应用部署

Docker 应用部署 一、部署MySQL 搜索mysql镜像 docker search mysql拉取mysql镜像 docker pull mysql:5.6创建容器,设置端口映射、目录映射 # 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysqldocker run -id \ -p 3307:3306 \ --na…

【AI+MJ提示词】Midjourney提示词系统化-反乌托邦(Dystopian)和技术朋克

反乌托邦(Dystopian)和技术朋克 反乌托邦(Dystopian)和技术朋克(Techno Punk)都是描述未来世界的文学流派。 反乌托邦描述的未来世界通常是一个被政府或强大机构严格控制的世界,人们的生活被监…

mysql查询出json格式字段中的值

一、使用场景 由于一些特殊数据使用json格式保存到表数据种中了,在查询的时候需要查询出这条数据中json格式中的某个字段 比如:需要将下列字符串中的“nationality”字段单独查询出来 json格式是一个对象 结果: json格式是一个集合 查询结…

QLabelQPushButton和QLineEdit

QLabel 设置文件格式字体颜色背景 源码 设置图片 源码 设置gif 设置文本 源码 富文本 (Rich Text): 格式化选项:富文本支持各种格式化选项,如字体样式(粗体、斜体)、字体大小、颜色、超链接、图片插入、列表、表格等。文件格式&a…

TensorFlow入门和案例分析

一、什么是TensorFlow 在这里,引入TensorFlow中文社区首页中的两段描述。 关于 TensorFlow TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作…

GBASE南大通用GBaseCommand 类

代表一个要对 GBASE南大通用数据库执行操作的 SQL 语句。这个类不能被继承。对 于该类所有成员的列表,参考 GBASE南大通用 GBaseCommand 成员。  继承层次 System.Object |__ System.MarshalByRefObject |__ System.ComponentModel.Component |__ System.D…

《MySQL》事务篇

事务特性 ACID Atomicity原子性:事务中的操作要么全部完成,要么全部失败。 Consistency一致性:事务操作前后,数据满足完整性约束。 Isolation隔离性:允许并发执行事务,每个事务都有自己的数据空间&…

程序员的浪漫,2023跨年烟花代码(Python)

跨年倒计时啦 今天分享用python实现一场烟花秀 感兴趣的小伙伴,提前收藏起来,一定要看到最后! 话不多说 1.首先制作一个绚丽的夜空 制作夜空,其实就是设置画布。大家知道,夜晚的天空月明如水,星光攒动&a…

案例260:基于微信小程序的签到系统的设计与实现

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder …

Jackson通过自定义序列化器给URL拼接访问域名

1、需求 在存储文件访问路径时,一般不会存储域名地址,若文件服务域名和当前应用域名不一致时,就需要在返回数据库的图片路径给前端时,拼接文件服务的域名。 2、处理方式 因为Spring Boot默认使用的是Jackson作为序列化工具&…