学习ArkTS -- 状态管理

装饰器

@State

在声明式UI中,是以状态驱动试图更新:
在这里插入图片描述
状态(State):指驱动视图更新的数据(被装饰器标记的变量)
视图(View):基于UI描述渲染得到用户界面

说明:
@State装饰器标记的变量必须初始化,,不能为空值
@State支持Object,class,string,number,boolean,enum类型以及这些类型的数组
嵌套类型以及数组中的对象属性无法触发试图更新

@Prop 和 @Link

当父子组件之间需要数据同步时,可以使用@Prop 跟C++函数传值差不多和@Link装饰器跟C++函数传引用差不多。
在这里插入图片描述

// @ts-nocheck
class Task{static id: number = 1// 任务名称name: string = `任务${Task.id++}`// 任务状态:是否完成finished: boolean = false}// 统一的卡片样式
@Styles function card(){.width('95%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4})}//任务完成样式
@Extend(Text) function finishedTask(){.decoration({type: TextDecorationType.LineThrough}).fontColor('#B1B2B1')}// 任务统计信息
class StatInfo {// 总任务量totalTask: number = 0// 已完成任务数量finishTask: number = 0
}@Entry
@Component
struct PropPage{// 总任务量@State stat: StatInfo = new StatInfo()build(){Column({space: 10}){// 1. 任务进度卡片TaskStatistics({finishTask: this.stat.finishTask, totalTask: this.stat.totalTask})// 2. 新增任务按钮TaskList({stat: $stat})}.width('100%').height('100%').backgroundColor('#F1F2F3')}
}@Component
struct TaskStatistics {@Prop finishTask: number@Prop totalTask: numberbuild() {Row(){Text('任务进度').fontSize(30).fontWeight(FontWeight.Bold)Stack(){Progress({value: this.finishTask,total: this.totalTask,type: ProgressType.Ring}).width(100)Row() {Text(this.finishTask.toString()).fontSize(24).fontColor('36D')Text(' / ' + this.totalTask.toString()).fontSize(24)}}}.card().margin({top: 20, bottom: 10}).justifyContent(FlexAlign.SpaceEvenly)}}@Component
struct TaskList {@Link stat: StatInfo// 任务数组@State tasks: Task[] = []handleTaskChange(){// 2. 更新任务总数量this.stat.finishTask = this.tasks.filter(item => item.finished).length// 2. 更新任务总数量this.stat.totalTask = this.tasks.length}build(){Column() {Button('新增任务').width(200).onClick(() => {// 1. 新增任务数量this.tasks.push(new Task())this.handleTaskChange()})// 3. 任务列表List({ space: 10 }) {ForEach(this.tasks,(item, index) => {ListItem() {Row() {Text(item.name).fontSize(20)Checkbox().select(item.finished).onChange(val => {// 1. 更新当前任务状态item.finished = val// 2. 更新任务总数量this.handleTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}.swipeAction({ end: this.DeleteButton(index) })})}.width('100%').layoutWeight(1).alignListItem(ListItemAlign.Center)}}@Builder DeleteButton(index: number) {Button() {Image($r('app.media.delete')).width(30)}.width(40).height(40).backgroundColor(Color.Red).type(ButtonType.Circle).margin(5).onClick(() => {this.tasks.splice(index, 1)this.handleTaskChange()})}
}

在这里插入图片描述

@Provide 和 @Consume 可以夸组件提供类似于@State和@Link的双向同步

在这里插入图片描述

@ObjectLink 和 @Observed

@ObjectLink 和 @Observed装饰器用于在涉及嵌套对象或数组元素为对象的场景中进行双向数据同步。
在这里插入图片描述
在这里插入图片描述

// @ts-nocheck
@Observed
class Task{static id: number = 1// 任务名称name: string = `任务${Task.id++}`// 任务状态:是否完成finished: boolean = false}// 统一的卡片样式
@Styles function card(){.width('95%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4})}//任务完成样式
@Extend(Text) function finishedTask(){.decoration({type: TextDecorationType.LineThrough}).fontColor('#B1B2B1')}// 任务统计信息
class StatInfo {// 总任务量totalTask: number = 0// 已完成任务数量finishTask: number = 0
}@Entry
@Component
struct PropPage{// 总任务量@State stat: StatInfo = new StatInfo()build(){Column({space: 10}){// 1. 任务进度卡片TaskStatistics({finishTask: this.stat.finishTask, totalTask: this.stat.totalTask})// 2. 新增任务按钮TaskList({stat: $stat})}.width('100%').height('100%').backgroundColor('#F1F2F3')}
}@Component
struct TaskStatistics {@Prop finishTask: number@Prop totalTask: numberbuild() {Row(){Text('任务进度').fontSize(30).fontWeight(FontWeight.Bold)Stack(){Progress({value: this.finishTask,total: this.totalTask,type: ProgressType.Ring}).width(100)Row() {Text(this.finishTask.toString()).fontSize(24).fontColor('36D')Text(' / ' + this.totalTask.toString()).fontSize(24)}}}.card().margin({top: 20, bottom: 10}).justifyContent(FlexAlign.SpaceEvenly)}}@Component
struct TaskList {@Link stat: StatInfo// 任务数组@State tasks: Task[] = []handleTaskChange(){// 2. 更新任务总数量this.stat.finishTask = this.tasks.filter(item => item.finished).length// 2. 更新任务总数量this.stat.totalTask = this.tasks.length}build(){Column() {Button('新增任务').width(200).onClick(() => {// 1. 新增任务数量this.tasks.push(new Task())this.handleTaskChange()})// 3. 任务列表List({ space: 10 }) {ForEach(this.tasks,(item:Task, index) => {ListItem() {TeskItem({ item: item, OnTaskChange: this.handleTaskChange.bind(this)})}.swipeAction({ end: this.DeleteButton(index) })})}.width('100%').layoutWeight(1).alignListItem(ListItemAlign.Center)}}@Builder DeleteButton(index: number) {Button() {Image($r('app.media.delete')).width(30)}.width(40).height(40).backgroundColor(Color.Red).type(ButtonType.Circle).margin(5).onClick(() => {this.tasks.splice(index, 1)this.handleTaskChange()})}
}@Componentstruct TeskItem {@ObjectLink item: TaskOnTaskChange: () => voidbuild() {Row() {if (this.item.finished) {Text(this.item.name).fontSize(20).finishedTask()}else {Text(this.item.name).fontSize(20)}Checkbox().select(this.item.finished).onChange(val => {// 1. 更新当前任务状态this.item.finished = val// 2. 更新任务总数量this.OnTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}
}

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

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

相关文章

病理验证mIF和TMA路线(自学)

目录 技术 使用配对病理切片 mIF验证 单基因使用TMA验证 技术 多重荧光免疫组化技术 (Multiplex immunohistochemical,mIHC) 也称作酪氨酸信号放大 (Tyramide dignal amplification,TSA) 技术,是一类利用辣根过氧化酶 (Horseradish Pero…

MyBatis 面试题(六)

1. MyBatis 有几种分页方式? MyBatis 的分页方式主要可以分为两大类:逻辑分页和物理分页。 逻辑分页是一次性把全部数据查询加载进内存,然后再进行分页。这种方式减少了IO次数,适合频繁访问、数据量少的情况,但不适合…

weblogic反序列化漏洞(CVE-2017-10271)复现

直接用vuluhub搭建现成的靶场做 访问靶场 打开是这样表示成功 想反弹shell 就先开启kali1的nc监听,这就监听2233端口吧 linux:nc -l -p 2233 抓包修改为攻击数据包 ip和端口可以任意修改 反弹的shell 还可以写入文件shell 只需要把提供的poc POS…

【代码随想录】day44

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、完全背包理论基础二、518零钱兑换 II三、377组合总和 Ⅳ总结 一、完全背包理论基础 完全背包:每个物品可以使用无数次。 二、518零钱兑换 II cla…

修复Windows搜索不工作的几种方法,总有一种适合你

序言 Windows搜索是Windows 10中一个非常有用的功能,它允许你搜索特定的程序、应用程序、文档、图片、文件、设置等,以便快速访问它们。但有时Windows搜索找不到我们预期的结果,甚至没有响应,这会给Windows用户带来很多不便。如果Windows 10中的搜索栏不工作,该怎么办?你…

【MySQL】SQL优化

SQL优化 插入数据 insert 一次插入数据和批量插入数据 insert into tb_test (id, name) values (1,Tom); insert into tb_test (id, name) values (1,Tom),(2,Jack),(3,Jerry);优化方案: 手动控制事务,且按主键顺序插入。start transaction; insert …

机器人实验室LAAS-CNRS介绍

一、LAAS-CNRS介绍 1、缩写介绍 同样的,给出英文缩写的全称,以便理解。这里的LAAS(Laboratory for Analysis and Architecture of Systems)指法国的系统分析与架构实验室,CNRS(Centre National de la Rec…

[leetcode]jump-game-iv

. - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 arr &#xff0c;你一开始在数组的第一个元素处&#xff08;下标为 0&#xff09;。 每一步&#xff0c;你可以从下标 i 跳到下标 i 1 、i - 1 或者 j &#xff1a; i 1 需满足&#xff1a;i 1 < arr.lengt…

oracle存储过程—游标

游标 CURSOR --隐式游标 select into--只能返回一行数据 --显示游标 :处理多行数据,一行一行去处理数据的循环 语法1: DECLAREcursor c_emp ISselect ename,sal from emp;---把查询到的emp表的数据放到游标c_emp中v_row c_emp%rowtype; --引用数据库中的一行(所有字段)作…

C# 十进制数转换为十六进制

在C#中&#xff0c;将十进制数转换为十六进制可以通过以下几种方式实现&#xff1a; 方法一&#xff1a;使用 ToString() 方法 对于整数类型的十进制数&#xff0c;可以直接调用其 ToString() 方法&#xff0c;并传入格式字符串 "X" 或 "x" 来表示转换为…

OpenHarmony实战开发-提升应用响应速度。

应用对用户的输入需要快速反馈&#xff0c;以提升交互体验&#xff0c;因此本文提供了以下方法来提升应用响应速度。 避免主线程被非UI任务阻塞减少组件刷新的数量 避免主线程被非UI任务阻塞 在应用响应用户输入期间&#xff0c;应用主线程应尽可能只执行UI任务&#xff08;…

【电控笔记6.3】采样-Z转换-零阶保持器

本质 数字转模拟:零阶保持器 采样 z-1所描述的物理意义即为延迟T时间的拉氏转换e-sT 信号采样延时

Python --- 新手小白自己动手安装Anaconda+Jupyter Notebook全记录(Windows平台)

新手小白自己动手安装AnacondaJupyter Notebook全记录 这两天在家学Pythonmathine learning&#xff0c;在我刚刚入手python的时候&#xff0c;我写了一篇新手的入手文章&#xff0c;是基于Vs code编译器的入手指南&#xff0c;里面包括如何安装python&#xff0c;以及如何在Vs…

【通信原理笔记】【四】数字基带传输——4.1 数字基带信号

文章目录 前言一、数字信号二、数字基带信号波形2.1 码元波形2.2 相对码2.3 多电平码 总结 前言 从这一节开始介绍数字通信系统中的数字基带传输部分。与模拟通信系统相比&#xff0c;数字通信系统传输的对象是数字的离散信号而非连续的模拟信号&#xff0c;本节先学习什么是数…

bfs解答迷宫

bfs解答迷宫问题 #include<bits/stdc.h> using namespace std; int dir[4][2]{-1,0,0,-1,0,1,1,0};//方向数组规律去记忆&#xff08;有对称规律&#xff09; int bfs(vector<vector<char> >& maze,vector<vector<bool> >& vis,int sx…

在传统云安全失败时提供帮助的六种策略

随着基于内存的攻击的激增继续挑战传统的云安全防御&#xff0c;对主动和全面的安全措施的需求变得至关重要。采用结合端点检测和响应、内存完整性保护和定期更新的多层方法可以加强对这些难以捉摸的威胁的防御。 随着云计算技术在各行各业的迅速普及&#xff0c;数据保护和安全…

linux系统安全与应用【下】

目录 1.开关机安全控制 1.1GRUB限制 2.终端登录安全控制 2.1 限制root只在安全终端登录 2.2 禁止普通用户登录 3.弱口令检测 3.1 Joth the Ripper&#xff08;JR&#xff09; 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1GRUB限制 通常情况下在系统开机进入GRU…

详解:老阳说的temu电商项目怎么做才更赚钱?

近年来&#xff0c;电商行业蓬勃发展&#xff0c;temu电商项目作为其中的一员&#xff0c;也受到了广泛关注。老阳作为行业内的资深人士&#xff0c;对于temu电商项目有着独到的见解。那么&#xff0c;如何才能做好temu电商项目呢? 首先&#xff0c;要明确temu电商项目的定位和…

Day39 网络编程(一):计算机网络,网络编程,网络模型,网络编程三要素

Day39 网络编程&#xff08;一&#xff09;&#xff1a;计算机网络&#xff0c;网络编程&#xff0c;网络模型&#xff0c;网络编程三要素 文章目录 Day39 网络编程&#xff08;一&#xff09;&#xff1a;计算机网络&#xff0c;网络编程&#xff0c;网络模型&#xff0c;网络…

基于Spring6的文件上传与下载

基于Spring6的文件上传与下载 1、文件上传1.1表单准备web.xml中配置 1.2 控制器代码 2. 文件下载2.1 下载链接2.1 对应控制器 1、文件上传 从浏览器向客户端上传的过程 1.1表单准备 <form th:action"{/fileup}" method"post" enctype"multipart…