鸿蒙进阶篇-自定义组件

大家好,我是鸿蒙开天组,今天咱们来学习自定义组件。

一、自定义组件定义

在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。

相比于之前学习的轻量级 UI 复用机制 @Builder,自定义组件的功能更为强大,日常开发中如果要对 【UI 或业务逻辑】进行复用,需要【掌握】自定义组件的能力。

二、自定义组件特点

自定义组件具有以下特点:

  • 可组合:允许开发者组合使用系统组件、及其属性和方法。

  • 可重用:自定义组件可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用。

  • 数据驱动UI更新:通过状态变量的改变,来驱动UI的刷新。

三、自定义组件基本用法

1.1自定义组件创建

首先自定义组件需要创建出来,创建的自定义组件基本语法如下:

// 创建
@Component
struct MyComponent {
  // 状态变量
  @State message:string =''
  build(){
    // .... 描述 UI
  }
}

观察以上结构,主要分成三个部分,可以理解成这是自定义组件创建的固定写法:

  • @Component:@Component装饰器仅能装饰struct关键字声明的数据结构。
  • struct:自定义组件基于struct实现,struct + 自定义组件名 + {...}的组合构成自定义组件,不能有继承关系。对于struct的实例化,可以省略new。
  • build()函数:build()函数用于定义自定义组件的声明式UI描述,自定义组件必须定义build()函数。

要注意的是,struct后面的自定义组件名,这个名称就是自定义组件的标记,不能和系统组件名相同,比如不能命名成Text、Image等

有些细心的同学可能已经注意到,这个结构和咱们平时打开的默认页面结构很像,但是默认页面上,还多出了一个@Entry:

  • @Entry:@Entry装饰的自定义组件将作为UI页面的入口。在单个UI页面中,最多可以使用@Entry装饰一个自定义组件。

在我们的单个组件中,没有使用@Entry去装饰的时候,想要单独预览它的效果,也可以考虑使用@Preview装饰,再点击预览器即可预览效果。

1.2自定义组件使用

接下来是自定义组件的使用,使用当然是丢进有@Entry装饰的UI页面里了,我们用一个简单的例子来看看自定义组件的基本用法,上代码演示:

@Component
struct HelloComponent {
  @State message: string = 'mate70还没发布';

  build() {
    // HelloComponent自定义组件组合系统组件Row和Text
    Row() {
      Text(this.message)
        .onClick(() => {
          // 状态变量message的改变驱动UI刷新,UI从'mate70还没发布'或'mate70发布了'刷新为'mate70发布啦啊啊啊!'
          this.message = 'mate70发布啦啊啊啊!';
        })
        .width('100%')
        .height(60)
        .fontSize(20)
        .backgroundColor('#E6E6E6')
        .textAlign(TextAlign.Center)
    }
  }
}

/*-----------------------两个组件之间的分割线-------------------------*/

class HelloComponentParam {
  message: string = ""
}

@Entry
@Component
struct ParentComponent {
  param: HelloComponentParam = {
    message: 'mate70发布了'
  }

  build() {
    Column() {
      Text('mate70发布了吗?')
        .fontSize(20)
        .width('100%')
        .height(60)
        .backgroundColor('#E6E6E6')
        .textAlign(TextAlign.Center)
      HelloComponent();
      Divider()
      HelloComponent(this.param);
    }
  }
}

点击前后的效果分别如下:

 1.3自定义组件传值

自定义组件除了必须要实现build()函数外,其他【属性】和【方法】的写法跟之前一样,也可以通过点语法设置通用样式,由于都和之前一样,这里就不再说明。

而从上面的例子,我们还可以看出,使用自定义组件时,小括号中没有传值,就会使用自定义组件HelloComponent中定义的message默认值,即“mate70还没发布”;如果在小括号中传同名的值即message时,默认值就会被覆盖,显示为“mate70发布了”。

以上例子上,我们可以把ParentComponent称为父组件,而在它内部调用的HelloComponent称之为子组件,往后这种父组件和子组件之间的参数传递会非常常见。

1.4传递回调参数

使用自定义组件时还有一种传递回调函数的写法,这种写法非常重要。咱们来看看它的适用场景:

  1. 需要父组件传递【逻辑代码】给子组件
  2. 在 1 的基础上,子组件需要【传递数据】给父组件

基础代码结构如下:

@Component
struct 子组件 {
  // 1.定义箭头函数
  func1 = () => {}
  func2 = (参数: 类型) => {}

  build() {
    // 略 2.根据情境调用 func1,func2并传递参数
  }
}

@Entry
@Component
struct 父组件 {
  build() {
    子组件({
      // 3. 父组件传递回调函数给子组件
      func1: () => {
        // 具体的逻辑
      },
      func2: (参数: 类型) => {
        // 具体的逻辑
      }

    })
  }
}

