构建第一个ArkTS应用之@BuilderParam装饰器:引用@Builder函数

news2024/12/23 11:42:10

当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。

说明

从API version 9开始,该装饰器支持在ArkTS卡片中使用。

装饰器使用说明

初始化@BuilderParam装饰的方法

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

  • 使用所属自定义组件的自定义构建函数或者全局的自定义构建函数,在本地初始化@BuilderParam
@Builder function overBuilder() {}

@Component
struct Child {
  @Builder doNothingBuilder() {};

  // 使用自定义组件的自定义构建函数初始化@BuilderParam
  @BuilderParam customBuilderParam: () => void = this.doNothingBuilder;
  // 使用全局自定义构建函数初始化@BuilderParam
  @BuilderParam customOverBuilderParam: () => void = overBuilder;
  build(){}
}

用父组件自定义构建函数初始化子组件@BuilderParam装饰的方法。

@Component
struct Child {
  // 使用父组件@Builder装饰的方法初始化子组件@BuilderParam
  @BuilderParam customBuilderParam: () => void;

  build() {
    Column() {
      this.customBuilderParam()
    }
  }
}

@Entry
@Component
struct Parent {
  @Builder componentBuilder() {
    Text(`Parent builder `)
  }

  build() {
    Column() {
      Child({ customBuilderParam: this.componentBuilder })
    }
  }
}
  • 需注意this指向正确。以下示例中,Parent组件在调用this.componentBuilder()时,this指向其所属组件,即“Parent”。@Builder componentBuilder()传给子组件@BuilderParam customBuilderParam,在Child组件中调用this.customBuilderParam()时,this指向在Child的label,即“Child”。

    说明

    开发者谨慎使用bind改变函数调用的上下文,可能会使this指向混乱。

@Component
struct Child {
  label: string = `Child`
  @BuilderParam customBuilderParam: () => void;

  build() {
    Column() {
      this.customBuilderParam()
    }
  }
}

@Entry
@Component
struct Parent {
  label: string = `Parent`

  @Builder componentBuilder() {
    Text(`${this.label}`)
  }

  build() {
    Column() {
      this.componentBuilder()
      Child({ customBuilderParam: this.componentBuilder })
    }
  }
}

使用场景

参数初始化组件

@BuilderParam装饰的方法可以是有参数和无参数的两种形式,需与指向的@Builder方法类型匹配。@BuilderParam装饰的方法类型需要和@Builder方法类型一致。

@Builder function overBuilder($$ : {label: string }) {
  Text($$.label)
    .width(400)
    .height(50)
    .backgroundColor(Color.Green)
}

@Component
struct Child {
  label: string = 'Child'
  // 无参数类型,指向的componentBuilder也是无参数类型
  @BuilderParam customBuilderParam: () => void;
  // 有参数类型,指向的GlobalBuilder1也是有参数类型的方法
  @BuilderParam customOverBuilderParam: ($$ : { label : string}) => void;

  build() {
    Column() {
      this.customBuilderParam()
      this.customOverBuilderParam({label: 'global Builder label' } )
    }
  }
}

@Entry
@Component
struct Parent {
  label: string = 'Parent'

  @Builder componentBuilder() {
    Text(`${this.label}`)
  }

  build() {
    Column() {
      this.componentBuilder()
      Child({ customBuilderParam: this.componentBuilder, customOverBuilderParam: overBuilder })
    }
  }
}

尾随闭包初始化组件

在自定义组件中使用@BuilderParam装饰的属性时也可通过尾随闭包进行初始化。在初始化自定义组件时,组件后紧跟一个大括号“{}”形成尾随闭包场景。

说明

此场景下自定义组件内有且仅有一个使用@BuilderParam装饰的属性。

开发者可以将尾随闭包内的内容看做@Builder装饰的函数传给@BuilderParam。示例如下:

// xxx.ets
@Component
struct CustomContainer {
  @Prop header: string;
  // 使用父组件的尾随闭包{}(@Builder装饰的方法)初始化子组件@BuilderParam
  @BuilderParam closer: () => void

