鸿蒙Next创建自定义组件总结

news/2024/12/18 9:04:04/文章来源:https://www.cnblogs.com/freerain/p/18613834

一、引言

在鸿蒙Next开发中,自定义组件是构建高效、可维护UI的重要组成部分。它具有可组合、可重用以及数据驱动UI更新等特点,能帮助开发者更好地实现代码复用、业务逻辑与UI分离等目标。本文将详细总结创建自定义组件的相关知识,包括其基本结构、成员函数/变量、参数规定、build()函数以及通用样式等方面。

二、自定义组件基本结构

  1. 基于struct实现
    • 自定义组件由struct + 自定义组件名 + {...}构成,不能有继承关系,struct实例化可省略new。且自定义组件名不能和系统组件名相同。
  2. @Component装饰器
    • 仅能装饰struct关键字声明的数据结构,被装饰后具备组件化能力,需实现build方法描述UI,一个struct只能被一个@Component装饰。从API version 11开始,@Component可接受一个可选的bool类型参数freezeWhenInactive用于控制组件冻结。
  3. build()函数
    • 用于定义自定义组件的声明式UI描述,是自定义组件必须定义的函数。
  4. @Entry装饰器
    • 装饰的自定义组件将作为UI页面的入口,单个UI页面最多只能有一个@Entry装饰的自定义组件。从API version 10开始,@Entry可接受可选的LocalStorage参数或EntryOptions参数。
  5. @Reusable装饰器(API version 10开始支持在ArkTS卡片中使用)
    • 使自定义组件具备可复用能力。

三、成员函数/变量

  1. 成员函数
    • 为私有,不建议声明为静态函数。
  2. 成员变量
    • 为私有,不建议声明为静态变量。成员变量本地初始化要求因情况而异,具体参考状态管理。部分情况下可从父组件通过参数传递初始化。

