鸿蒙项目实战(一):实现首页动态Tab

news/2024/12/26 0:27:07/文章来源:https://www.cnblogs.com/xqxacm/p/18528270

需求:存在n个tab页,支持动态设置显示指定某几个tab

实现如下:

一、定义一个类,定义所有的tab页数据

知识点:

1、类使用export修饰,可以让其他模块引入

2、类内字段 设置 static readonly ,只读静态字段

3、图标文件存于src->main->resources->base->media目录下

// 首页菜单配置
export class TabConfig{// 供选择的所有tab集合// 只读 静态static readonly tabList = [{title:'首页',selectIcon:$r('app.media.icon_menu_home_press'),icon:$r('app.media.icon_menu_home_default'),},{title:'销售',selectIcon:$r('app.media.icon_menu_sale_press'),icon:$r('app.media.icon_menu_sale_unpress'),},{title:'客户',selectIcon:$r('app.media.icon_menu_customer_press'),icon:$r('app.media.icon_menu_customer_unpress'),},{title:'更多',selectIcon:$r('app.media.icon_menu_more_press'),icon:$r('app.media.icon_menu_more_unpress'),},]
}

二、创建一个page

1、定义两个字段:

 @State currentTabIndex: number = 0 // 当前tab下标@State currentTabs: object[] = [] // 当前显示的tab集合

 

2、定义自定义构建函数组件,实现自定义tab

// 自定义构建函数组件
@Builder mTabs(index: number, title: string, selectIcon: Resource, icon: Resource) {Column() {Image(this.currentTabIndex == index ? selectIcon : icon).width(28).height(28)Text(title).fontSize(14).margin({ top: 6 })}.justifyContent(FlexAlign.Center).width('100%').height('100%').padding({ top: 6, bottom: 4 })}

 

3、在生命周期方法里动态设置需要显示的tab

 aboutToAppear() {this.setTabs(['首页', '客户', '更多'])}// 动态设置需要显示的tabsetTabs(tab: string[]) {this.currentTabs = []for (let i = 0; i < tab.length; i++) {let index = TabConfig.tabList.findIndex((item) => {return item.title === tab[i]})if (index != -1) {this.currentTabs.push(TabConfig.tabList[index])}}}

 

4、设置ui部分

