鸿蒙HarmonyOS开发:@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

文章目录

      • 一、装饰器
      • 二、概述
      • 三、限制条件
      • 四、装饰器说明
      • 五、Toggle组件
        • 1、子组件
        • 2、接口
        • 3、ToggleType枚举
        • 4、事件
      • 六、示例演示
        • 1、代码
        • 2、效果

一、装饰器

  • @State装饰器:组件内状态
  • @Prop装饰器:父子单向同步
  • @Link装饰器:父子双向同步
  • @Provide装饰器和@Consume装饰器:与后代组件双向同步

上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。这就引出了@Observed/@ObjectLink装饰器。

二、概述

@ObjectLink和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步:

被@Observed装饰的类,可以被观察到属性的变化;

子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中的属性,这个属性同样也需要被@Observed装饰。

@Observed用于嵌套类场景中,观察对象类属性变化,要配合自定义组件使用,如果要做数据双/单向同步,需要搭配@ObjectLink或者@Prop使用。

三、限制条件

使用@Observed装饰class会改变class原始的原型链,@Observed和其他类装饰器装饰同一个class可能会带来问题。

@ObjectLink装饰器不能在@Entry装饰的自定义组件中使用。

四、装饰器说明

@Observed类装饰说明
装饰器参
类装饰器装饰class。需要放在class的定义前,使用new创建类对象。
@ObjectLink变量装饰器说明
装饰器参数
允许装饰的变量类型必须为被@Observed装饰的class实例,必须指定类型。
不支持简单类型,可以使用@Prop。
支持继承Date、Array的class实例,API11及以上支持继承Map、Set的class实例。
@ObjectLink的属性是可以改变的,但是变量的分配是不允许的,也就是说这个装饰器装饰变量是只读的,不能被改变。
被装饰变量的初始值不允许。

五、Toggle组件

组件提供勾选框样式、状态按钮样式及开关样式。

1、子组件

仅当ToggleType为Button时可包含子组件。

2、接口

Toggle(options: { type: ToggleType, isOn?: boolean })

  • 参数
参数名参数类型必填参数描述
typeToggleType开关的样式。
默认值:ToggleType.Switch。
isOnboolean开关是否打开,true:打开,false:关闭。
默认值:false
从API version 10开始,该参数支持$$双向绑定变量。
3、ToggleType枚举
名称描述
Checkbox提供单选框样式。
Button提供状态按钮样式,如果子组件有文本设置,则相应的文本内容会显示在按钮内部。
默认尺寸为:高为28vp,宽无默认值。
Switch提供开关样式。
4、事件

开关状态切换时触发该事件。

onChange(callback: (isOn: boolean) => void)

  • 参数
参数名类型必填说明
isOnboolean为true时,代表状态从关切换为开。false时,代表状态从开切换为关。

六、示例演示

本示例演示联系人管理功能页面。
可以新增,删除,收藏,展开手机号登功能。
使用到的组件间相互通信功能
@Prop装饰器:父子单向同步
@Link装饰器:父子双向同步
@Watch装饰器监听状态变量的变化
@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
@Extend装饰器:定义扩展组件样式
Toggle组件