  build() {
    Column() {
      Text(this.header)
        .fontSize(30)
      this.closer()
    }
  }
}

@Builder function specificParam(label1: string, label2: string) {
  Column() {
    Text(label1)
      .fontSize(30)
    Text(label2)
      .fontSize(30)
  }
}

@Entry
@Component
struct CustomContainerUser {
  @State text: string = 'header';

  build() {
    Column() {
      // 创建CustomContainer,在创建CustomContainer时,通过其后紧跟一个大括号“{}”形成尾随闭包
      // 作为传递给子组件CustomContainer @BuilderParam closer: () => void的参数
      CustomContainer({ header: this.text }) {
        Column() {
          specificParam('testA', 'testB')
        }.backgroundColor(Color.Yellow)
        .onClick(() => {
          this.text = 'changeHeader';
        })
      }
    }
  }
}

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

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

相关文章

2024年网络安全行业全景图 | 亚信安全实力占据62领域

近日,安全牛《中国网络安全行业全景图》(第十一版)正式发布。 本次发布的全景图,包含16个一级安全分类,108个二级细分领域,共收录454家国内安全厂商,细分领域共收录2413项。亚信安全凭借在云安全…

① 学习PID--先认识有什么电机和驱动

我们在学习和使用PID的时候,可能会有很多电机的选择。然而不同的电机使用的PID参数是不太一样的。所以我们需要认识电机和驱动器。 1 电机有什么类型 1.1 电机的简介 电机是一种可以在电能和机械能的之间相互转换的设备,其中发电机是将机械能转换为电能…

虚拟机下CentOS7开启SSH连接

