鸿蒙NEXT开发-自定义构建函数(基于最新api12稳定版)

news/2024/12/23 4:34:48/

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下

如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识

专栏地址: https://blog.csdn.net/qq_56760790/category_12794123.html

目录

1. 构建函数-@Builder

1.1 基本介绍

1.2 用法

1.2.1 局部定义代码示例

1.2.2 全局定义代码示例

2. 构建函数-传参传递

2.1 基本介绍

2.2 按值传递参数

2.3 按引用传递参数

3. 构建函数-@BuilderParam

3.1 基本介绍

3.2 尾随闭包初始化组件

3.3 参数传递初始化组件

 4. 学习地址


1. 构建函数-@Builder

1.1 基本介绍

如果你不想在直接用组件,ArkUI还提供了一种更轻量的UI元素复用机制 @Builder,可以将重复使用的UI元素抽象成一个方法,在 build 方法里调用。称之为自定义构建函数

1.2 用法

局部定义:使用@Builder修饰符修饰函数,在组件中使用

@Builder MyBuilderFunction() {}

使用方法:this.MyBuilderFunction()

全局定义:使用@Builder修饰符修饰函数,记得要加上function

@Builder function MyGlobalBuilderFunction() { ... }

使用方法:MyGlobalBuilderFunction()

假设你有N个这样的单个元素,但是重复的去写会浪费大量的代码,丧失代码的可读性,此时我们就可以使用builder构建函数,如果不涉及组件状态变化,建议使用全局的自定义构建方法。

1.2.1 局部定义代码示例

@Entry@Componentstruct Index {@Statelist: string[] = ["A", "B","C", "D", "E", "F"]@BuildergetItemBuilder (itemName: string) {Row() {Text(`${itemName}. 选项`)}.height(60).backgroundColor("#ffe0dede").borderRadius(8).width("100%").padding({left: 20,right: 20})}build() {Column({ space: 10 }) {ForEach(this.list, (item: string) => {this.getItemBuilder(item)})}.padding(20)}}

1.2.2 全局定义代码示例

@Entry@Componentstruct Index {@Statelist: string[] = ["A", "B","C", "D", "E", "F"]build() {Column({ space: 10 }) {ForEach(this.list, (item: string) => {getItemBuilder(item)})}.padding(20)}}@Builderfunction getItemBuilder (itemName: string) {Row() {Text(`${itemName}. 选项`)}.height(60).backgroundColor("#ffe0dede").borderRadius(8).width("100%").padding({left: 20,right: 20})}

2. 构建函数-传参传递

2.1 基本介绍

自定义构建函数的参数传递有按值传递和按引用传递两种,均需遵守以下规则:

  • 参数的类型必须与参数声明的类型一致,不允许undefined、null和返回undefined、null的表达式。
  • 在自定义构建函数内部,不允许改变参数值。如果需要改变参数值,且同步回调用点,建议使用@Link。
  • @Builder内UI语法遵循UI语法规则。

2.2 按值传递参数

调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。所以当使用状态变量的时候,推荐使用按引用传递。

@Entry@Componentstruct Index {@State name:string='张三'@State age:number=18build() {Column() {Text(this.name).fontSize(40).width(200).height(100).backgroundColor(Color.Blue)getTextAge(this.age)}.width('100%').height('100%')}}@Builderfunction getTextAge(age:number){Text(age.toString()).fontSize(40).width(200).height(100).backgroundColor(Color.Yellow)}
@Entry@Componentstruct Index {@State name:string='张三'@State age:number=18build() {Column() {Text(this.name).fontSize(40).width(200).height(100).backgroundColor(Color.Blue).onClick(()=>{this.age=30})getTextAge(this.age)}.width('100%').height('100%')}}@Builderfunction getTextAge(age:number){Text(age.toString()).fontSize(40).width(200).height(100).backgroundColor(Color.Yellow)}

2.3 按引用传递参数

按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。

@Entry@Componentstruct Index {@State name:string='张三'@State age:number=18build() {Column() {Text(this.name).fontSize(40).width(200).height(100).backgroundColor(Color.Blue).onClick(()=>{this.age=30})getTextAge({age:this.age})}.width('100%').height('100%')}}@Builderfunction getTextAge(params:Test){Text(params.age.toString()).fontSize(40).width(200).height(100).backgroundColor(Color.Yellow)}class Test{age:number=0
}