四、自定义组件参数规定

  1. 初始化参数
    • build方法里创建自定义组件时,根据装饰器规则初始化参数。例如:
      @Component
      struct MyComponent {private countDownFrom: number = 0;private color: Color = Color.Blue;build() {}
      }
      @Entry
      @Component
      struct ParentComponent {private someColor: Color = Color.Pink;build() {Column() {// 创建MyComponent实例并初始化参数MyComponent({ countDownFrom: 10, color: this.someColor })}}
      }
      
  2. 传递函数作为参数
    • 父组件可将函数传递给子组件,子组件可调用该函数,如:
      @Entry
      @Component
      struct Parent {@State cnt: number = 0submit: () => void = () => {this.cnt++;}build() {Column() {Text(`${this.cnt}`)Son({ submitArrow: this.submit })}}
      }
      @Component
      struct Son {submitArrow?: () => voidbuild() {Row() {Button('add').width(80).onClick(() => {if (this.submitArrow) {this.submitArrow()}})}.justifyContent(FlexAlign.SpaceBetween).height(56)}
      }
      

五、build()函数规则

  1. 根节点要求
    • @Entry装饰的自定义组件,build()函数下根节点唯一且必须为容器组件(ForEach禁止作为根节点)。
    • @Component装饰的自定义组件,build()函数下根节点唯一且可为非容器组件(ForEach禁止作为根节点)。
  2. 其他限制
    • 不允许声明本地变量。
    • 不允许在UI描述里直接使用console.info(方法或函数里可用)。
    • 不允许创建本地作用域。
    • 不允许调用没有用@Builder装饰的方法,但系统组件参数可为TS方法返回值。
    • 不允许使用switch语法,需用if进行条件判断。
    • 不允许使用表达式。
    • 不允许直接改变状态变量(会造成循环渲染风险,不同版本更新方式有差异且可能影响性能)。

六、自定义组件通用样式

通过“.”链式调用的形式设置通用样式,但给自定义组件设置样式时,实际上是给组件套了一个不可见容器组件,样式设置在该容器组件上而非直接在组件自身。例如:

@Component
struct MyComponent2 {build() {Button(`Hello World`)}
}
@Entry
@Component
struct MyComponent {build() {Row() {MyComponent2().width(200).height(300).backgroundColor(Color.Red)}}
}

掌握鸿蒙Next中创建自定义组件的这些知识,开发者能够更加灵活、高效地构建应用UI,提升应用的质量和可维护性。

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

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

相关文章

【必看】内外网文件传输方法大全 看看哪个适合你!

一、内外网文件传输的核心需求 内外网文件传输的核心需求可以归纳为安全性、效率、合规性、兼容性、权限控制、自动化、部署灵活性和成本控制。企业应根据自身业务需求和安全策略,选择合适的解决方案来满足这些核心需求,实现高效、安全、合规的数据交换。二、内外网文件传输的…

在线教育系统搭建公司

在快速发展的信息技术背景下,全球的教育产业正经历前所未有的变革。尤其是知识付费与在线教育的兴起,不仅改变了教育的方式,也为教育内容创作者带来了新的商业机遇。这一转型的背后,是一系列新兴技术和商业模式的支持。在线教育平台作为连接老师与学生的桥梁,在促进优质教…

Linux安装Anaconda

1、下载Anaconda安装脚本 这里我们需要在官网上查找自己需要的版本,地址链接在下面: https://repo.anaconda.com/archive/ 下载之后,将文件移动到服务器上2、安装Anaconda执行命令:chmod 755 Anaconda3-2020.02-Linux-x86_64.sh 赋予脚本执行权限执行命令:./Anaconda3-2020…

东方通TongWeb7.0.4.9M4部署SuperMap iServer 11.2.1

一、软件版本操作系统: CentOS Linux release 7.5.1804 (Core) JDK:11.0.18 东方通:TongWeb7.0.4.9M4 SuperMap iServer:11.2.1JDK和TongWeb软件分享: 链接: https://pan.baidu.com/s/1HGDTPnPID0PEOMbg3FjTVQ?pwd=bh8v 提取码: bh8v 东方通软件许可请从其官网申请二、东方…

一款基于 .NET MVC 框架开发、功能全面的MES系统

前言 今天大姚给大家分享一款基于 .NET MVC 框架开发、功能全面的离散型零部件制造管理系统(MES):EasyMES。 项目介绍 EasyMES一款基于 .NET 6 MVC 框架开发、开源免费(MIT License)、功能全面的离散型零部件制造管理系统(MES)和仓储管理系统(WMS)。 系统功能MES功能:…

读图数据库实战笔记06开发应用程序

开发应用程序1. 开发应用程序 1.1. 在图中解决问题需要转换思维方式,从遍历图的角度思考问题 1.2. skeleton(骨架版本)1.2.1. 不含任何代码的应用程序骨架,只有为方法预留的桩(stub)​。1.2.2. 适合想自己编写代码的读者1.3. commented(注释版本)1.3.1. 项目所需的所有…

写一个鼠标滚动图片时放大或缩小图片

要实现鼠标滚动图片时放大或缩小图片的功能,你可以使用JavaScript(特别是其事件监听功能)与CSS(特别是其转换功能)结合。以下是一个简单的示例,说明如何实现这一功能:HTML:<!DOCTYPE html> <html lang="en"> <head><meta charset="…

TiNO-Edit:基于扩散的稳健图像编辑的时间步长和噪声优化

TiNO-Edit:基于扩散的稳健图像编辑的时间步长和噪声优化尽管有许多尝试利用预训练的文本到图像模型(T2I)(如稳定扩散(SD)),进行可控图像编辑,但产生良好的可预测结果仍然是一个挑战。以前的方法要么侧重于在特定数据集上,对预训练的T2I模型进行精细调优,以生成特定类…

并非所有体素都是相等的:具有自蒸馏的硬度感知语义场景完成

并非所有体素都是相等的:具有自蒸馏的硬度感知语义场景完成语义场景完成,也称为语义占用预测,可以为自动驾驶汽车提供密集的几何和语义信息,这引起了学术界和工业界越来越多的关注。不幸的是,现有的方法通常将此任务表述为体素分类问题,并在训练过程中在3D空间中平等对待…

数据库性能优化

title: 数据库性能优化 date: 2024/12/18 updated: 2024/12/18 author: cmdragon excerpt: 数据库性能优化是确保数据库高效、高速响应用户请求的关键过程。通过有效的设计、合理使用索引、优化查询和系统配置,数据库管理者可以显著提升系统的响应时间和处理能力。 categori…

低空经济“四张网”

近年来,随着低空经济的不断发展,低空基础设施建设成为了推动行业发展的关键。我国正着力构建低空智能融合基础设施体系,其中,“四张网”——低空经济“四张网”之间的关系:设施网、空联网、航路网和服务网,成为了这一体系的核心组成部分。自2021年“低空经济”首次写入相…

RHEL9上创建kickstart文件实现PXE自动安装RockyLinux8.10虚拟机

日期:2021.12.14 前言: 目前实验进度已经实现了环境内新虚拟机通过网络启动后: 1.通过DHCP服务器获取IP地址、子网掩码、网管、DNS等网络参数 2.通过DHCP服务器获取TFTP服务器IP地址、pxelinux.0文件路径 3.访问TFTP服务器获取启动菜单文件,在菜单文件选择安装操作系统后,…