虚拟机下CentOS7开启SSH连接 自己在VMware中装了CentOS 6.3,然后主机(或者说xshell)与里面的虚拟机连不通,刚学习,一头雾水,查了半天,也不知道怎么弄。 在虚拟机(Vmware Workstatio…

优思学院|2024年如何成为一名六西格玛黑带?

如果你总是觉得无论多么努力,职场上似乎难以有所突破,那么你应该知道,你并不是孤独的。 实际上,大量研究表明,高达90%的人对自己的工作感到不满,这意味着在你认识的每10人中,可能只有1人对其工…

小程序视频如何下载到电脑上

小程序视频如何下载到电脑上,很简单 1.利用Fiddler和Charles这些专业的抓包工具 2.利用录屏 3.利用专门抓取资源的工具(集成了抓取下载,而且对资源下载很友好) 工具我已经打包好了 下载高手链接:https://pan.baidu.com/s/1qJ81sNBzzzU0w…

烧结钕铁硼永磁体是如何生产的?

烧结钕铁硼永磁体是采用粉末冶金法生产的,从备料到成品发货一般要经过十几个工艺环节,在不同阶段还包括若干次检测分析。 整个生产过程是一个系统工程,环环相扣。一般我们将生产磁体毛坯的过程称为前道生产环节,将毛坯加工成最终…

Thingsboard PE 白标的使用

只有专业版支持白标功能。 使用 ThingsBoard Cloud 或安装您自己的平台实例。 一、介绍 ThingsBoard Web 界面提供了简便的操作,让您能够轻松配置您的公司或产品标识和配色方案,无需进行编码工作或重新启动服务。 系统管理员、租户和客户管理员可以根据需要自定义配色方案、…

计算机网络2——物理层2

文章目录 一、信道复用技术1、介绍2、频分复用、时分复用和统计时分复用3、波分复用4、码分复用 二、数字传输系统三、宽带接入技术1、介绍2、ADSL 技术3、光纤同轴混合网(HFC网)4、FTTx技术 一、信道复用技术 1、介绍 复用(multiplexing)是通信技术中的基本概念。计算机网络…

抖音小店开店必做的几个基础搭建,新手注意,不做店铺没流量

大家好,我是电商笨笨熊 新手入手做抖音小店一定不要着急选品,先去做店铺基础搭建,吸引更多流量进入店铺,提升店铺曝光度。 店铺搭建都没做好,流量来了你也接不住,所以今天我们就来聊聊哪些必做的搭建内容…

常见 Java 代码缺陷及规避方式

阿里妹导读 在日常开发过程中,我们会碰到各种各样的代码缺陷或者 Bug,比如 NPE、 线程安全问题、异常处理等。这篇文章总结了一些常见的问题及应对方案,希望能帮助到大家。 问题列表 空指针异常 NPE 或许是编程语言中最常见的问题&#xff0…

rv1103/buildroot系统中添加包如v4l2

v4l2: rv1103给出的包中已经有v4l,只需要在menuconfig中打开编译选项,步骤如下: 在luckfox的github网站中下载的源代码在~/linux/luckfox/luckfox-pico-main中目录结构如下: 打开编译选项 cd ./sysdrv/source/buildroot/buildroot-2023.02.…

浅谈普通人成为程序员的几个原因

成为程序员的原因可以因人而异,以下是一些普遍的原因: 兴趣和热情:很多人对计算机科学和编程非常感兴趣。他们喜欢探索如何使用代码来解决问题,并且享受编程过程中的逻辑思考和创造性。 高薪和就业机会:现代社会对技术…

GEE错误——Landsat影像加载后显示白色或黑色如何解决?

错误展示 简介 在GEE中,如果加载的Landsat影像显示为白色或黑色,可能的原因: 1. 数据范围问题:Landsat影像通常以16位有符号整数的格式存储,但在加载到GEE时,默认使用了0到1的归一化数据范围。这可能导致影像显示不正确。解决方法是通过将图像转换为正确的数据范围来修…

ubuntu下的串口调试工具cutecom

系统:ubuntu20.04 (1)接线 使用 rs485<-----> rs232 转接口( 设备直接出来的是rs485),电脑主机接入一根 rs232<-----> USB口 连接线,ubuntu系统下打开 termin…

2024年全球可穿戴腕带设备市场将增长 7%,蓝牙BLE助力其发展

根据市场调查机构 Canalys 今日发布的最新报告,2023 年,全球可穿戴腕带设备市场实现 1.4% 的温和增长,出货量达 1.85 亿台。该机构预测 2024 年,全球可穿戴腕带市场将增长 7%。 Canalys 对 2024 年可穿戴腕带市场持谨慎乐观的态…

身份证二要素API接口的作用

身份证二要素API接口又叫身份证实名认证、身份证二要素验证接口、姓名和身份证号核验接口,主要就是输入姓名和身份证号,通过官方权威核查,实时校验此二要素是否一致,同时返回生日、性别、籍贯等信息。那么这个接口有什么作用呢&am…

【解决方案】QtScrcpy无法投屏+剪映字幕卡退

电脑环境:win10专业版 1901 手机型号:pixel3 Android12 1、QtScrcpy无法投屏 启动服务没有反应,回退1.9版本解决 https://github.com/barry-ran/QtScrcpy/releases/download/v1.9.0/QtScrcpy-win-x64-v1.9.0.zip 2、剪映字幕设置颜色功能卡死…

HW面试经验分享 | 某服蓝队初级

前言 依稀记得是22年 7、8月份参加的HW,当时是比较炎热的时候,但又夹杂一丝秋意。也是头一次去离家乡比较远的地方,多少有点忐忑……(怕被噶腰子、水土不服、吃穿用住没着落等等),但最终也是平安无事且顺利…

OSCP靶场--Wombo

OSCP靶场–Wombo 考点(redis 主从复制RCE ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.69 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-13 07:33 EDT Nmap scan report for 192.168.153.69 Host is u…

酷得智能 无人机方案开发

东莞市酷得智能科技有限公司,是一家专业的技术服务公司,致力于为各类智能硬件提供高效、稳定、安全的底层驱动解决方案。拥有一支经验丰富、技术精湛的团队,能够为客户提供全方位的底层驱动开发服务。 无人机功能介绍: 1、自动跟…