build() {Tabs() {ForEach(this.currentTabs, (item, index) => {TabContent() {Text('这是' + item.title + '页面')}.tabBar(this.mTabs(index, item.title, item.selectIcon, item.icon))})}.barPosition(BarPosition.End).width('100%').height('100%').barHeight(60).onChange((index:number)=>{this.currentTabIndex = index //改变当前选中的tab下标}).barMode(BarMode.Fixed) // 不可滑动}

 

相关文档:

自定义构建函数@Builder

选项卡Tabs

完整代码:

 1 // 首页
 2 import { TabConfig } from '../common/config/TabConfig'
 3 
 4 @Entry
 5 @Component
 6 struct Main {
 7   @State currentTabIndex: number = 0 // 当前tab下标
 8   @State currentTabs: object[] = [] // 当前显示的tab集合
 9   //
10   aboutToAppear() {
11     this.setTabs(['首页', '客户', '更多'])
12   }
13   // 动态设置需要显示的tab
14   setTabs(tab: string[]) {
15     this.currentTabs = []
16     for (let i = 0; i < tab.length; i++) {
17       let index = TabConfig.tabList.findIndex((item) => {
18         return item.title === tab[i]
19       }
20       )
21       if (index != -1) {
22         this.currentTabs.push(TabConfig.tabList[index])
23       }
24     }
25   }
26 
27   build() {
28     Tabs() {
29       ForEach(this.currentTabs, (item, index) => {
30         TabContent() {
31           Text('这是' + item.title + '页面')
32         }
33         .tabBar(this.mTabs(index, item.title, item.selectIcon, item.icon))
34       })
35     }
36     .barPosition(BarPosition.End)
37     .width('100%')
38     .height('100%')
39     .barHeight(60)
40     .onChange((index:number)=>{
41       this.currentTabIndex = index
42     })
43     .barMode(BarMode.Fixed) // 不可滑动
44   }
45   // 自定义构建函数组件
46   @Builder mTabs(index: number, title: string, selectIcon: Resource, icon: Resource) {
47     Column() {
48       Image(this.currentTabIndex == index ? selectIcon : icon)
49         .width(28)
50         .height(28)
51       Text(title)
52         .fontSize(14)
53         .margin({ top: 6 })
54     }
55     .justifyContent(FlexAlign.Center)
56     .width('100%')
57     .height('100%')
58     .padding({ top: 6, bottom: 4 })
59   }
60 }
完整代码

 

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

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

相关文章

关于注册登录注销的jsp实现

这是效果图 代码实现中的数据库建表连接,参考之前的博客, 这里写几个关键点的实现方法这里是添加了点击事件,有两个好处其一是两个图标一直了都是按钮,ui更加美观一点、其二是可以在函数部分添加弹窗比如先弹出登录成功的窗口再提交表单,在期中考试中有地方会用到这里是判…

用户注册案例--mvc架构的实现

用户注册案例--浅谈servlet 本案例为用户注册案例,同时介绍一部分之前经常用得到servlet的知识.servlet是javaEE的技术规范之一. 基于MCV架构的分析 1.dao层在mapper代理文件中写入insert的操作,对于成功注册的用户直接写入数据库,以及查询操作判断用户名是否已经存在User getU…

CSP2024 前集训:NOIP2024加赛 1

前言赛时本来 rk3,赛后自己加 hack 卡自己于是成 rk4 了。 因为这场是假做法大战,T1 假贪心有 \(92pts\);T2 \(O(n^2m)\) 能过(是因为数据里 \(m\le 10\)); T3 相当抽象,赛时我打的爆搜只加了一个剪枝能得 \(70pts\),赛后发现无解的时候会跑满,于是提前判掉无解就过了…

AI辅助动画制作,现实到虚拟仅需要一个摄像头。多种AI技术融合赋能传统行业,或是产业趋势?

AI辅助动画制作,现实到虚拟仅需要一个摄像头。图源:youtube authour autodesk media & entertainment 不是元宇宙,是动画。 2024年10.30日。美国加利福尼亚公司 Wonder dynamic 发布了最新的产品视频。只需要一个摄像头,我们可以把所有的一切搬到虚拟世界。此产品利用多…

chapter14

第一题问题首先,编写一个名为 null.c 的简单程序,它创建一个指向整数的指针,将其设置为NULL,然后尝试对其进行释放内存操作。把它编译成一个名为 null 的可执行文件。当你运行这个程序时会发生什么?自己写的输出如下:无任何输出或错误提示。 第二题问题接下来,编译该程序…

0XGAME [Week 3] 重生之我在南邮当CTF大王

0XGAME [Week 3] 重生之我在南邮当CTF大王 新尝试:源文件找线索;新知识:兽音加密 下载是个游戏和源代码,玩了以下,感觉答对问题也是可以得到flag,但是感觉耗时,而且应该有藏flag的地方,在一堆文件里面找,data文件夹里面的4个地图json文件,进去发现了flag字眼是个2,那…

sentinel微服务限流

sentinel(微服务限流) 官网地址:https://sentinelguard.io/zh-cn/ 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是由阿里巴巴开源的一款流量防护组件,Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 微服…

RabbitMQ工作模式

RabbitMQ工作模式RabbitMQ提供了多种工作模式:简单模式,work模式 ,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式等官网对应模式介绍:https://www.rabbitmq.com/getstarted.html 1、简单模式 生产者直接发送消息到队列上(虽然没有指明使用交换机,但是…

RabbitMQ消息幂等性保障

消息幂等性保障幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。在MQ中指,消费多条相同的消息,得到与消费该消息一次相同的结果消息幂等性保障 乐观锁机制 @Component public class …

WPF Button控件 这里可以点一下

WPF Button控件 这里可以点一下button表示一个 Windows 按钮控件,该控件对 Click 事件做出反应。 可以点一下button,执行程序操作,如:显示对话框,更改显示内容。 button的content属性表示按钮上显示的文字。<StackPanel><!-- 一个按钮控件,太小了,根本就看不到…

WPF Textbox控件 这里可以输入文字

WPF Textbox控件 这里可以输入文字 textbox控件,用于输入文字。如网页上输入账号密码的地方就是文本框。 文本框的text属性可以提示文字,只能包含无格式文本。

蛋白粉?蛋白质

蛋白粉不能用开水冲,但我们摄入的蛋白质却大都经过了烹煮。 为什么蛋白质不怕开水,而蛋白粉怕开水? 这似乎是矛盾的,其实不然。 问题是,很多人并不了解蛋白质的分子结构,不了解蛋白粉的溶解原理。 如果不了解其中的原理,很容易给出错误的解释。咳咳咳~~干货内容一次可…