比如通过定义子组件的箭头函数,实现点击+1到+4的累加效果,这是不传递参数的写法:

@Component
struct addCom {
  // 1. 定义点击+1-+4的箭头函数
  addOne = () => {
  }
  addTwo = () => {
  }
  addThree = () => {
  }
  addFour = () => {
  }

  build() {
    Column() {
      Text('累加器')
        .fontSize(20)
      Row() {
        // 2. 调用+1-+4对应的回调函数
        Button('点击+1')
          .onClick(() => {
            this.addOne()
          })
        Button('点击+2')
          .onClick(() => {
            this.addTwo()
          })
        Button('点击+3')
          .onClick(() => {
            this.addThree()
          })
        Button('点击+4')
          .onClick(() => {
            this.addFour()
          })
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)
    }
    .border({ width: 1 })
    .padding(5)

  }
}

@Entry
@Component
struct Page04_callback {
  @State num: number = 0

  build() {
    Column() {
      Text('回调函数')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Text('num:' + this.num)
        .fontSize(30)
      addCom({
        // 3. 传递回调函数
        addOne: () => {
          this.num++
        },
        addTwo: () => {
          this.num += 2
        },
        addThree: () => {
          this.num += 3
        },
        addFour: () => {
          this.num += 4
        }
      })
    }
    .height('100%')
  }
}


但如果使用参数传递,可以简化代码书写,改写结果如下,功能是相同的:

@Component
struct addCom {
  // 点击+1-+4的箭头函数
  addCount = (count: number) => {
  }

  build() {
    Column() {
      Text('累加器-传递参数')
        .fontSize(20)
      Row() {
        Button('点击+1')
          .onClick(() => {
            this.addCount(1)
          })
        Button('点击+2')
          .onClick(() => {
            this.addCount(2)
          })
        Button('点击+3')
          .onClick(() => {
            this.addCount(3)
          })
        Button('点击+4')
          .onClick(() => {
            this.addCount(4)
          })
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)
    }
    .border({ width: 1 })
    .padding(5)

  }
}

@Entry
@Component
struct Page04_callback {
  @State num: number = 0

  build() {
    Column() {
      Text('回调函数')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Text('num:' + this.num)
        .fontSize(30)
      addCom({
        addCount: (count: number) => {
          this.num += count
        }
      })
    }
    .height('100%')
  }
}


好了,关于自定义组件的分享就到这里,感谢阅读,你的点赞和收藏都是莫大的支持,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出 WebSocket:构建实时数据大屏的高级实践

简介 请参考下方,学习入门操作 基于 Flask 和 Socket.IO 的 WebSocket 实时数据更新实现 在当今数字化时代,实时性是衡量互联网应用的重要指标之一。无论是股票交易、在线游戏,还是实时监控大屏,WebSocket 已成为实现高效、双向…

一键AI换脸软件,支持表情控制,唇形同步Facefusion-3.0.0发布!支持N卡和CPU,一键启动包

嗨,小伙伴们!还记得小编之前介绍的FaceFusion 2.6.1吗?今天给大家带来超级exciting的消息 —— FaceFusion 3.0.0闪亮登场啦! 🌟 3.0.0版本更新 🏗️ 全面重构:修复了不少小虫子,运行更稳定,再也不怕突然罢工啦! 😀 Live Portrait功能:新增…

spring boot框架漏洞复现

spring - java开源框架有五种 Spring MVC、SpringBoot、SpringFramework、SpringSecurity、SpringCloud spring boot版本 版本1: 直接就在根下 / 版本2:根下的必须目录 /actuator/ 端口:9093 spring boot搭建 1:直接下载源码打包 2:运行编译好的jar包:actuator-testb…

hhdb数据库介绍(10-8)

首页 管理平台通过数据可视方式在首页功能中实时展示计算节点集群的数据量、访问流量、集群组件状态、告警事件、安全防控等用户关心的信息。 集群安全 邮件通知:根据通知设置中监控开关是否打开判断,分为:全部开启、未开启、部分开启&…

Vue前端开发-slot传参

slot 又称插槽,它是在子组件中为父组件提供的一个占位符,使用来表示,通过这个占位符,父组件可以向中填充任意的内容代码,这些代码将自动替换占位符的位置,从而轻松实现在父组件中控制子组件内容的需求。 作…

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包 1、DMA串口发送数据 当串口的波特率大于115200时,可以通过DMA1进行数据搬运,以防止数据的丢失。如上图所示:UART1的Tx发送请求使用DMA1的…

2024 java大厂面试复习总结(一)(持续更新)

