ArkTs基础语法-声明式UI-自定义组件

embedded/2024/10/21 9:17:54/

这里写目录标题

  • 自定义组件
    • 创建自定义组件
      • 自定义组件的基本用法
      • 自定义组件的基本结构
      • 成员函数/变量
      • 自定义组件的参数规定
      • build()函数

自定义组件

创建自定义组件

自定义组件的基本用法

@Component
export struct MyComponent {@State message: string = '我是自定义组件';build() {Row() {Text(this.message).onClick(() => {this.message = '点击刷新UI';})}}
}

自定义组件的基本结构

  • struct:自定义组件基于struct实现,不能有继承关系,对于struct的实例化,可以省略new关键字。
  • @Component:@Component装饰器仅能装饰struct关键字声明的数据结构,struct被@Component装饰后具备组件化的能力,一个struct只能被一个@Component装饰。
  • build()函数:用于定义自定义组件的声明式UI描述,自定义组件必须定义build()函数。
  • @Entry:@Entry装饰的自定义组件可以作为UI页面的入口,在单个页面UI中,最多可以使用一个@Entry装饰一个自定义组件。
  • @State:状态变量 使用@State装饰器修饰,该变量的变化,会触发组件UI重绘。

成员函数/变量

自定义组件除了必须要实现build()函数外,还可以实现其他成员函数和变量。

自定义组件的成员函数和变量为私有的,且不建议声明为静态函数/变量。

自定义组件的参数规定

在组件的build方法中,我们可以创建自定义组件,在创建自定义组件时,可以将父组件的成员变量、函数等传入,供子组件调用。

uild_36">build()函数

所有声明在build()函数中的语句,统称为UI描述,需要遵循以下规则:

  • @Entry装饰的自定义组件,其build函数下必须要有一个根节点,根节点是唯一且必要的,禁止使用ForEach作为根节点。

  • build()函数中禁止声明本地变量。

  • build()函数中禁止直接使用console.info,但是允许在方法或者函数中使用。

  • build()函数中不允许创建本地作用域,即build()函数中不能直接套{}

  • build()函数中,不允许直接调用没有@Builder装饰的方法,允许系统组件的参数是TS方法的返回值。

    @Component
    struct ParentComponent {doSomeCalculations() {}calcTextValue(): string {return 'Hello World';}@Builder doSomeRender() {Text(`Hello World`)}build() {Column() {// 反例:不能调用没有用@Builder装饰的方法this.doSomeCalculations();// 正例:可以调用this.doSomeRender();// 正例:参数可以为调用TS方法的返回值Text(this.calcTextValue())}}
    }
    
  • build()函数中不允许使用switch语法,可以使用if语法。

  • build()函数中不允许使用?:表达式

  • build()函数中不允许直接改变状态变量的值

    在ArkUI中,状态驱动UI更新,所以不能在build()函数或者@Builder方法中直接改变状态变量,这样可能会造成循环渲染的风险。
    在API8及以前,ArkUI是全量更新的,直接改变状态变量,可能会陷入无限循环重新渲染中。
    在API9及以后得版本中,遵循最小化更新原则,当某个状态变量发生改变时,只有使用到该状态变量的组件会更新,其他组件或该组件内部的组件不会更新。


http://www.ppmy.cn/embedded/97517.html

相关文章

学习文件IO,让你从操作系统内核的角度去理解输入和输出(理论篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

qt-16可扩展对话框--隐藏和展现

可扩展对话框 知识点extension.hextension.cppmain.cpp运行图初始化隐藏展现--点击--详细按钮 知识点 MainLayout->setSizeConstraint(QLayout::SetFixedSize);//固定窗口大小 extension.h #ifndef EXTENSION_H #define EXTENSION_H#include <QDialog>class Extens…

java jvm默认用的垃圾回收器

Java JVM&#xff08;Java虚拟机&#xff09;的默认垃圾回收器取决于所使用的Java版本。以下是不同Java版本下JVM默认垃圾回收器的概述&#xff1a; JDK 8及之前版本 默认垃圾回收器&#xff1a;Parallel Scavenge&#xff08;新生代&#xff09; Serial Old&#xff08;老年…

超详细!!!electron-vite-vue开发桌面应用之引入UI组件库element-plus(四)

云风网 云风笔记 云风知识库 一、安装element-plus以及图标库依赖 npm install element-plus --save npm install element-plus/icons-vue npm i -D unplugin-icons二、vite按需引入插件 npm install -D unplugin-vue-components unplugin-auto-importunplugin-vue-componen…

仿RabbitMq实现简易消息队列正式篇(路由匹配篇)

TOC 目录 路由匹配模块 代码展示 路由匹配模块 决定了一条消息是否能够发布到指定的队列 在每个队列根交换机的绑定信息中&#xff0c;都有一个binding_key&#xff08;在虚拟机篇有说到&#xff09;这是队列发布的匹配规则 在每条要发布的消息中&#xff0c;都有一个rout…

2024.8完善版 NineAi-ChatGPT系统源码

Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代…

老师简单易用的分班查询神器

随着新学期的到来&#xff0c;学校和老师们面临着一项重要任务&#xff1a;确保每位家长都能及时准确地获取孩子的分班信息。传统的分班通知方式&#xff0c;如纸质通知、校园公告板或电话短信通知&#xff0c;不仅效率低下&#xff0c;而且容易出错。为了解决这一问题&#xf…

如何避免Mysql RR 隔离级别下的 INSERT 死锁

背景 我们公司架构师&#xff0c;在使用 Mysql 做分布式锁的时候&#xff0c;因 insert 唯一键冲突&#xff0c;造成死锁。引起我对这部分知识点的兴趣和研究。 死锁日志的详细信息如下&#xff1a; LATEST DETECTED DEADLOCK ------------------------ 2024-08-19 16:32:45 0…