鸿蒙HarmonyOS开发:tabs结合tabContent实现底部tabBar导航栏页面布局

文章目录

      • 一、组件介绍
        • 1、Tabs
          • 参数
          • 属性
          • 事件
          • TabsController
        • 2、子组件
          • 属性
          • 说明
      • 二、基础示例
        • 1、基础顶部导航
        • 2、效果
        • 3、可以滚动导航栏
        • 2、效果
      • 三、扩展示例
        • 自定义导航栏
        • 1、代码
        • 2、效果

一、组件介绍

Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航页签栏,页面结构如下图所示,根据不同的导航类型,布局会有区别,可以分为底部导航、顶部导航、侧边导航,其导航栏分别位于底部、顶部和侧边。

在这里插入图片描述

1、Tabs

通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。

仅可包含子组件TabContent。

Tabs(value?: {barPosition?: BarPosition, index?: number, controller?: TabsController})
参数
参数名参数类型必填参数描述
barPositionBarPosition设置Tabs的页签位置。
默认值:BarPosition.Start
indexnumber设置当前显示页签的索引。
默认值:0
说明:
设置为小于0的值时按默认值显示。
可选值为[0, TabContent子节点数量-1]。
设置不同值时,默认生效切换动效,可以设置animationDuration为0关闭动画。
controllerTabsController设置Tabs控制器。
属性
名称参数类型描述
verticalboolean设置为false是为横向Tabs,设置为true时为纵向Tabs。
默认值:false
scrollableboolean设置为true时可以通过滑动页面进行页面切换,为false时不可滑动切换页面。
默认值:true
barModeBarModeTabBar布局模式,具体描述见BarMode枚举说明。
默认值:BarMode.Fixed
barWidthnumberTabBar的宽度值。
barHeightnumberTabBar的高度值。
animationDurationnumber点击TabBar页签切换TabContent的动画时长。不设置时,点击TabBar页签切换TabContent无动画。
默认值:300
说明:
该参数不支持百分比设置;设置为小于0时,按默认值300ms显示。
事件
onChange(event: (index: number) => void)

Tab页签切换后触发的事件。

  • index:当前显示的index索引,索引从0开始计算。

触发该事件的条件:

  • 1、TabContent支持滑动时,组件触发滑动时触发。
  • 2、通过控制器API接口调用。
  • 3、通过状态变量构造的属性值进行修改。
  • 4、通过页签处点击触发。
TabsController

Tabs组件的控制器,用于控制Tabs组件进行页签切换。不支持一个TabsController控制多个Tabs组件。

controller: TabsController = new TabsController()
changeIndex(value: number): void

参数:

参数名参数类型必填参数描述
valuenumber页签在Tabs里的索引值,索引值从0开始。
说明:
设置小于0或大于最大数量的值时,该事件失效。
2、子组件
TabContent()
属性
名称参数类型描述
tabBarstringResource
说明
  • TabContent组件不支持设置通用宽度属性,其宽度默认撑满Tabs父组件。
  • TabContent组件不支持设置通用高度属性,其高度由Tabs父组件高度与TabBar组件高度决定。
  • vertical属性为false值,交换上述2个限制。
  • TabContent组件不支持内容过长时页面的滑动,如需页面滑动,可嵌套List使用。

二、基础示例

1、基础顶部导航
@Entry
@Component
struct TabsPage2 {build() {Column() {Tabs() {TabContent() {Text('首页的内容').fontSize(30)}.tabBar('首页')TabContent() {Text('推荐的内容').fontSize(30)}.tabBar('推荐')TabContent() {Text('发现的内容').fontSize(30)}.tabBar('发现')TabContent() {Text('我的内容').fontSize(30)}.tabBar("我的")}}.width('100%').height('100%')}
}
2、效果

在这里插入图片描述

3、可以滚动导航栏