1、代码
// 定义变量ID,默认从1开始,自增
let id = 1// @Observed装饰的类
@Observed
class Person {name: stringphone: stringisCollect: boolean = falseid: numberconstructor(name: string, phone: string) {// id自增this.id = id++this.name = namethis.phone = phone}
}// 随机姓名方法,为了演示简写
function getRandomName() {return "张三" + Math.floor(Math.random() * 100)
}//随机手机号,为了演示简写
function getRandomPhone() {return "1" + (Math.floor(Math.random() * 9000000000) + 1000000000)
}@Entry
@Component
struct ContactsList {// 联系人列表@State contactsList: Person[] = [new Person(getRandomName(), getRandomPhone()), new Person(getRandomName(), getRandomPhone())]// 当前展开的联系人ID@State currentExpandID: number = 0// 是否点击选中@State isSelect: boolean = false// 选中的联系人ID列表@State selectIdList: number[] = []build() {Column() {Row({ space: 10 }) {Text("联系人管理").fontSize(20)Blank()Button(this.isSelect ? "取消" : "选中")// 扩展组件样式.globalButtonStyle(Color.Gray)// 点击切换选中/取消按钮事件.onClick(() => {this.isSelect = !this.isSelectthis.selectIdList = []})Button("+")// 扩展组件样式.globalButtonStyle(Color.Gray).onClick(() => {// 新增联系人this.contactsList.push(new Person(getRandomName(), getRandomPhone()))})}.width("100%").padding(10)List({ space: 10 }) {ForEach(this.contactsList, (item: Person) => {ListItem() {// 观察对象类属性变化,要配合自定义组件使用ContactsItem({ item,currentExpandID: $currentExpandID,isSelect: this.isSelect,selectIdList: $selectIdList })}})}.padding(10).layoutWeight(1)if (this.isSelect) {Button("删除").margin(10)// 扩展组件样式.globalButtonStyle(Color.Red)// 删除按钮点击事件.onClick(() => {this.contactsList = this.contactsList.filter((item: Person) => {return !this.selectIdList.includes(item.id)})})}}.width('100%').height('100%').backgroundColor("#f7f7f7")}
}// 自定义组件
@Component
struct ContactsItem {// 数据双向同步,需要搭配@ObjectLink@ObjectLink item: Person// 组件内状态@State isExpand: boolean = false// 父子双向同步 监听状态变化@Link @Watch("onChangeCurrentID") currentExpandID: number// 父子单向同步@Prop isSelect: boolean// 父子双向同步@Link selectIdList: number[]// 监听状态变量变化回调onChangeCurrentID() {if (this.item.id != this.currentExpandID) {this.isExpand = false}}build() {Column() {Row({ space: 10 }) {// 复选框if (this.isSelect) {Toggle({ type: ToggleType.Checkbox })// 选中状态发生变化时的事件.onChange((val) => {if (val) {this.selectIdList.push(this.item.id)} else {let index: number = this.selectIdList.indexOf(this.item.id)this.selectIdList.splice(index, 1)}})}// 头像Image($r("app.media.picture")).width(30).height(30)// 姓名Text(this.item.name).fontSize(18)Blank()// 收藏Image(this.item.isCollect ? $r("app.media.collect_select") : $r("app.media.collect")).width(26).height(26).onClick(() => {// 第二层的属性值变化this.item.isCollect = !this.item.isCollect})}.height(40).width("100%")// 手机号if (this.isExpand) {Divider().margin({ top: 10, bottom: 6 }).color("#EEEEEE")Row() {Text("手机号码:" + this.item.phone).fontSize(16)}.height(30).width("100%")}}.width("100%").padding(10).borderRadius(6).backgroundColor(Color.White)// 点击展开显示手机号码.onClick(() => {this.isExpand = !this.isExpandthis.currentExpandID = this.item.id})}
}// 定义扩展组件样式
@Extend(Button) function globalButtonStyle(color: Color) {.height(30).fontSize(14).backgroundColor(color)
}
2、效果
  • 点击新增按钮,可以新增联系人
  • 点击收藏按钮,可以切换是否收藏
    在这里插入图片描述
  • 点击联系人,可以展开当前联系人,查看手机号码
  • 点击上面选择按钮,可以切换选择页面
  • 点击联系人前面复选框,可以选中联系
  • 点击删除按钮,可以删除选中的联系人
    在这里插入图片描述

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

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

相关文章

Windows10安装CMake图文教程

CMake是一个跨平台的开源构建工具,用于管理软件构建过程。CMake允许开发人员使用简单的语法来描述项目的构建过程,而无需直接处理特定于操作系统或编译器的细节。开发人员可以编写CMakeLists.txt文件来指定项目的源文件、依赖项和构建规则,然…

2024杭电多校第三场

目录 1001-深度自同构 1003-游走 1007-单峰数列 1008-比特跳跃 1011-抓拍 1012-死亡之组 1001-深度自同构 每个数的答案其实与它的各个因数有关&#xff0c;正向递推一下 #include <bits/stdc.h> using namespace std; #define int long long const int N1e65; co…

计算机毕业设计选题推荐-服装生产管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

超市客流统计,AI智能分析算法,生成精准客户画像

随着科技的进步&#xff0c;零售行业正经历着前所未有的变革。其中&#xff0c;超市作为零售业态的重要组成部分&#xff0c;面临着如何更有效地吸引顾客、提升购物体验、增加销售额等挑战。借助先进的客流统计系统和AI智能分析算法&#xff0c;超市不仅能够准确地统计客流量&a…

共建数智江城:生态沃土如何孕育技术普惠的硕果

当人们热议一线、新一线等城市综合竞争力时&#xff0c;数字经济早已成为城市之间竞争的新赛道。 作为国家首批智慧城市建设试点城市&#xff0c;武汉一直是数字经济发展的先锋。2023年&#xff0c;武汉建成数字经济产业园区30家&#xff0c;数字经济规模占地区生产总值比重达4…

一篇文章教你学会二叉树的链表实现及其oj题(附源码)

前言 前面我们通过堆实现了二叉树&#xff0c;接下来我们用链表实现二叉树。 1. 实现链式结构二叉树 1.1 结构体定义 二叉树的每个结点需要两个指针&#xff0c;分别指向其左孩子和右孩子。还有一个结点域&#xff0c;存储数据。 还是将数据类型重命名&#xff0c;便于后面…

【JavaEE】通过Linux部署Web项目到云服务器上

一.配置部署所需的环境. 1.1 什么是部署? 要想知道什么是部署, 就要先了解我们在日常开发的过程中所设计到的几种环境: 开发环境: 软件开发环境指的是开发人员在创建、测试和部署软件应用程序时所需的一系列硬件、软件、工具和流程的集合。它是为了支持软件开发过程而构建的…

文件包含漏洞--pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.PHP伪协议利用 php://协议 php://filter &#xff1a;用于在读取作用和写入文件时进行过滤和转换操作。 作用1&#xff1a;利用base64编码过滤器读取源码 通常利用文件包含执行php://filte…

哈希表专题

题解之前&#xff1a; 1.有关unordered_map的count功能&#xff1a;查询key&#xff01; Leetcode 1.两数之和 解题思路&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> res;// key:具体的数值(便…

【计算机毕业设计】838装修公司CRM系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

c# - - - ASP.NET Core 网页样式丢失,样式不对

c# - - - ASP.NET Core 网页样式丢失&#xff0c;样式不对 问题 正常样式是这样的。 修改项目名后&#xff0c;样式就变成这样了。底部的内容跑到中间了。 解决 重新生成解决方案&#xff0c;然后发布网站。 原因&#xff1a; 修改项目名之前的 div 上有个这个自定义属…

大数据采集工具——Flume简介安装配置使用教程

Flume简介&安装配置&使用教程 1、Flume简介 一&#xff1a;概要 Flume 是一个可配置、可靠、高可用的大数据采集工具&#xff0c;主要用于将大量的数据从各种数据源&#xff08;如日志文件、数据库、本地磁盘等&#xff09;采集到数据存储系统&#xff08;主要为Had…

React Native在移动端落地实践

在移动互联网产品迅猛发展的今天&#xff0c;技术的不断创新使得企业越来越注重降低成本、提升效率。为了在有限的开发资源下迅速推出高质量、用户体验好的产品&#xff0c;以实现公司发展&#xff0c;业界催生了许多移动端跨平台解决方案。这些方案不仅简化了开发流程&#xf…

C#基于SkiaSharp实现印章管理(5)

印章中最常见的特殊形状通常是五角星&#xff0c;空心、实心的都可能存在&#xff0c;本文学习并实现在印章内部绘制五角星形状。   百度五角星的绘制方法&#xff0c;主要分为三种&#xff1a;   1&#xff09;五角星各点坐标固定&#xff0c;直接调用编程语言的绘制线条或…

校车购票小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;我的乘车信息管理&#xff0c;车辆信息管理&#xff0c;座位管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;车辆信息&#xff0c;我的 开发系统…

推荐一款专注批量推送消息的轻量工具,支持主流平台的消息推送,简单、高效、低成本(附源码)

前言 在数字化时代&#xff0c;企业和个人面临着日益增长的消息推送需求。然而&#xff0c;现有的推送处理方案往往存在一些挑战和不足&#xff0c;如cao作复杂、成本高昂、缺乏灵活性等。这些问题不仅影响了推送效率&#xff0c;也增加了用户的负担。此外&#xff0c;随着工作…

SpringCloud+Vue3主子表插入数据(芋道)

目的&#xff1a;多表联查获取到每个班级里面所有的学生上课的信息。点击消课插入到消课主表和消课子表&#xff0c;主表记录班级信息&#xff0c;消课人员信息&#xff0c;上课时间。子表记录上课学员的信息&#xff0c;学员姓名、手机号、班级名称、班级类型、上课时间、老师…

词的向量化和文本向量化

词的向量化和文本向量化 向量化one-hot编码提前准备词表不提前准备词表one-hot缺点 词向量简介词向量的定义和目标word embedding和word vector的区别onehot编码与词向量关系构建 训练方式1&#xff08;基于语言模型&#xff09;训练方式2&#xff08;基于窗口&#xff09;CBOW…

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 window.onload 触发时机&#xff1a;window.onload 事件会在整个页面&#xf…

[css3] 如何设置边框颜色渐变

div {border: 4px solid;border-image: linear-gradient(to right, #8f41e9, #578aef) 1; }参考&#xff1a; 5种CSS实现渐变色边框&#xff08;Gradient borders方法的汇总