3. 构建函数-@BuilderParam

3.1 基本介绍

@BuilderParam:是一个装饰器,用于声明任意UI描述的一个元素,类似于vue里的 slot 占位符。利用@BuilderParam构建函数,可以让自定义组件允许外部传递UI

@BuilderParam装饰的方法只能被自定义构建函数(@Builder装饰的方法)初始化。

3.2 尾随闭包初始化组件

@Entry@Componentstruct Index {build() {Column() {Test(){Button('点击按钮'	)}}.width('100%').height('100%')}}@Componentstruct Test{// 1、定义BuilderParam接受外部传入的ui,并设置默认值@BuilderParam contentBuilder:()=>void=this.defaultBuilder// 默认的Builder@BuilderdefaultBuilder(){Text('默认内容')}build() {Column(){// 2、使用@BuilderParam装饰的成员变量this.contentBuilder()}}}

3.3 参数传递初始化组件

多个@BuilderParam参数

子组件有多个BuilderParam,必须通过参数的方式来传入

@Entry@Componentstruct Index {@Buildertest1() {Button('点击1')}@Buildertest2() {Button('点击2')}build() {Column() {Test({contentBuilder:  () => {this.test1()},textBuilder: () => {this.test2()}})}.width('100%').height('100%')}}@Componentstruct Test {// 定义BuilderParam接受外部传入的ui,并设置默认值@BuilderParam contentBuilder: () => void = this.cDefaultBuilder@BuilderParam textBuilder: () => void = this.tDefaultBuilder@BuildercDefaultBuilder() {Text('默认内容1')}@BuildertDefaultBuilder() {Text('默认内容2')}build() {Column() {// 使用@BuilderParam装饰的成员变量this.contentBuilder()this.textBuilder()}}}

 4. 学习地址

全网首发鸿蒙NEXT星河版零基础入门到实战,2024年最新版,企业级开发!视频陆续更新中!_哔哩哔哩_bilibili


http://www.ppmy.cn/news/1533166.html

相关文章

谷歌发布Imagen 3,超过SD3、DALL・E-3,谷歌发布新RL方法,性能提升巨大,o1模型已证明

谷歌发布Imagen 3,超过SD3、DALL・E-3,谷歌发布新RL方法,性能提升巨大,o1模型已证明。 谷歌DeepMind发布了全新文生图模型Imagen 3,在文本语义还原、色彩搭配、文本嵌入、图像细节、光影效果等方面相比第二代大幅度提升…

软件功能测试需进行哪些测试?第三方软件测评机构有哪些测试方法?

在信息化社会迅速发展的今天,软件功能测试在软件开发生命周期中占据着不可或缺的地位。软件功能测试是评估软件系统是否符合预期功能和用户需求的过程。其重要性体现在提升软件质量、确保用户满意度以及降低维护成本等方面。 软件功能测试是对软件应用程序进行的一…

交通场景多目标检测系统源码分享

交通场景多目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化(Pooling)是深度学习中常用的一种操作,用于降低卷积神经网络(CNN)或循环神经网…

Java | Leetcode Java题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; class Solution {public int numberOfBoomerangs(int[][] points) {int ans 0;for (int[] p : points) {Map<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int[] q : points) {int dis (p[0] - q[0]) * (p[…

IoT网关的主要功能有哪些?天拓四方

在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;技术凭借其独特的优势&#xff0c;逐渐在各个领域展现出强大的生命力。而IoT网关&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;其在物联网体系中的作用愈发凸显。 一、数据聚合与预处理…

动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络

3.1 线性回归 线性回归是对n维输入的加权&#xff0c;外加偏差 线性回归可以看作是单层神经网络 回归问题中最常用的损失函数是平方误差函数。 平方误差可以定义为以下公式&#xff1a; 常数1/2不会带来本质的差别&#xff0c;但这样在形式上稍微简单一些 &#xff08;因为当…

学习记录:js算法(五十一):统计二叉树中好节点的数目

文章目录 统计二叉树中好节点的数目网上思路 总结 统计二叉树中好节点的数目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 图一&#xff1…