【HarmonyOS 4.0】@BuilderParam 装饰器

news2024/11/17 1:47:18

1. @BuilderParam 装饰器

  1. @BuilderParam 装饰器用于装饰自定义组件(struct)中的属性,其装饰的属性可作为一个UI结构的占位符,待创建该组件时,可通过参数为其传入具体的内容。
  2. 参数必须满足俩个条件:
    2.1 参数类型必须是个函数;
    2.2 参数必须是个UI结构;
  3. 因此这个参数就是 @Builder 方法
  4. 在这里插入图片描述

1.1 代码案例如下:

// 第一个Builder
@Builder
export function imageBuilder() {
  Column({ space: 10 }) {
    Image($r('app.media.app_icon'))
      .width('70%')
      .height('70%')
      .objectFit(ImageFit.Contain)
    Text('@BuilderParam装饰器:引用@Builder函数')
      .fontSize(16)
      .fontWeight(FontWeight.Bold)
  }
}

// 第二个Builder
@Builder
export function textBuilder() {
  Column({ space: 10 }) {
    Text('@BuilderParam装饰器:引用@Builder函数')
      .fontSize(16)
      .fontWeight(FontWeight.Bold)
    Text('当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。')
      .fontSize(14)
      .textOverflow({ overflow: TextOverflow.Ellipsis })
      .maxLines(6)
  }
}

// 自定义子组件
import { textBuilder } from './TextBuilder'

@Extend(Column)
function columnStyle() {
  .width('90%')
  .height(180)
  .borderRadius(10)
  .shadow({ radius: 20 })
  .padding(10)
}

@Component
export struct Card {
  @BuilderParam content: () => void = textBuilder

  build() {
    Column({ space: 20 }) {
      Column() {
        this.content()
      }
      .columnStyle()
    }
  }
}

// 父组件
import { imageBuilder } from "./ImageBuilder"
import { textBuilder } from './TextBuilder'
import { Card } from "./Card"

@Entry
@Component
struct Index {
  private scroller: Scroller = new Scroller()

  build() {
    Scroll(this.scroller) {
      Column({ space: 20 }) {
        Card({ content: imageBuilder })
        Card({ content: textBuilder })
        Divider()
        Card({ content: textBuilder })
        Card({ content: imageBuilder })
      }
      .width('100%')
    }
  }
}

1.2 代码案例如下:

// 第一个Builder
@Builder
export function imageBuilder(title: string) {
  Column({ space: 10 }) {
    Image($r('app.media.app_icon'))
      .width('70%')
      .height('70%')
      .objectFit(ImageFit.Contain)
    Text(title)
      .fontSize(16)
      .fontWeight(FontWeight.Bold)
  }
}

// 第二个Builder
class TextObjBuilder {
  title: string = ''
  container: string = ''
}

@Builder
export function textBuilder($$: TextObjBuilder) {
  Column({ space: 10 }) {
    Text($$.title)
      .fontSize(16)
      .fontWeight(FontWeight.Bold)
    Text($$.container)
      .fontSize(14)
      .textOverflow({ overflow: TextOverflow.Ellipsis })
      .maxLines(6)
  }
}

// 自定义组件
import { imageBuilder } from "./ImageBuilder"
import { textBuilder } from './TextBuilder'

@Extend(Column)
function columnStyle() {
  .width('90%')
  .height(180)
  .borderRadius(10)
  .shadow({ radius: 20 })
  .padding(10)
}

class TextObjBuilder {
  title: string = ''
  container: string = ''
}

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

  build() {
    Column({ space: 20 }) {
      Column() {
        this.content1(this.title)
      }
      .columnStyle()

      Column() {
        this.content2({ title: this.title, container: this.container })
      }
      .columnStyle()
    }
    .height('100%')
    .width('100%')
  }
}

1.3 如果一个组件只定义一个 @BuilderParam 属性,那么创建该组件时,也可直接通过“子组件”的方式传入具体的UI结构。

