HarmonyOS中实现TabBar(相当于Android中的TabLayout+ViewPager)

ops/2025/1/15 6:02:21/

 参考网址:自定义页签切换联动

1.自定义组件TabBarView


@Component
export struct TabBarView{@State currentIndex: number = 0@State selectedIndex: number = 0private controller: TabsController = new TabsController()//tab标签内容+横线布局@Builder tabBuilder(index: number, name: string) {Column() {Text(name).fontColor(this.selectedIndex === index ? '#007DFF' : '#182431').fontSize(18).fontWeight(this.selectedIndex === index ? 500 : 400).lineHeight(22).height('95%')Divider().strokeWidth(2).color('#007DFF').opacity(this.selectedIndex === index ? 1 : 0)}.backgroundColor(Color.White).width('100%').height('100%')}@Link arr: Array<string>@Builder tabItem(item: string) {}@BuilderParam item: (item: string) => void = this.tabItembuild() {Column() {Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {ForEach(this.arr, (item: string, index: number) => {TabContent() {this.item(item)}.tabBar(this.tabBuilder(index, item))}, (item: string, index: number) => index.toString())}.vertical(false).barMode(BarMode.Fixed).barWidth(360).barHeight(56).animationDuration(400).onChange((index: number) => {// currentIndex控制TabContent显示页签this.currentIndex = indexthis.selectedIndex = index}).onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {if (index === targetIndex) {return}// selectedIndex控制自定义TabBar内Image和Text颜色切换this.selectedIndex = targetIndex}).width('100%').height('100%').backgroundColor('#F1F3F5')}.width('100%')}
}

2.组件中使用

import { TabBarView } from "./TabBarView"
@Entry({routeName: 'IndexPage'})@Component
export struct IndexPage{@State arr: Array<string> = ['标签1', '标签2']@BuildertabItem(item: string){//在此处写各个标签对于的布局组件,可抽离出来使代码简洁if (item === this.arr[0]){//标签1组件}else if (item === this.arr[1]){//标签2组件}}build() {Column(){TabBarView({arr: this.arr, item: this.tabItem})}}
}

说明:我是根据官网提供的Tabs实例代码1(自定义页签切换联动)封装的简单使用(代码可直接使用),这种方式是为了复用。


http://www.ppmy.cn/ops/150217.html

相关文章

cartographer全局重定位的实现

cartographer全局重定位的实现 1.简介核心流程链接代码&#xff1a; 1.简介 本博客主要介绍cartographer全局重定位的实现&#xff0c;目前已经测试能够实现在6米180度范围内的全局重定位。 核心流程 这个重定位函数的流程&#xff0c;然后逐个部分给出实现代码。 1.创建线…

DevOps实用场景:在哪些业务中应用DevOps最有效

随着科技的迅猛发展和客户需求的不断变化&#xff0c;IT初创公司在不断追求更高的效率、更快速的交付和更强的市场适应力。在这个背景下&#xff0c;DevOps成为了推动组织成功的关键策略之一。本文将帮助您了解什么是DevOps&#xff0c;哪些团队或企业最适合实施DevOps&#xf…

mybatis-spring @MapperScan走读分析

接上一篇文章&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145100531&#xff0c; 本文注解分析mybatis-spring中的MapperScan注解&#xff0c;则将容易许多。 目录 MapperScan注解定义ConfigurationClassPostProcessor扫描注册beanDefinitionorg.mybatis.s…

ansible之playbook实战

环境&#xff1a; client centos server ubuntu cat pro1.yml --- - hosts: www.test.comtasks:- name: Install Httpd Serverapt: nameapache2 statepresent- name: Configurate Httpd Servercopy: content"Iam client" dest/var/www/html/index.html- name: Start…

React方向:react中5种Dom的操作方式

1、通过原生JS获取Dom去操作 通过document.querySelector(#title)原生js的方式去拿到dom节点&#xff0c;然后去进行操作。 import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title document.querySelector(#t…

Notepad++上NppFTP插件的安装和使用教程

一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP&#xff0c;一般情况下&#xff0c;自带的下载地址容易下载失败。这里准备了一个下载连接&#xff1a;Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

Java学习,集合遍历

Java遍历集合&#xff08;如List, Set, Map等&#xff09;通常有多种方法。遍历集合的方式&#xff0c;包括传统for循环、增强的for循环&#xff08;也称"for-each"循环&#xff09;、迭代器&#xff08;Iterator&#xff09;以及流&#xff08;Stream&#xff09;AP…