HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能

这篇具有很好参考价值的文章主要介绍了HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关键词:harmonyOS   鸿蒙开发  ArkTS  TabContent

使用场景:类微信底部导航栏,点击/左右滑动切换页面并加载数据

开发环境:ArkTS3.1  API9  Phone设备

HMOS Dev官方文档:文档中心

演示效果:

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

目录

完整Demo已提交至Gitee

搭建页面

自定义TabContent(往后翻有完整代码)

思路

开始

完整自定义tabs代码

页面切换后如何加载新数据

介绍

父子组件解释

开始

页面切换时可加载新数据的完整代码


完整Demo已提交至Gitee,传送门:

鸿蒙ArkTS tabBar页签切换Demo: HarmonyOS鸿蒙ArkTS tabBar页签切换完整项目Demo

搭建页面

我这里用三个页面举例,新建home、info、mine页面,创建components目录存放自定义Tabs组件,目录结构如下,我这里已经准备了6个图标图片存放在了resources/rawfile/tabs

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

自定义Tabs(附完整代码)

思路

index为应用加载的首页,加载自定义Tabs组件,Tabs组件中加载各个页面

开始

HMOS Dev官方文档 TabContent :文档中心

1.首先在index.est中导入自定义Tabs组件,避免与官方组件冲突取名comTabs

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

2.在自定义Tabs组件中导入所建的三个页面[如图3],记得在页面中使用export导出[如图4]

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescriptHarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

[左图3 | 右图4]

3.设置一个PAGE的枚举,增强可读性,不喜欢用就0123代替,因为页面切换的回调函数返回的数值从0开始,所以给currentIndex默认设置为0即为home页(@State装饰器修饰的属性当状态改变时,UI会发生对应的渲染改变),changePage自己写来用于更新页面数据函数,稍后会用到。别忘了new TabsController()[如图3]

4.官方提供了多种页签样式,我们使用置于底部的,将Tabs中barPosition属性设置为BarPosition.End。Tabs将占用整个页面,所以宽高需设置为100%。

Tabs组件中需要TabContent来加载页面。[如图5]

在tabBar中自定义页签按钮样式,因重复代码太多,我们可以利用@Builder装饰器来自定义构建函数复用代码。[如图6]

注意:自定义页签设置onClick事件用于改变页面索引,Tabs组件需设置onChange事件,不然页面左右滑动页签状态不会改变。

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

[图5]

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

[图6]  

完整自定义tabs代码

// tabs.ets

// home页
import Home from '../pages/home/home'
// info页
import Info from '../pages/info/info'
// mine页
import Mine from '../pages/mine/mine'

enum PAGE{
  HOME = 0,
  INFO = 1,
  MINE = 2
}

@Preview
@Component
export default  struct compTabs{
  @State currentIndex: number = 0;
  private tabsController: TabsController = new TabsController();

  changePage(e){
    this.currentIndex = e
    if (e == PAGE.HOME){
    }
    if (e == PAGE.INFO){
    }
    if (e == PAGE.MINE){
    }
  }

  @Builder TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {
    Column() {
      Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
        .size({ width: 20, height: 20 }).objectFit(ImageFit.Fill)
      Text(title)
        .fontColor(this.currentIndex === targetIndex ? '#484D54' : '#ff969da9')
        .fontSize(10).margin({top:3,bottom:3})
    }
    .width('100%')
    .height(67)
    .alignItems(HorizontalAlign.Center)
    .backgroundColor('#fff')
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
      this.currentIndex = targetIndex;
      this.tabsController.changeIndex(targetIndex);
    })
  }

  build() {
    Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {
      TabContent() {
        Home()
      }.tabBar(this.TabBuilder('首页', 0, $rawfile('tabs/home_a.png'), $rawfile('tabs/home.png')))

      TabContent() {
        Info()
      }.tabBar(this.TabBuilder('信息', 1, $rawfile('tabs/service_a.png'), $rawfile('tabs/service.png')))

      TabContent() {
        Mine()
      }.tabBar(this.TabBuilder('我的', 2, $rawfile('tabs/me_a.png'), $rawfile('tabs/me.png')))
    }.onChange((index: number) => {
      this.changePage(index)
    })
    .width('100%')
    .height('100%')
  }
}

