首页 > 其他分享 >鸿蒙项目实战(一):实现首页动态Tab

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

时间:2024-11-05 21:41:59浏览次数:1  
标签:index Tab 鸿蒙 title selectIcon item 首页 tab icon

需求:存在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(['首页', '客户', '更多'])
  }
 // 动态设置需要显示的tab
 setTabs(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 }
完整代码

 

标签:index,Tab,鸿蒙,title,selectIcon,item,首页,tab,icon
From: https://www.cnblogs.com/xqxacm/p/18528270

相关文章

  • CompletableFuture异步编排接口优化方案
    接口优化方案(1)程序本身,减少不必要的条件判断、循环(2)减少数据库的交互次数,以及每个sql查询的数据量(列数和行数越少越好)(3)提高sql的性能,通过建立合适的索引(4)使用java8的stream流提高集合的遍历操作的效率(5)引入缓存,从redis中加载数据的效率高于mysql(6)使用多线程异步......
  • Flutter+鸿蒙NEXT开发获取系统文件路径
    Flutter+鸿蒙NEXT开发获取系统文件路径在具体的开发过程中,有时需要获取临时目录、文档目录等需求.本文具体讲解怎么在Flutter中可以利用path_provider插件来完成此项工作,OpenHarmonySIG组织对该插件做了鸿蒙NEXT系统的适配,接下来将详细讲解如何利用path_provider插件来获取系统文......
  • 鸿蒙 next 实现应用内的暗黑模式切换
    鸿蒙next实现应用内的暗黑模式切换实现暗黑模式的大致思路是利用@Provider与@Consume共享一个lightMode变量,在页面创建时读取持久化的lightMode,来实现暗黑模式。1.在Entry页面使用@Provide注解lightMode@Entry@ComponentstructQuickTestMainPage{@Providelig......
  • vxe-table 一个强大的表格组件
    VxeTablev4介绍下按需引用npminstallvite-plugin-lazy-import--save-devnpminstall vxe-table--save-dev首先安装这两个组件//修改文件vue.config.jsimport{lazyImport,VxeResolver}from'vite-plugin-lazy-import'exportdefaultdefineConfig({plugin......
  • 覆盖80%业务场景,原生鸿蒙出行、教育行业样板间专区上线
    华为原生鸿蒙之夜获得广泛关注,华为官宣鸿蒙生态设备数量已超过10亿台,鸿蒙原生应用和元服务数量已超过15000个,鸿蒙生态已进入飞速发展阶段。为更好地助力各行业开发者降本提效开发鸿蒙原生应用和元服务,华为开发者联盟生态市场(简称生态市场)近日上线了原生鸿蒙出行行业、教育行业“样......
  • 覆盖80%业务场景,原生鸿蒙出行、教育行业样板间专区上线
    华为原生鸿蒙之夜获得广泛关注,华为官宣鸿蒙生态设备数量已超过10亿台,鸿蒙原生应用和元服务数量已超过15000个,鸿蒙生态已进入飞速发展阶段。为更好地助力各行业开发者降本提效开发鸿蒙原生应用和元服务,华为开发者联盟生态市场(简称生态市场)近日上线了原生鸿蒙出行行业、教育行业“样......
  • C++——输入一个字符串,内有数字和非数字字符,如a123x456_ 17960?302tab5876将其中连续
    没注释的源代码#include<iostream>#include<stdio.h>usingnamespacestd;intmain(){  charstr[50],*pstr;  inti,j,k,m,e10,digit,ndigit,a[10],*pa;  cout<<"pleaseinputstring:"<<endl;  gets(str);  pstr=&str[......
  • 鸿蒙开发进阶(HarmonyOS )加速Web页面的访问
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)当Web页......
  • 鸿蒙HarmonyOS(ArkTS基础-1)
    文章目录HarmonyOS鸿蒙开发ArkTS语言1.初识ArkTS语言a.ArKTS是什么b.ArkTS的编程规范c.从Ts到ArkTS的注意点2.ArkTS的基本语法a.声明b.类型c.运算符d.语句HarmonyOS鸿蒙开发(本文档是在鸿蒙开发者文档的基础上,选取了最常用的一些关键语法,以及一些注释,可......
  • 鸿蒙系统崛起:开发者的机遇、挑战与战略
    随着科技的迅猛发展,鸿蒙操作系统以其独特的分布式架构和多设备协同能力,在全球操作系统市场中脱颖而出。它不仅与安卓和iOS形成了三足鼎立之势,还在智能手机、智能穿戴、车载系统以及智能家居等多个领域中获得了广泛应用。面对这一新兴生态系统,开发者如何抓住机遇,同时应对开发中......