鸿蒙HarmonyOS开发:@Builder装饰器,自定义构建函数

文章目录

      • 一、自定义构建函数
        • 1、自定义组件内自定义构建函数
        • 2、全局自定义构建函数
        • 3、参数传递规则
      • 二、示例演示
        • 1、Image组件
        • 2、layoutWeight属性
        • 3、定义模型类
        • 4、代码
        • 5、效果

一、自定义构建函数

ArkUI还提供了一种更轻量的UI元素复用机制@Builder,@Builder所装饰的函数遵循build()函数语法规则,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。

为了简化语言,我们将@Builder装饰的函数也称为“自定义构建函数”。

1、自定义组件内自定义构建函数

定义的语法:

@Builder MyBuilderFunction(){}

使用方法:

this.MyBuilderFunction()
  • 允许在自定义组件内定义一个或多个@Builder方法,该方法被认为是该组件的私有、特殊类型的成员函数。
  • 自定义构建函数可以在所属组件的build方法和其他自定义构建函数中调用,但不允许在组件外调用。
  • 在自定义函数体中,this指代当前所属组件,组件的状态变量可以在自定义构建函数内访问。建议通过this访问自定义组件的状态变量而不是参数传递。
2、全局自定义构建函数

定义的语法:

@Builder function MyGlobalBuilderFunction(){}

使用方法:

MyGlobalBuilderFunction()
  • 全局的自定义构建函数可以被整个应用获取,不允许使用this和bind方法。
  • 如果不涉及组件状态变化,建议使用全局的自定义构建方法。
3、参数传递规则

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

  • 参数的类型必须与参数声明的类型一致,不允许undefined、null和返回undefined、null的表达式。
  • 在自定义构建函数内部,不允许改变参数值。如果需要改变参数值,且同步回调用点,建议使用@Link。
  • @Builder内UI语法遵循UI语法规则。
  • 只有传入一个参数,且参数需要直接传入对象字面量才会按引用传递该参数,其余传递方式均为按值传递。

按值传递参数

@Builder function overBuilder(paramA1: string) {Row() {Text(`UseStateVarByValue: ${paramA1} `)}
}
@Entry
@Component
struct Parent {@State label: string = 'Hello';build() {Column() {overBuilder(this.label)}}
}

二、示例演示

List组件实现图文文章列表布局以及自定义模型类的使用

1、Image组件

Image为图片组件,常用于在应用中显示图片。Image支持加载string、PixelMap和Resource类型的数据源,支持png、jpg、bmp、svg和gif类型的图片格式。

Image(src: string | PixelMap | Resource)

Image组件加载图片失败或图片尺寸为0时,图片组件大小自动为0,不跟随父组件的布局约束。

属性:

名称参数类型描述
objectFitImageFit设置图片的填充效果。
默认值:ImageFit.Cover
altstring、Resource加载时显示的占位图,支持本地图片(png、jpg、bmp、svg和gif类型),不支持网络图片。
默认值:null

ImageFit:

名称描述
Contain保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内。
Cover保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
Auto自适应显示
Fill不保持宽高比进行放大缩小,使得图片充满显示边界。
ScaleDown保持宽高比显示,图片缩小或者保持不变。
None保持原有尺寸显示。
2、layoutWeight属性
名称参数说明描述
layoutWeightnumber、string父容器尺寸确定时,设置了layoutWeight属性的子元素与兄弟元素占主轴尺寸按照权重进行分配,忽略元素本身尺寸设置,表示自适应占满剩余空间。
默认值:0
从API version 9开始,该接口支持在ArkTS卡片中使用。
说明:
仅在Row/Column/Flex布局中生效。
可选值为大于等于0的数字,或者可以转换为数字的字符串。
3、定义模型类

在 ArkTS 中定义模型类与在纯 TypeScript 项目中定义类没有本质区别。但是,在 UI 开发中,你可能不会直接在组件的模板中使用模型类的实例。相反,你可能会将这些实例绑定到组件的响应式状态变量上,并在模板中使用这些状态变量。这样做的好处是,当状态变量发生变化时,UI 可以自动更新。