// 子组件
@Extend(Column)
function columnStyle() {
  .width('90%')
  .height(180)
  .borderRadius(10)
  .shadow({ radius: 20 })
  .padding(10)
}

@Component
export struct Card {
  @BuilderParam content: () => void

  build() {
    Column({ space: 20 }) {
      Column() {
        this.content()
      }
      .columnStyle()
    }
  }
}

// 父组件
import { Card } from "./Card"

@Entry
@Component
struct Index {
  build() {
    Column({ space: 20 }) {
      Card() {
        Column({ space: 10 }) {
          Image($r('app.media.app_icon'))
            .width('70%')
            .height('70%')
            .objectFit(ImageFit.Contain)
          Text('@BuilderParam装饰器:引用@Builder函数')
            .fontSize(16)
            .fontWeight(FontWeight.Bold)
        }
      }
    }
    .height('100%')
    .width('100%')
  }
}

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

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

相关文章

前端使用canvas绘制简单工作流-react

效果图如下: 目前只做了绘制部分,绘制方式也比较简单,点击工具栏中需要绘制的图形,在画布上左键点击将会绘制一个图形出来,工具栏选中第一个,再点击其他图像,长按鼠标左键可以移动,删…

丢掉Beyond Compare吧!新款文件差异对比工具WinMerge更具性价比!

今天想和大家分享一款非常实用的免费开源文件比较工具:WinMerge。 作为一名长期从事互联网行业的人,我经常需要处理大量的文档和代码文件,文件对比工具在我的日常工作中可谓是必不可少的“左膀右臂”。 也相信很多朋友在处理多个文档内容或者…

96页PPT集团战略解码会工具与操作流程

德勤集团在战略解码过程中通常会用到以下一些具体工具: 一、平衡计分卡(Balanced Scorecard) 财务维度: 明确关键财务指标,如营业收入、利润、投资回报率等。你可以通过分析历史财务数据和行业趋势,确定…

HUSB381A:带线PD适配器的绝佳选择

HUSB381A是慧能泰半导体全新推出的一款采用SOP8封装,集成MOS的USB PD Source芯片,带CC1和CC2引脚,支持不可分离线缆(Captive Cable)PD适配器和纯PD快充充电器应用。HUSB381A支持最大功率20V5A 100W应用,支持…

单片机驱动彩屏最简方案:单片机_RA8889最小开发板驱动控制TFT彩屏介绍(一)方案架构

本文介绍使用单片机RA8889来驱动和控制彩屏的最小方案。文章从RA8889的架构功能、硬件电路设计及软件设计三个方面来说明。 小编已发布多篇文章介绍了单片机RA8889来驱动控制彩屏,但是仍有不少单片机玩家可能对驱动彩屏还不算熟悉,在此加推一个短篇介绍…

审计发现 FBI 的数据存储管理存在重大漏洞

据The Hacker News消息,美国司法部监察长办公室 (OIG) 的一项审计发现, FBI 在库存管理和处置涉及机密数据的电子存储媒体方面存在“重大漏洞”。 OIG 的审计显示,FBI 对包含敏感但未分类 (SBU&#xff09…

橙子投屏,轻松连接大屏幕

对于某腾、某爱、某酷投屏大家在熟悉不过了吧,一款非常好用的投屏软件,但是使用起来还是限制颇多,比如有犷郜,还必须同步使用手机App才能实现投屏功能,关键还得开会员,劝退不少小伙伴。但是现在手机往往占据…

API代理指南:跨境业务的数据桥梁

在当今全球化的经济环境中,跨境业务已成为企业拓展国际市场、实现业务增长的重要途径。但面临着法律法规差异、网络复杂性和数据安全等诸多挑战。为了有效应对这些挑战,API(应用程序编程接口)代理成为了跨境业务中不可或缺的一部分…

接口自动化框架设计必备利器之参数传递

在我们设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML)中,实现测试脚本与测试数据解耦,方便后期维护。 当涉及到业务场景接口用例时,由于接口与接口存在关联关系&#xff…

