HarmonyOS基本UI封装——标题栏组件NavBar封装与使用(二)

前言

文章系列

简介

鸿蒙基本库封装,提升鸿蒙开发效率

安装

dart 复制代码
ohpm install @peakmain/library

一、NabBar的使用

导入依赖

typescript 复制代码
import NavBar from "@peakmain/library/src/main/ets/components/title/NavBar"

基本使用

less 复制代码
  @State
  title: string = "默认样式"
  @State
  leftImage: PixelMap | ResourceStr | DrawableDescriptor | null = $r("app.media.ic_public_left_arrow")
  @State
  titleBold: boolean = true
  @State
  rightText: string = ""
  @State
  rightImage: PixelMap | ResourceStr | DrawableDescriptor | null = null
  build() {
    Column() {
      NavBar({
        title: this.title,//标题
        leftImage: this.leftImage,//左边返回图片
        titleBold: this.titleBold,//标题是否加粗
        right: this.rightText,//右边文本,默认为空
        rightClick: this.rightClick,//右边按钮的点击事件
        rightImage: this.rightImage//右边图片
      })
    }
  }
1. 隐藏/显示左边返回箭头,默认显示
kotlin 复制代码
this.leftImage = this.leftImage ? null : $r("app.media.ic_public_left_arrow")
  • null表示隐藏,非null表示显示并替换
2. 替换左边返回箭头
ini 复制代码
this.leftImage = $r("app.media.ic_new_left_arrow")
3. 修改标题
ini 复制代码
this.title = "NavBar 标题组件"
4. 标题是否加粗,默认是加粗
kotlin 复制代码
this.titleBold = !this.titleBold
5. 显示右边文本为清空,默认不显示
ini 复制代码
this.rightText = "清空"
6. 显示并设置右边图片按钮,默认不显示
ini 复制代码
this.rightImage = $r("app.media.ic_right_menu")

二、源码

less 复制代码
import { router } from '@kit.ArkUI'

@Preview
@Component
struct NavBar {
  @Prop
  title: string = "标题" //标题内容
  @Prop
  titleBold: boolean = true //标题是否加粗
  @Prop
  backgroundColorResource: ResourceColor = Color.White
  @Prop
  leftImage: PixelMap | ResourceStr | DrawableDescriptor | null = $r("app.media.ic_public_left_arrow") //左边箭头
  @Prop
  right: string = "" //右边内容
  @Prop
  rightImage: PixelMap | ResourceStr | DrawableDescriptor | null = null
  rightClick: () => void = () => {
  }

  build() {
    Stack() {
      // 返回键
      Row() {
        Image(this.leftImage)
          .width(25)
          .height(25)
      }
      .width(30)
      .height(30)
      .borderRadius(15)
      .visibility(this.leftImage ? Visibility.Visible : Visibility.Hidden)
      .justifyContent(FlexAlign.Center)
      .onClick(() => {
        router.back()
      })
      .zIndex(2)

      Text(this.title)
        .layoutWeight(1)
        .fontWeight(this.titleBold ? FontWeight.Bold : FontWeight.Normal)
        .fontColor($r("app.color.color_272a2b"))
        .fontSize(16)
        .textAlign(TextAlign.Center)
        .visibility(this.title ? Visibility.Visible : Visibility.Hidden)
        .width("100%")


      if (!this.rightImage) {
        Text(this.right ? this.right : "清空")
          .fontColor($r("app.color.color_272a2b"))
          .fontWeight(FontWeight.Bold)
          .visibility(this.right ? Visibility.Visible : Visibility.Hidden)
          .fontSize(14)
          .width("100%")
          .textAlign(TextAlign.End)
          .onClick(() => {
            this.rightClick && this.rightClick()
          })
          .zIndex(1)
      }
      if (this.rightImage) {
        Row() {
          Image(this.rightImage)
            .height(25)
            .onClick(() => {
              this.rightClick && this.rightClick()
            }).zIndex(1)
        }.width("100%")
        .onClick(() => {
          this.rightClick && this.rightClick()
        })
        .justifyContent(FlexAlign.End)
      }
    }
    .backgroundColor(this.backgroundColorResource)
    .width('100%')
    .alignContent(Alignment.Start)
    .height(56)
    .padding({
      right: 13,
      left: 12
    })
  }
}

export default NavBar

布局整体拆分分为:左边图片,中间标题,右边文本/右边图片

  • 我们可以使用Row来实现,但是右边图片可能没有,且图片宽度不能写死固定,这就导致Row实现的时候,可能会出现标题不完全居中

  • 为了保证布局完全居中,我们可以设置标题的宽度为整个屏幕的100%,同时文字居中

  • 我们如果按照Row顺序编写代码,我们会发现点击箭头的时候,没有任何效果

    • 原因是标题设置为100%,覆盖了箭头,点击箭头时实际点击的是标题
    • 为了解决这个问题,我们可以通过.zIndex属性来提高箭头按钮的优先级,这样就可以保证箭头按钮点击事件生效了
  • 这里父子组件通信用的是@State和@Prop,原因是这里不涉及到子组件修改,父组件跟着修改的情况

父组件调用子组件的方法

  • 子组件声明一个方法供给父组件调用,并子组件点击时需要判断是否为空
javascript 复制代码
rightClick: () => void = () => {
}
  • 父组件调用子组件时声明点击方法即可

三、总结

整体实现来说,还是相当简单的,主要是对相关API的熟悉。谢谢大家查看

相关推荐
2601_9622190132 分钟前
版本平滑升级架构:万象生鲜系统 V4.3.3 迭代无停机更新技术拆解
微服务·云原生·架构
2601_962218473 小时前
万象生鲜系统冷链物联网接入技术实现生鲜企业温控管理数字化
大数据·运维·微服务·云原生·架构
jianqiang.xue3 小时前
智能体整体架构设计:四大模块与目录组织
单片机·嵌入式硬件·物联网·架构·esp32
这个DBA有点耶3 小时前
数据库容灾进入“秒级时代”:同城双活架构原理、关键技术选型与落地实践
数据库·架构·dba
程序员贺加贝4 小时前
一次 SaaS ERP 主数据生命周期设计:Policy、PreCheck 与结构化阻断原因
java·后端·架构·saas
pnoker4 小时前
IoT DC3 消息总线:六适配器可插拔设计
物联网·架构·kafka·消息队列·rabbitmq
Dawson Zhu4 小时前
AI Agent 基础架构解析:从 LLM 到 ReAct 循环与 Harness 工程的工程化路径
人工智能·语言模型·架构·aigc·agi
贾伟康5 小时前
【天体运行模拟|11】HarmonyOS ArkTS 收藏与笔记实战:同步知识页和个人学习记录
harmonyos·arkts·preferences·多设备适配·arkdata
2501_919749036 小时前
华为鸿蒙录音可视化APP—小羊声觉
华为·harmonyos·鸿蒙
大雷神7 小时前
HarmonyOS AR Engine深度估计实战——把毫米距离画成实时热力图
华为·ar·harmonyos