HarmonyOS 应用开发 —— 常用装饰器整理

HarmonyOS 应用开发 —— 常用装饰器整理

当前版本:API9 纯 ArcTS 语言和 Stage模式

学习 HarmonyOS 时,我们会用到各种各样的装饰器。

我们使用 DevEco IDLE 进行 HarmonyOS 应用开发时,在任意 .ets 文件中,输入 @ 时,会弹出所有的装饰器,但是什么时候该用什么装饰器就需要查文档。但是官方文档没有搜到和装饰器强相关的文档。

故自行总结常用装饰器的学习笔记

PS:由于楼主也在学习的过程中,所以可能有些地方写的不是很清晰,欢迎大家来指正

一、修饰 struct 或 class

@Entry

作用:表示自定义组件入口,一个组件有且只能拥有一个入口,及入口组件

案例:我们默认创建的项目,默认生成的文件就包含了 @Entry

@Entry
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)}.width('100%')}.height('100%')}
}

@Conponent

作用:表示当前 struct 是一个组件,可以单独使用,封装抽离文件

案例:使用方式如下,如果需要让别的组件使用该自定义组件,使用 import/export 语法 导出以及导入即可

@Component
struct Index {@State message: string = 'Hello World'build() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)}.width('100%')}
}

@Preview

作用:Dev Eco 预览器提供的一个快捷注解,可以快速预览单个页面,以及组件

使用:

@Preview
@Entry      // 使用了 @Preview 组件,@Entry 注解就不再是必要的了
@Component
struct TaskPage {// ....
}

@Observed

作用:新闻发布案例中 NewsViewModel 会用到,会与变量修饰器 @ObjectLink 一起使用,可以挂多个组件建立连接

使用:

@Observed
export class CustomRefreshLoadLayoutClass {/*** Custom refresh load layout isVisible.*/isVisible: boolean;/*** Custom refresh load layout imageSrc.*/imageSrc: Resource;/*** Custom refresh load layout textValue.*/textValue: Resource;/*** Custom refresh load layout heightValue.*/heightValue: number;constructor(isVisible: boolean, imageSrc: Resource, textValue: Resource, heightValue: number) {this.isVisible = isVisible;this.imageSrc = imageSrc;this.textValue = textValue;this.heightValue = heightValue;}
}

二、修饰变量

@State

作用:用于组件内状态管理,使用该装饰器修饰的变量,当变量值发生改变后,会触发 ArkUI 的更新

案例:

@Component
struct Index {@State message: string = 'Hello World'build() {Column() {Text(this.message)  // 在 HarmonOS 中并没有抛弃 this 的概念!// ..}// ..}
}

@Prop

作用:父组件 -> 子组件,单向同步状态

TODO:实际开发中暂时未遇到,如遇到了,在更新

父子组件双向同步状态

使用:

父组件

// ...@Preview
@Component
export default struct TabBar {@State tabBarArray: NewsTypeBean[] = NewsViewModel.getDefaultTypeList();@State currentIndex: number = 0;     // 定义 State 状态变量@State currentPage: number = 1;// ....build() {Tabs() {ForEach(this.tabBarArray, (tabItems: NewsTypeBean) => {TabContent() {Column() {NewsList({ currentIndex: $currentIndex })   // 这里传递的是引用}}.tabBar(this.TabBuilder(tabItems.id))}, (item: NewsTypeBean) => JSON.stringify(item))}// ....vertical(false)}
}

子组件

export default struct NewsList {@State newsModel: NewsModel = new NewsModel();@Watch('changeCategory') @Link currentIndex: number;// 定义监听函数changeCategory() {this.newsModel.currentPage = 1;NewsViewModel.getNewsList(this.newsModel.currentPage, this.newsModel.pageSize, Const.GET_NEWS_LIST).then((data: NewsData[]) => {this.newsModel.pageState = PageState.Success;if (data.length === this.newsModel.pageSize) {this.newsModel.currentPage++;this.newsModel.hasMore = true;} else {this.newsModel.hasMore = false;}this.newsModel.newsData = data;}).catch((err: string | Resource) => {promptAction.showToast({message: err,duration: Const.ANIMATION_DURATION});this.newsModel.pageState = PageState.Fail;});}aboutToAppear() {// Request news datathis.changeCategory();}// ..
}

@Watch

和 @Link 一起使用,监听状态变化

使用:见上一个案例

@Provide [待更新]

作用:跨组件通信,可以给祖父组件的变量修饰

@Consume [待更新]

作用:跨组件通信,可以给孙子组件的变量修饰

与被 @Observed 修饰过的 class 结合一起使用,具体作用待了解

TODO: 暂时还未摸清楚具体作用,也没有合适的案例,暂时先不提供了

三、修饰函数

使用修饰函数的装饰器,我们可以进一步抽离繁杂冗余的样式,可复用的代码逻辑,降低代码的复杂程度

@Builder

作用:用来修饰一个函数,快速生成布局内容,从而避免编写重复的样式,可以直接封装一个可复用 并且附带样式 的组件

案例:

@Component
export default struct TodoItem {@State isComplete: boolean = false;@Builder labelIcon(url) {Image(url).objectFit(ImageFit.Contain).width(24).height(24).margin({right: 15,top: 5})}build() {Row() {if (this.isComplete) {this.labelIcon($r("app.media.select"))} else {this.labelIcon($r("app.media.unselect"))}// ..}}
}

@Style

作用:用来修饰一个函数,保存样式,可以直接提供给组件使用

语法:

// 统一卡片样式
@Styles function card() {.width('95%').padding(20).backgroundColor(0xffffff).borderRadius(15).shadow({ radius: 6, color: 0x1F000000, offsetX: 2, offsetY: 4})
}

@Extend

作用:继承一个内置组件,并且开发者可扩展出其他常用属性

语法:

@Extend(Text) function finishedTask() {.decoration({ type: TextDecorationType.LineThrough }).fontColor(0xB1B2B1)
}

案例:

    // ...Row() {Text(item.name).fontSize(20).fontWeight(FontWeight.Bold).finishedTask()}// ...// 这里需要定在 struct 文件之外
@Extend(Text) function finishedTask() {.decoration({ type: TextDecorationType.LineThrough }).fontColor(0xB1B2B1)
}

相关文档

应用级变量的状态管理

更多的装饰器组件可以查看 common.d.ts 文件

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

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

相关文章

代码随想录算法训练营第二十六天(回溯算法篇)|39. 组合总和,40. 组合总和Ⅱ

39. 组合总和 题目链接:39. 组合总和 - 力扣(LeetCode) 题目内容:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0…

变量未声明,值是undefined吗?

先看下面的代码输出什么? var name; alert(typeof name); // undefined alert(title); //报错undefined是一个只有一个值的数据类型,这个值就是undefined,在使用var声明变量但并未对其值进行初始化时,这个变量的值就是undefined。…

GO并发编程综合应用

一.GO并发编程综合应用 1.生产者消费者模式 1.1需求分析 ​ 生产者每秒生产一个商品,并通过物流公司取货 ​ 物流公司将商品运输到商铺 ​ 消费者阻塞等待商铺到货,需要消费10次商品 1.2实现原理 1.3代码实现: package mainimport (&q…

Vue学习笔记-Vue3中的shallowReactive和shallowRef

shallowReactive 作用:与reactive作用类似,但只处理对象最外层属性的响应式(浅响应式)使用场景:如果有一个对象数据,结构比较深(内嵌多层对象),但只需要最外层的属性进行…

SpringCloud微服务 【实用篇】| Docker启示录

目录 一:Docker启示录 1. Docker启示录 2. Docker和虚拟机的区别 3. Docker架构 4. Centos7安装Docker 4.1. 卸载 4.2. 安装docker 4.3. 启动docker 4.4. 配置镜像加速 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

Python之random模块详解

python的random模块 random模块是python中一个生成随机数的模块。 random不是python解释器内置的模块。 导入random模块的方法是: import random 如果只使用random模块中的单个方法的话,也可以使用 from random import method_name 例如: …

蓝牙协议栈学习笔记

蓝牙协议栈学习笔记 蓝牙简介 蓝牙工作在全球通用的 2.4GHz ISM(即工业、科学、医学)频段,使用 IEEE802.11 协议 蓝牙 4.0 是迄今为止第一个蓝牙综合协议规范,将三种规格集成在一起。其中最重要的变化就是 BLE(Blue…

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码)

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码) 基本概念典型相关分析综合评价模型对应分析因子分析聚类分析 习题10.41. 题目要求2.解题过程3.程序 习题10.51. 题目要求2.解题过程3.程序 习题10.6(1&a…

用Excel绘制柱形图

在需要将数据用柱状图表示的时候,可以用Excel进行绘制。不单绘制柱形图,其他数据图也可以用Excel绘制。 接下来用绘制一个销售表的示例演示。 1.将数据输入Excel 数学书 语文书 英语书 一月 80 94 77 二月 95 86 84 三月 130 93 79 四月 …

实用干货:再见ElementPlus,我有更好的了

大家好,我是大澈! 本文约1200字,整篇阅读大约需要3分钟。 感谢关注微信公众号:“程序员大澈”,免费领取"面试大礼包"一份,然后免费加入问答群,从此让解决问题的你不再孤单&#xff…

任务调度系统就该这么设计(万能通用),稳的一批!

今天来扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 核心概念 这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有使用过的小伙伴更加容易接受文章的内容,快速讲一讲Xxl-Job中的概念和使用 如果你已经使用过了&#xf…

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。 步骤 1. 创建一个CSharp…

Java 8特性:Lambda表达式、函数式接口与Stream API的深度探索

一、引言 随着编程范式的不断演变,Java语言也在不断地发展和创新。Java 8的发布,为开发者们带来了诸多全新的特性,其中包括Lambda表达式、函数式接口以及Stream API。这些特性使得Java语言的编程更加简洁、优雅,同时也提高了代码…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

第16节:Vue3 响应式对象reactive()

在UniApp中使用Vue3框架时,你可以使用reactive()函数来创建一个响应式对象。reactive()函数返回一个响应式引用对象,它包装了一个普通的对象,使得该对象能够成为响应式数据源。 下面是一个示例,演示了如何在UniApp中使用Vue3框架…

docker部署go gin框架 Windows环境

目录 文章目的是什么 环境介绍 Windows 环境下 docker 部署 go gin 详细步骤 运行容器时因为挂载文件可能会出现的问题 直接部署gin(跳过运行容器时因为挂载文件可能会出现的问题) 文章目的是什么 假设我们学习了 go 语言,在 Windows(本…

6.rk3588获取摄像头和激光雷达数据(用线程根据时间同步)

文件夹结构如下: 如果没有特殊说明,我们将py文件写在该路径里面。 保存数据的路径如下: ---img_lidar_save ---2023-12-13(根据日期自动生成当天保存数据的文件夹) ---camera_data(相机数据文件夹) ---image(保存相加…

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 数据库 文章目录 前言合并区间问题📕现实应用大致思路代码实现代码讲解 最长不连续子序列&a…

jvisualvm手动安装VisualGC插件

前言 笔者近期排查问题需要查看GC的情况,于是用到了jvisualvm这个工具,查阅网上资料发现它有一个名为VisualGC的插件非常好用,于是笔者以此文记录一下VisualGC插件的安装步骤。 安装步骤 下载插件 首先我们要到官网 https://visualvm.gi…

未势能源受邀参加中国氢能100人论坛并发表演讲

12月12日-14日,“2023氢能嘉年华暨中国氢能100人论坛年会”在苏州举办,行业内专家学者、氢能头部企业代表等齐聚现场,聚焦氢能在化工、钢铁、交通等领域发展,共同探讨我国氢能产业初期前进之路。 未势能源液氢总工程师黄欢明受邀…