5步掌握Python Django开发办公管理系统核心技巧

🎓 作者:计算机毕设小月哥 | 软件开发专家 🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 🛠️ 专业服务 🛠️ 需求定制化开发源码提…

Unity实现棋盘方格

本文参考:p1_哔哩哔哩_bilibili 一、精要提炼 1、Button自带的白色底图是圆角的,Image组件自带的白色底图是方角的。 2、2D中Instantiate指定的位置为屏幕坐标系的位置,左下角为(0,0) 3、求某个组件的位置:xx.transform.posi…

(javaweb)事务管理+AOP

目录 1.spring事务管理 2.rollbackFor(异常回滚属性) 3.propagation(事物传播行为) AOP基础 1.AOP概述 AOP快速入门 AOP核心概念 APO进阶 1.通知类型 2.通知顺序 3.切入点表达式 4.连接点 5.AOP案例 1.spring事务管理…

谷歌浏览器翻译不了网页怎么解决

谷歌浏览器的网页翻译功能因其便捷性和高效性,成为了许多用户跨语言浏览的重要工具。然而,有时候用户可能会遇到无法使用谷歌浏览器翻译网页的情况。接下来将为大家分析为何谷歌浏览器翻译不了网页以及解决方法,希望对你有所帮助。&#xff0…

从dxf文件中提取spline曲线

1.使用的工具 libDxf-负责解析dxf文件,提取图形元素 open_Nurbs-负责spline曲线的计算 2.效果如下 左图是CAD绘制的spline曲线,右图是程序中显示的曲线,红色点是在CAD中作图时鼠标点击的拟合点。 3.main.cpp代码 #include"zmDXF.h&…

【香橙派系列教程】(十五) VSCode SSH远程连接开发板,以香橙派为例

【十五】VSCode远程连接香橙派 文章目录 【十五】VSCode远程连接香橙派第一步:安装vscode第二步:安装Remote Development第三步:字体设置第四步:配置远程连接第五步:配置远程目录 第一步:安装vscode 之前发…

SuperMap WebGPA外部大数据集群部署实践

SuperMap WebGPA外部大数据集群部署实践 特别说明:部署前准备: 1.安装包说明2. 许可配置3. 机器情况部署过程说明: 1.设置ip主机名映射(主机ip需要固定ip)2. 查看防火强状态,关闭防火墙3. 新建用户&#…

dll修复工具下载:dll文件丢失问题?一键解决系统难题!

dll修复工具是Windows电脑必不可少的一款系统修复软件 电脑的使用频率很高,不可避免的会遇到丢失dll文件的情况。因此,dll修复工具也是能够解决的dll文件缺失的方法之一。那么如何使用dll修复工具解决缺失dll文件问题呢?本文将为您详细介绍电…

基于单片机的一氧化碳报警系统的设计与实现

摘 要: 一氧化碳对人体有害,尤其超标时会影响人们的健康 。 因此文章设计了一款基于单片机的一氧化氮报警器设计。 论文通过传感器检测一氧化碳浓度,经过 AD 转换,再把检测信号传递给单片机,经过分析处理&#xff0c…

graphRAG原理解析——基于微软graphRAG+Neo4j llm-graph-builder

知识图谱生成 llm-graph-builder(以下简称 LGB)也使用了最新的 graph RAG 的思路,使用知识图谱来加持RAG,提供更加准确和丰富的知识问答。知识图谱的生成上,利用大模型的泛化能力来自动生成和构建知识图谱&#xff0…

企事业单位数据资料防外泄如何实现?这5个小技巧等你来掌握!

企事业单位的数据资料防外泄是一项重要的任务,它关乎企业的核心竞争力和信息安全。 以下是五个实用的小技巧,可以帮助企事业单位有效地防止数据外泄: 1. 数据加密 技巧说明:通过对敏感数据进行加密处理,即使数据被非…