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

news2024/12/24 11:41:43

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙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
  @Component
  struct Index {
    @State
    list: string[] = ["A", "B","C", "D", "E", "F"]

    @Builder
    getItemBuilder (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
  @Component
  struct Index {
    @State
    list: string[] = ["A", "B","C", "D", "E", "F"]

    build() {
      Column({ space: 10 }) {
        ForEach(this.list, (item: string) => {
          getItemBuilder(item)
        })
      }
      .padding(20)
    }
  }


@Builder
  function 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
  @Component
  struct Index {

    @State name:string='张三'
    @State age:number=18

    build() {
      Column() {
        Text(this.name)
          .fontSize(40)
          .width(200)
          .height(100)
          .backgroundColor(Color.Blue)

        getTextAge(this.age)

      }
      .width('100%')
        .height('100%')
    }
  }

@Builder
  function getTextAge(age:number){
    Text(age.toString())
      .fontSize(40)
      .width(200)
      .height(100)
      .backgroundColor(Color.Yellow)
  }
@Entry
  @Component
  struct Index {

    @State name:string='张三'
    @State age:number=18

    build() {
      Column() {
        Text(this.name)
          .fontSize(40)
          .width(200)
          .height(100)
          .backgroundColor(Color.Blue)
          .onClick(()=>{
            this.age=30
          })

        getTextAge(this.age)

      }
      .width('100%')
        .height('100%')
    }
  }

@Builder
  function getTextAge(age:number){
    Text(age.toString())
      .fontSize(40)
      .width(200)
      .height(100)
      .backgroundColor(Color.Yellow)
  }

2.3 按引用传递参数

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

@Entry
  @Component
  struct Index {

    @State name:string='张三'
    @State age:number=18

    build() {
      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%')
    }
  }

@Builder
  function 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
  @Component
  struct Index {

    build() {
      Column() {
        Test(){
            Button('点击按钮'	)
        }
      }
      .width('100%')
        .height('100%')
    }
  }

@Component
  struct Test{
    // 1、定义BuilderParam接受外部传入的ui,并设置默认值
    @BuilderParam contentBuilder:()=>void=this.defaultBuilder

    // 默认的Builder
    @Builder
    defaultBuilder(){
      Text('默认内容')
    }
    build() {
      Column(){
        // 2、使用@BuilderParam装饰的成员变量
        this.contentBuilder()
      }
    }
  }

3.3 参数传递初始化组件

多个@BuilderParam参数

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

@Entry
  @Component
  struct Index {
    @Builder
    test1() {
      Button('点击1')
    }

    @Builder
    test2() {
      Button('点击2')
    }

    build() {
      Column() {
        Test({
          contentBuilder:  () => {this.test1()},
          textBuilder: () => {this.test2()}
        })
      }
      .width('100%')
        .height('100%')
    }
  }

@Component
  struct Test {
    // 定义BuilderParam接受外部传入的ui,并设置默认值
    @BuilderParam contentBuilder: () => void = this.cDefaultBuilder
    @BuilderParam textBuilder: () => void = this.tDefaultBuilder

    @Builder
    cDefaultBuilder() {
      Text('默认内容1')
    }

    @Builder
    tDefaultBuilder() {
      Text('默认内容2')
    }

    build() {
      Column() {
        // 使用@BuilderParam装饰的成员变量
        this.contentBuilder()
        this.textBuilder()
      }
    }
  }

 4. 学习地址

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lambda表达式底层实现

一、lambda 代码 & 反编译 原始Java代码 假设我们有以下简单的Java程序,它使用Lambda表达式来遍历并打印一个字符串列表: import java.util.Arrays; import java.util.List;public class LambdaExample {public static void main(String[] args) {…

解决磁盘负载不均——ElasticSearch 分片分配和路由设置

ES 分片分配(Shard Allocation)时间点: 初始恢复(Initial Recovery)副本分配(Replica Allocation)重平衡(Rebalance)节点添加或移除 小结: 准备移除节点时&a…

Flask-2

文章目录 请求全局钩子[hook]异常抛出和捕获异常abort 主动抛出HTTP异常errorhandler 捕获错误 context请求上下文(request context)应用上下文(application context)current_appg变量 两者区别: 终端脚本命令flask1.0的终端命令使用自定义终端命令 flask2.0的终端命…

25中国烟草校园招聘面试问题总结 烟草面试全流程及面试攻略

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费!全文干货。 工作招聘无领导小组面试全攻略最常见面试题(第一部分)共有17章可用于国企私企合资企业工作招聘面试面试必备心得面试总结资源-CSDN文库https://d…

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19,同时配置文件web.config的路径中也存在问号“?”。 可能原因:没有安装运行时

树和二叉树知识点大全及相关题目练习【数据结构】

树和二叉树 要注意树和二叉树是两个完全不同的结构、概念,它们之间不存在包含之类的关系 树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n 0);或为非空树&a…

WPF 设计属性 设计页面时实时显示 页面涉及集合时不显示处理 设计页面时显示集合样式 显示ItemSource TabControl等集合样式

WPF 设计属性 设计页面时实时显示 页面涉及集合时不显示处理 设计页面时显示集合样式 显示ItemSource TabControl等集合样式 1、设计显示属性 1、设计时显示属性依赖以下属性 xmlns:d"http://schemas.microsoft.com/expression/blend/2008"2、在运行时不显示设计属性…

健康生活,从日常细节开始

健康生活,从日常细节开始 在快节奏的现代生活中,健康养生似乎成了一种奢侈的追求。但殊不知,真正的养生之道,往往就蕴含在我们日常的点点滴滴之中。今天,就让我们一起探讨几个简单却极易被忽视的健康生活小贴士&#…

828华为云征文|华为云 Flexus X 实例初体验

一直想有自己的一款的服务器,为了更好的进行家庭娱乐,甚至偶尔可以满足个人搭建开发环境的需求,直到接触到了华为云 Flexus X 云服务器。Flexus 云服务器 X 实例是面向中小企业和开发者打造的轻量级云服务器。提供快速应用部署和简易的管理能…

Electrodoc 5.2 专业电工工具集合,支持多种计算器和资料查询!

ElectroDroid Pro 是一款专业的电工工具集合应用,支持多种计算器和资料查询功能。包括功率计算器、分贝转换器、频率转换器、模数转换器等。还提供了端口引脚定义、资料查询等功能,支持 EIA 标准电阻系列。使用方法如下:1. 下载并安装 Electr…

达梦8-数据守护集群主备故障实验和脑裂处理

实验1:将内网断开,查看主备库状态,并测试数据同步情况 测试环境 ##主库信息 内网IP-[MAL_HOST 192.168.50.100] 外网IP-[MAL_INST_HOST 192.168.101.11] 主库实例名-[DM01] ##备库信息 内网IP-[MAL_HOST 192.168.50.110] 外网IP-[MAL_INS…

如何在C语言中实现Doris异步执行Insert语句

如何在C语言中实现Doris异步执行Insert语句 Doris(原名Apache Doris)是一个现代化的MPP(Massively Parallel Processing)分析型数据库,适用于超大规模数据的实时查询和分析。为了在C语言中实现向Doris数据库异步插入数据,我们需要解决以下几个关键问题: 设置Doris客户端…

认识动态规划算法和实践(java)

前言 动态规划算法里面最有意思的一个东西之一。动态规划初学肯定会有一定晦涩难懂。如果我们去网上搜索,动态规划的资料,它一开始都是将很多的理论,导致会认为很难,但是这个东西实际上是有套路的。 动态规划的英语是Dynamic Pr…

Java 死锁及避免讲解和案例示范

在大型分布式系统中,死锁是一种常见但难以排查的并发问题。特别是在 Java 领域,死锁问题可能导致系统崩溃或卡顿。本文将以电商交易系统为例,详细讲解如何识别和避免 Java 程序中的死锁问题,确保系统高效运行。 1. 什么是死锁&am…

如何初步部署自己的服务器,达到生信分析的及格线2(待更新)

参考我的上一篇博客https://blog.csdn.net/weixin_62528784/article/details/142621762?spm1001.2014.3001.5501, 现在我们已经有了一个能够跑一些基础任务的、基本没有配置的服务器了,接下来要做的任务就是: (1)进一…

centos一些常用命令

文章目录 查看磁盘信息使用 df 命令使用 du 命令 查看磁盘信息 使用 df 命令 df(disk free)命令用于显示文件系统的磁盘空间占用情况。 查看所有挂载点的磁盘使用情况: df -h选项说明: -h 参数表示以人类可读的格式&#xff0…

开发微信小程序 基础02

WX模板 1.对比 ①标签名称不同 ②属性节点不同 ③提供类似vue的模板语法 2.模板语法 2.1数据动态绑定 2.1.1在data种定义数据 在页面对应的.js文件中,把数据定义到data对象中即可 例---data : { info : init data , msList : [{msg : hello}, { ms…

开发微信小程序 基础03

WXSS(类似CSS) 定义: WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML的组件样式,类似于网页开发中的 CSS。 分类: 全局样式:定义在 app.wxss 中的样式为全局样式,作用于每一个页面 局部样式&…

解决 Android WebView 无法加载 H5 页面常见问题的实用指南

目录 1. WebView 简介 2. 常见问题 3. 网络权限设置 4. 启用 JavaScript 5. DOM Storage 的重要性 6. 处理 HTTPS 问题 7. 设置 WebViewClient 8. 调试工具 9. 其他调试技巧 10. 结论 相关推荐 1. WebView 简介 Android WebView 是一种视图组件,使得 And…

基于SSM+小程序的电影院订票选座管理系统(电影2)(源码+sql脚本+视频导入教程+文档)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM的电影院订票选座小程序管理系统实现了管理员和用户二个角色。管理员实现了用户管理、影院信息管理、电影类型管理、电影信息管理、系统管理、订单管理等。用户实现了影院信息、电…