页面切换后如何加载新数据

介绍

需要注意的是,在tabContent中不管有多少个页面都会被一次性加载完,切换页面不会达到页面更新的效果。那么页面切换后,如何加载页面的数据呢,很简单,可以利用官方提供的@Link装饰器(父子双向同步)向子组件传递一个时间戳参数过去,页面中使用@Watch监听这个时间戳属性的变化触发自定义的customShow函数。

或者可以增加 if 判断页面索引使其重新加载

父子组件解释

在上述的tabs讲述中导入了home页面、info页面、mine页面,那这三个页面就相当于是tabs的子组件了

开始

1.给子组件设置@Link修饰的timer属性(@Link修饰不用赋初值)

2.利用@watch监听一个自定义函数customShow,当父组件的这个timer改变时子组件就会触发这个函数[如图9]

3.父组件Tabs设置三个属性HomeTimer、InfoTimer、MineTimer,分别记录每个页面的时间戳,新增timeStamp函数返回当前时间戳,在changePage函数触发时获取最新的时间戳[如图7],TabContent中页面里传参时别忘了$符号[如图8]

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

[图7]

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

[图8]

HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能,harmonyos,鸿蒙,typescript

[图9]

同样可以自定义页面的销毁等等,这是我在鸿蒙开发中最常用最省事最高效的办法了,大家不妨试试。

页面切换时可加载新数据的完整代码

Tabs.est

// Tabs.ets

// home页
import Home from '../pages/home/home'
// info页
import Info from '../pages/info/info'
// mine页
import Mine from '../pages/mine/mine'

enum PAGE{
  HOME = 0,
  INFO = 1,
  MINE = 2
}

@Preview
@Component
export default  struct compTabs{
  @State currentIndex: number = 0;
  @State HomeTimer: number = 0;
  @State InfoTimer: number = 0;
  @State MineTimer: number = 0;
  private tabsController: TabsController = new TabsController();

  changePage(e){
    this.currentIndex = e
    if (e == PAGE.HOME){
      this.HomeTimer = this.timeStamp()
    }
    if (e == PAGE.INFO){
      this.InfoTimer = this.timeStamp()
    }
    if (e == PAGE.MINE){
      this.MineTimer = this.timeStamp()
    }
  }

  timeStamp(){
    return new Date().getTime();
  }

  @Builder TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {
    Column() {
      Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
        .size({ width: 20, height: 20 }).objectFit(ImageFit.Fill)
      Text(title)
        .fontColor(this.currentIndex === targetIndex ? '#484D54' : '#ff969da9')
        .fontSize(10).margin({top:3,bottom:3})
    }
    .width('100%')
    .height(67)
    .alignItems(HorizontalAlign.Center)
    .backgroundColor('#fff')
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
      this.currentIndex = targetIndex;
      this.tabsController.changeIndex(targetIndex);
    })
  }

  build() {
    Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {
      TabContent() {
        Home({ timer:$HomeTimer })
      }.tabBar(this.TabBuilder('首页', 0, $rawfile('tabs/home_a.png'), $rawfile('tabs/home.png')))

      TabContent() {
        Info({ timer:$InfoTimer })
      }.tabBar(this.TabBuilder('信息', 1, $rawfile('tabs/service_a.png'), $rawfile('tabs/service.png')))

      TabContent() {
        Mine({ timer:$MineTimer })
      }.tabBar(this.TabBuilder('我的', 2, $rawfile('tabs/me_a.png'), $rawfile('tabs/me.png')))
    }.onChange((index: number) => {
      this.changePage(index)
    })
    .width('100%')
    .height('100%')
  }
}

home.est文章来源地址https://www.toymoban.com/news/detail-755431.html

import promptAction from '@ohos.promptAction';

@Component
export default struct Home {
  @State message: string = 'home页面'
  @Link @Watch('customShow') timer: Number