4、代码
// 定义模型类
class Item {id: number;title: string;img: ResourceStr;author: string;date: string;constructor(id: number, title: string, img: ResourceStr, author: string, date: string) {this.id = idthis.title = titlethis.img = imgthis.author = authorthis.date = date}
}// 全局自定义构建函数
@Builder function newsItem(item:Item){Row() {Column() {Text(item.title).fontSize(16).fontWeight(FontWeight.Bold).maxLines(2).textOverflow({ overflow: TextOverflow.Ellipsis })Text(`${item.author} ${item.date}`).fontSize(14)}.layoutWeight(1).alignItems(HorizontalAlign.Start).height(68).justifyContent(FlexAlign.SpaceBetween)Image(item.img).width(100).height(68).margin({ left: 8 }).borderRadius(2).objectFit(ImageFit.Cover)}.width('100%').height(80)
}@Entry
@Component
struct NewsBuilder {@State articleList: Item[] = [new Item(1, "嫦娥六号探测器进入环月轨道飞行", "https://p5.img.cctvpic.com/photoworkspace/contentimg/2024/05/08/2024050820144382684.jpg", "央视网", "2014-05-08"),new Item(2, "“五一”假期游处处火爆 有哪些文旅新潮流?", "https://cms-emer-res.cctvnews.cctv.com/image/1005/upload/17292d188bc64cef882f1cd07d3d2acc.jpeg", "央视新闻客户端", "2024-05-08"),new Item(3, "杭州:全面取消住房限购,购房即可申请落户", $r("app.media.2"), "界面新闻", "2024-05-09"),new Item(4, "时隔五年,合肥或将再次引进“国宝”大熊猫", "https://pics4.baidu.com/feed/d50735fae6cd7b899b1d7bef7ec7b8aad8330e5d.jpeg@f_auto?token=e70fa976dceb8e88433c493f7e86b88c", "九派新闻", "2024-05-08"),new Item(5, "发布擦边广告再被罚,椰树集团徘徊在“土味”和“低俗”之间?", "https://pics1.baidu.com/feed/e824b899a9014c083cd8d85d067bf9057af4f471.jpeg@f_auto?token=c6770b5d0d99a68721fc88e7a337d01c", "北京商报", "2024-05-08"),new Item(6, "特斯拉在华推进全自动驾驶 智能网联车产业链迎新机遇", $r("app.media.2"), "每日经济新闻", "2024-05-09"),]build() {Column() {List() {ForEach(this.articleList, (item: Item) => {ListItem() {newsItem(item)}.padding({ top: 5, bottom: 5 })})}.divider({ strokeWidth: 1, color: "#eeeeee" }).backgroundColor(0xffffff).borderRadius(10).padding(10)}.padding(10).backgroundColor(0xeeeeee).width('100%').height('100%')}
}
5、效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LiveGBS流媒体平台GB/T28181用户手册-国标设备:设备列表、通道列表、流传输模式修改、查看通道播放、设备录像、在线状态、流量统计

LiveGBS流媒体平台GB/T28181用户手册-国标设备:设备列表、通道列表、流传输模式修改、查看通道播放、设备录像、在线状态、流量统计 1、国标设备1.1、设备列表1.1.1、查看通道1.1.2、更新通道1.1.3、编辑1.1.3、导入导出1.1.4、条件检索1.1.5、设备状态记录1.1.6、设备流量统计…

【极简】docker常用操作

镜像images是静态的 容器container是动态的,是基于镜像的,类似于一个进程。 查看docker images: docker images 或者docker image ls 查看docker container情况:docker ps -a,-a意思是--all 运行一个container: doc…

【全开源】场地预定小程序支持微信小程序+微信公众号+H5

XYvenue是基于FastAdminUniApp开发的多场馆场地预定小程序,提供运动场馆运营解决方案,适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 功能特性 1、场馆管理 可添加多个预约场馆,小程序端切换场馆显示。 2、场地管理 可添加多…

Linux 第三十五章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

拥有庞大用户群体的国际顶级安全厂商,究竟在关注什么?

5月6-9日,2024第33届RSA年度会议在旧金山举行,吸引了超过 40000 名来自世界各地的网络安全专业人士。如此盛会,易安联当然不能缺席,我们万里奔赴,亲身领略这场享誉全球的技术盛宴。 ‍‍ ‍ 4天的时间里,…

TikTok Shop本土店回款如何高效查询?用EasyBoss ERP回款记录功能!

大家投入时间和精力去运营Shopee/TikTok本土店,最最最开心的事情就是看赚了多少钱!但是,但是!很多老板入驻的平台、经营的店铺都不止一个,想要查看不同平台和店铺回款,就需要不断切换不同的店铺后台、下载数…

计算机发展史故事【17】

任天堂崛起 七十年代美国雅达利公司开创一个高科技的电脑游戏业。无独有偶,一家专营电脑游戏机的日本任天堂公司,自八十年代初期把它的家庭电脑游戏机(FC)投放市场后,不平静的世界被再一次激起轩然大波。这个小小的日本…

录短视频用什么麦克风好?盘点五款热门无线领夹麦克风

如今是一个短视频飞速发展的时代,越来越多自媒体人通过短视频的方式来进行直播带货、生活Vlog、线上K歌等,记录下生活里种种美丽的瞬间。不过一个好的视频除了要有巧妙的构思和清晰稳定的拍摄外,干净的声音也是必不可少的部分。短视频归根结底…

26版SPSS操作教程(高级教程第二十三章)

目录 前言 粉丝及官方意见说明 第二十三章一些学习笔记 第二十三章一些操作方法 时间序列模型 时间序列的建立和平稳化 数据假设 具体操作 定义时间变量 时间序列的平稳化 绘制相应的时间序列图 序列图 自相关图(autocorrelation chart) 对…

电阻式传感器

电阻式传感器是一种将非电学量(如温度、压力、位移等)转换为电阻变化的传感器。它大致分为电阻应变式传感器、压阻式传感器和变阻式传感器三类。 电阻式传感器的优点包括结构简单、成本低廉、稳定性好,适用于多种环境。但它们也有局限性&…

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时,使用的用户名,可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…

中国开源 AI 大模型之光-InternLM2

今天给大家带来 AI 大模型领域的国产之光 - InternLM2,在10B量级开源大模型领域取得了全球 Top 3 的成绩,仅次于 Meta 发布的 Llama-3,在国内则是第一名的存在! 简介 InternLM2是由上海人工智能实验室和商汤科技联合研发的一款大型…