滚动导航栏可以用于顶部导航栏或者侧边导航栏的设置,内容分类较多,屏幕宽度无法容纳所有分类页签的情况下,需要使用可滚动的导航栏,支持用户点击和滑动来加载隐藏的页签内容。

滚动导航栏需要设置Tabs组件的barMode属性,默认情况下其值为Fixed,表示为固定导航栏,设置为Scrollable即可设置为可滚动导航栏。

@Entry
@Component
struct TabsPage2 {@State tabsList: Array<string> = ['关注', '视频', '游戏', '数码', '科技', '体育', '影视', '人文', '艺术', '自然', '军事'];build() {Column() {Tabs() {ForEach(this.tabsList, (item) => {TabContent() {Text(item).fontSize(30)}.tabBar(item)})}.barMode(BarMode.Scrollable)}.width('100%').height('100%')}
}
2、效果

在这里插入图片描述

三、扩展示例

自定义导航栏

对于底部导航栏,一般作为应用主页面功能区分,为了更好的用户体验,会组合文字以及对应语义图标表示页签内容,这种情况下,需要自定义导航页签的样式。

系统默认情况下采用了下划线标志当前活跃的页签,而自定义导航栏需要自行实现相应的样式,用于区分当前活跃页签和未活跃页签。设置自定义导航栏需要使用tabBar的参数,以其支持的CustomBuilder的方式传入自定义的函数组件样式。例如这里声明TabBuilder的自定义函数组件,传入参数包括页签文字title,对应位置index,以及选中状态和未选中状态的图片资源。通过当前活跃的currentIndex和页签对应的targetIndex匹配与否,决定UI显示的样式。

  • 在TabContent对应tabBar属性中传入自定义函数组件,并传递相应的参数。

  • 在不使用自定义导航栏时,系统默认的Tabs会实现切换逻辑。在使用了自定义导航栏后,切换页签的逻辑需要手动实现。即用户点击对应页签时,屏幕需要显示相应的内容页 。

  • 切换指定页签需要使用TabsController,TabsController是Tabs组件的控制器,用于控制Tabs组件进行页签切换。通过TabsController的changeIndex方法来实现跳转至指定索引值对应的TabContent内容。

  • 使用自定义导航栏时,在tabBar属性中传入对应的@Builder,并传入相应的参数。

1、代码

tabsPage.ets