  customShow(){
    promptAction.showToast({
      message: "页面展示"
    });
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}

到了这里,关于HarmonyOS ArkTS TabContent组件实现类微信(可滑动的)tabBar页签切换页面功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • harmonyOS基础(三)- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)

    大家好!我是黑臂麒麟,一位6年的前端; 随着 鸿蒙4.0 的发布。鸿蒙社区不断壮大,且市场对 harmonyOS 应用认可度越来越高。很多公司开始对 鸿蒙应用开发 越来越重视。 之前想入坑鸿蒙,一直犹豫未下定决心学习。这次不再等待,开始系统学习起来。 此系列文章只做 harm

    2024年02月20日
    浏览(38)
  • HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

    通过前面ArkTS开发语言(上)之TypeScript入门以及ArkTS开发语言(中)之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进,知道了ArkTS具备了声明式语法和组件化特性,今天,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,使

    2024年02月04日
    浏览(41)
  • HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack

    堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。该组件从API Version 7开始支持。可以包含子组件。 一、接口 Stack(value?: { alignContent?: Alignment }) 从API version 9开始,该接口支持在ArkTS卡片中使用。 二、属性 除支持通用属性外,还支持以下属性: 三、示例

    2024年02月07日
    浏览(28)
  • 【HarmonyOS】ArkTS 组件内转场动画,动画播放时颜色异常问题

    【】 HarmonyOS、ArkTS、组件内转场动画、颜色异常 【问题描述】 根据组件内转场动画文档中示例编写代码,使用动画转场组件button,并给button设置背景色让button透明度为0,实现动画转场时,会先出现默认蓝色button,然后动画再消失,问题代码如下所示: 问题现象请见下

    2024年02月15日
    浏览(35)
  • 【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)

    Select组件:提供下拉选择菜单,可以让用户在多个选项之间选择。 Slider组件:滑动条组件,通常用于快速调节设置值,如音量调节、亮度调节等应用场景。 提供下拉选择菜单,可以让用户在多个选项之间选择。 说明 该组件从API Version 8开始支持。后续版本如有新增内容,则

    2024年02月07日
    浏览(40)
  • 微信小程序日历组件(可滑动,可展开收缩,可标点)

    效果图 组件介绍 原生小程序编写,简单轻便,拿来即用。 推荐从代码托管地址获取代码,后续会更新功能: github地址 | gitee地址 代码部分(这里可能不是最新的,推荐去gitee克隆代码) calendar.wxml calendar.js calendar.json calendar.wxss

    2024年02月11日
    浏览(39)
  • 【HarmonyOS(ArkTS)学习笔记-3】认识ArkTS语言

    内容学习来自华为开发者学习网站 文档中心 https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/arkui-overview-0000001532577181-V3 目录 认识ArkTS开发语言 1.ArkTS 1.1 认识ArkTS 1.2 ArkTS基本语法 2.TypeScript基础语法介绍 2.1 基础类型 2.1.1 布尔值(boolean) 2.1.2 数字(number) 2.1.3 字符串(s

    2024年01月21日
    浏览(42)
  • Android开发-UI界面--类微信页面设计

    一、功能说明 二、开发技术 ​ 本次用到了 layout.xml、控件、监听、fragment layout(布局) ​ 定义了用户界面的可视化结构,主要有4种布局: ConstrainLayout (约束布局):一个使用“相对定位”灵活地确定微件的位置和大小的一个布局 LinearLayout (线性布局):按照水平或垂直

    2024年02月10日
    浏览(27)
  • 【HarmonyOS北向开发】-05 ArkTS开发语言-ArkTS开发实践

    飞书原文档:Docs 

    2024年02月11日
    浏览(38)
  • 【HarmonyOS】ArkTS-函数

    函数:是可以被重复使用的代码块 作用:函数可以把具有相同或相似逻辑的代码“包裹”起来,有利于代码复用。 定义函数 调用函数 注意:先定义,后使用 (变量、函数都是如此) 根据我们传入不同的数据,进行处理,返回处理后的结果。 箭头函数是 比普通函数 更简洁

    2024年03月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包