10年java程序员,2024年正好35岁,2024年11月公司裁员,记录自己找工作时候复习的一些要点。 java基础 hashCode()与equals()的相关规定 如果两个对象相等,则hashcode一定也是相同的两个对象相等,对两个对象分别调用eq…

深度学习5

一、模型保存与加载 1、序列化方式 保存方式:torch.save(model, "model.pkl") 打开方式:model torch.load("model.pkl", map_location"cpu") ​ import torch import torch.nn as nnclass MyModle(nn.Module):def __ini…

Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)

目录 一、Zset有序集合类型介绍 二、常见命令 1、ZADD 2、ZCARD 3、ZCOUNT 4、ZRANGE 5、ZREVRANGE 6、ZRANGEBYSCORE 7、ZREVRANGEBYSCORE 8、ZPOPMAX 9、ZPOPMIN 10、ZRANK 11、ZREVRANK 12、ZSCORE 13、ZREM 14、ZREMRANGEBYRANK 15、ZREMRANGEBYSCORE 16…

ARM架构 AArch64 基础知识介绍

介绍 aarch64是 ARM 架构的 64 位版本,它是 ARMv8 架构的一部分,被设计用来提供更高的性能和更大的地址空间,同时保持与 32 位 ARM 架构的兼容性。AArch64 是 ARMv8 的 64 位指令集架构(ISA),它提供了丰富的…

Rust中Tracing 应用指南

欢迎来到这篇全面的Rust跟踪入门指南。Rust 的tracing是一个用于应用程序级别的诊断和调试的库。它提供了一种结构化的、异步感知的方式来记录日志和跟踪事件。与传统的日志记录相比,tracing能够更好地处理复杂的异步系统和分布式系统中的事件跟踪,帮助开…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

WinFrom调用webapi接口另一个方法及其应用实例

1.调用接口方法 代码如下&#xff1a; public class WebAPI{#region WebAPI调用 public async Task<string> Call_Webapi(string Url, string Json) //url传入的是接口名称&#xff0c;json传入的是接口参数{string responseBody string.Empty; //responseBod…

elasticsearch的索引模版使用方法

5 索引模版⭐️⭐️⭐️⭐️⭐️ 索引模板就是创建索引时要遵循的模板规则索引模板仅对新创建的索引有效&#xff0c;已经创建的索引并不受索引模板的影响 5.1 索引模版的基本使用 1.查看所有的索引模板 GET 10.0.0.91:9200/_index_template2.创建自定义索引模板 xixi &…

从零开始学GeoServer源码(二)添加支持arcgis切片功能

文章目录 参考文章环境背景1、配置打包好的程序1.1、下载GeoServer的war包1.2、下载GeoWebCache1.3、拷贝jar包1.4、修改配置文件1.4.1、拷贝geowebcache-arcgiscache-context.xml1.4.2、修改geowebcache-core-context.xml1.4.3、修改geowebcache-servlet.xml 1.5、配置切片信息…

Redis 可观测最佳实践

Redis 介绍 Redis 是一个开源的高性能键值对&#xff08;key-value&#xff09;数据库。它通常用作数据库、缓存和消息代理。Redis 支持多种类型的数据结构&#xff0c;Redis 通常用于需要快速访问的场景&#xff0c;如会话缓存、全页缓存、排行榜、实时分析等。由于其高性能和…

HarmonyOs鸿蒙开发实战(21)=>组件间通信@ohos/liveeventbus

1.简介 LiveEventBus是一款消息总线&#xff0c;具有生命周期感知能力&#xff0c;支持Sticky&#xff0c;支持跨进程&#xff0c;支持跨APP发送消息。 2.下载安装 ohpm install ohos/liveeventbus 3.订阅&#xff0c;注册监听 4.发送事件 5. 完成 > 记得关注博主&#xff…

深度学习使用LSTM实现时间序列预测

大家好&#xff0c;LSTM是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构&#xff0c;它被设计用来解决传统RNN在处理长序列数据时的梯度消失和梯度爆炸问题&#xff0c;特别是在时间序列预测、自然语言处理和语音识别等领域中表现出色。LSTM的核心在于其独特的门控机…

用Tauri框架构建跨平台桌面应用:1、Tauri快速开始

Tauri 是一个构建适用于所有主流桌面和移动平台的轻快二进制文件的框架。开发者们可以集成任何用于创建用户界面的可以被编译成 HTML、JavaScript 和 CSS 的前端框架&#xff0c;同时可以在必要时使用 Rust、Swift 和 Kotlin 等语言编写后端逻辑。 Tauri 是什么&#xff1f; |…

Elasticsearch对于大数据量(上亿量级)的聚合如何实现?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch对于大数据量&#xff08;上亿量级&#xff09;的聚合如何实现&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch对于大数据量&#xff08;上亿量级&#xff09;的聚合如何实现&#xff1f; 1000道 …