import {Cate} from "./tabs/cate"
import {Cart} from "./tabs/cart"
import {Msg} from "./tabs/msg"
import {User} from "./tabs/user"@Entry
@Component
struct TabsPage {@State currentIndex: number = 0private tabsController: TabsController = new TabsController()@Builder TabBuilder(title:string,targetIndex:number,normalImg:Resource,selectedImg:Resource){Column(){Image(this.currentIndex==targetIndex?selectedImg:normalImg).width(28).height(28)Text(title).fontSize(14).margin({top:4}).fontColor(this.currentIndex==targetIndex?'#45C461':'#999999')}.backgroundColor("#ffffff").width('100%').height(60).justifyContent(FlexAlign.Center).onClick(()=>{this.currentIndex=targetIndexthis.tabsController.changeIndex(this.currentIndex)})}build() {Column() {Tabs({barPosition:BarPosition.End,controller:this.tabsController,index:0}){TabContent(){Cate()}.tabBar(this.TabBuilder('分类',0,$r("app.media.tabs_1_off"),$r("app.media.tabs_1_on")))TabContent(){Cart()}.tabBar(this.TabBuilder('购物车',1,$r("app.media.tabs_2_off"),$r("app.media.tabs_2_on")))TabContent(){Msg()}.tabBar(this.TabBuilder('消息',2,$r("app.media.tabs_3_off"),$r("app.media.tabs_3_on")))TabContent(){User()}.tabBar(this.TabBuilder('我的',3,$r("app.media.tabs_4_off"),$r("app.media.tabs_4_on")))}.scrollable(false)//去掉左右滑动的效果.animationDuration(0)//去掉左右滑动的动画}.backgroundColor("#eeeeee").width('100%').height('100%')}
}

tabs/cart.ets

@Componentexport struct Cart {build(){Text("购物车")}
}

其他页面内容都一样,自行编写。

2、效果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

iec61850通信协议是什么

EC 61850是国际电工委员会&#xff08;IEC&#xff09;制定的一个用于电力系统自动化的国际标准。该协议广泛应用于变电站自动化、配电网自动化和智能电网等领域&#xff0c;旨在实现不同设备和系统之间的互操作性和高效通信。本文将详细介绍IEC 61850通信协议的特点、架构、关…

力扣HOT100 - 138. 随机链表的复制

解题思路&#xff1a; class Solution {public Node copyRandomList(Node head) {if(headnull) return null;Node p head;//第一步&#xff0c;在每个原节点后面创建一个新节点//1->1->2->2->3->3while(p!null) {Node newNode new Node(p.val);newNode.next …

【原创 精华】渗透测试-信息收集

一切需要用到的软件均已备份到百度云和阿里云 没有链接的文件请在本地渗透工具文件夹或是 kali 里查看 能用 fofa 的尽量用 包括查 ip&#xff0c;端口扫描&#xff0c;子域名&#xff0c;蜜罐 子域名收集 工具 子域名挖掘机&#xff08;本地文件有&#xff09; 通过爆破…

Ovid医学库文献如何在家查找下载

今天讲的数据库是一个知名医学库——Ovid Ovid隶属于威科集团的健康出版事业集团&#xff0c;与LWW、Adis等公司属于姊妹公司。Ovid数据库在医学外文文献数据库方面占据绝对地位&#xff0c;目前已有包涵人文、科技等多领域数据库300个&#xff0c;其中80多个是生物医学数据库…

CTF解题技能之MISC基础

杂项介绍 Miscellaneous简称MISC&#xff0c;意思是杂项&#xff0c;混杂的意思。 杂项大致有几种类型&#xff1a; 1.隐写 2.压缩包处理 3.流量分析 4.攻击取证 5.其它 本篇主要介绍杂项基础题目的知识点以及解题思路。 0x00 文件类型识别 杂项题目主要是以文件附件作…

Mac免费软件推荐

1. iTerm2 - 功能强大的终端 iTerm2 是一个功能强大且灵活的终端仿真器&#xff08;可替代系统默认终端&#xff09;&#xff0c;适合需要在 macOS 上进行大量终端操作的用户。其丰富的功能和高可定制性使得 iTerm2 成为许多开发者和系统管理员的首选工具。无论是处理多个会话…

【ARFoundation自学03】平面追踪可视化效果美化

对已检测到的平面默认的渲染效果显得有些生硬和突兀&#xff0c;有时我们需要更加友好、美观的的平面虚拟界面&#xff0c;这时就需要对已检测到的平面定制个性化的可视方案。为达到更好的视觉效果&#xff0c;处理的思路如下。 视觉效果前后对比&#xff01; &#xff08;本节…

Spring:事务(tx)

1. 简介 spring对jdbc进行封装&#xff0c;简化对数据库的操作 2. HelloWorld 1. 搭建模块 2.加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>s…

力扣刷题--1528. 重新排列字符串【简单】

题目描述 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s &#xff0c;其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新排列后的字符串。 示例 1&#xff1a; 输入&#xff1a;s “codeleet”, indices [4,5,6,7,0,2,1,3] 输…

Clickhouse 嵌套数据类型总结—— Clickhouse 基础篇(三)

文章目录 创建嵌套类型的表插入读取数据在嵌套类型上使用数组函数 在 clickhouse 中存储嵌套类型的关键字是 Nested, 只支持一级嵌套。数据结构类似于在数据结构类似于在表的单元格里面嵌套“一张表格”&#xff0c;如下图所示&#xff1a; 嵌套类型是列存储&#xff0c;本质…

【传知代码】遵循人类指令的高质量图像修复(论文复现)

前言&#xff1a;在数字化时代的浪潮中&#xff0c;图像已成为我们生活中不可或缺的一部分。它们记录着我们的记忆&#xff0c;传递着信息&#xff0c;甚至塑造着我们的认知。然而&#xff0c;正如生活中难以避免的瑕疵&#xff0c;这些数字图像也时常因为各种原因出现损伤、失…

RangeNet++ 检测3D点云语义算法的详细配置和常见问题

配置环境&#xff1a; Ubuntu18.04 GPU&#xff1a;GeForce MX150 驱动&#xff1a;Ubuntu推荐的nvidia-driver-470 Cuda10.1 cudnn7.6.2 TensorRT 5.1.5.0GCC 7.5.0 运行代码&#xff1a; RangeNet 目录 目录 一、环境配置 1. Ubuntu 18.04 安装NVIDIA驱动 &…

基于Vue uni-app的自定义列表表格信息展示组件

摘要&#xff1a;随着软件技术的不断发展&#xff0c;前端开发面临着越来越多的挑战。特别是在业务场景复杂多变的情况下&#xff0c;如何提高开发效率和降低维护成本成为了关键。本文旨在探讨组件化开发在前端应用中的重要性&#xff0c;并以Vue uni-app自定义列表表格为例&am…

R语言lavaan结构方程模型(SEM)

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

I.MX6ULL模仿 STM32 驱动开发格式实验

系列文章目录 I.MX6ULL模仿 STM32 驱动开发格式实验 I.MX6ULL模仿 STM32 驱动开发格式实验 系列文章目录一、前言二、模仿 STM32 寄存器定义2.1 STM32 寄存器定义简介2.2 I.MX6Ul 寄存器定义2.3硬件原理图2.4实验程序编写 三、编译下载验证 一、前言 使用 C 语言编写 LED 灯驱…

2024年中国金融行业网络安全市场全景图

网络安全一直是国家安全的核心组成部分&#xff0c;特别是在金融行业&#xff0c;金融机构拥有大量的敏感数据&#xff0c;包括个人信息、交易记录、财务报告等&#xff0c;这些数据的安全直接关系到消费者的利益和金融市场的稳定&#xff0c;因此金融行业在网络安全建设领域一…

SSL协议:网络安全通信的守护者

在网络通信迅猛发展的今天&#xff0c;数据安全和隐私保护变得尤为重要。安全套接层协议&#xff08;Secure Sockets Layer, SSL&#xff09;作为早期网络加密及身份验证的基石&#xff0c;为在线数据传输提供了安全保障。下面我们就来了解一下SSL协议。 SSL协议概述 SSL协议最…

[nextjs]推荐几个很好看的模板网站

最近在做网站,折腾了 vue 框架,然后发现了 nextjs 框架,感觉这个做出来的网站配色很好看,然后又开始研究这个 网站配色好看是因为用的 tailwindcss,找网站过程中,发现了几个很好看的模板网站,在这里推荐下,或许你也能用得上 推荐第一个网站是: https://tailspark.co/ 有组件,也…

前端项目性能优化:工程化环境中将图片转为base64(vite插件)

一、优化原理 通过将图片转为base64的形式来减少请求&#xff0c;实现性能优化。 考虑到过大的图片转为base64形式会导致加载时间过长&#xff0c;反而会影响性能&#xff0c;所以需要对转化的图片的大小进行限制。 每次去使用图片的时候都去手动转化一次是很麻烦的&#xf…

python--pycharm中将venv删除后怎么办

在终端中输入以下命令来创建一个新的虚拟环境&#xff08;可选&#xff09;&#xff1a; python -m venv venv 激活虚拟环境&#xff1a; Windows: .\venv\Scripts\activate选择自己项目的虚拟环境