学习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…

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

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

修复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…

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

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

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

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

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

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

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

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

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

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

linux系统安全与应用【下】

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

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

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

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

Day39 网络编程(一):计算机网络,网络编程,网络模型,网络编程三要素 文章目录 Day39 网络编程(一):计算机网络,网络编程,网络模型,网络…

day07 51单片机-串口通信

51 单片机-串口通信 1 串口通信 1.1 需求描述 本案例讲解如何通过串口和PC以9600波特率,无校验位、1停止位通信。最终实现PC向单片机发送字符串,单片机回复PC。本案例中采用串口1通信。 1.2 硬件设计 1.2.1 串口工作原理 串口是将数据按照比特逐一发送的通信接口。在串…

Python 开发实现登陆和注册模块

Python 开发实现登陆和注册模块 一、案例介绍 本例设计一个用户登录和注册模块,使用Tkinter框架构建界面,主要用到画布、文本框、按钮等组件。涉及知识点:Python Tkinter界面编程、pickle数据存储。本例实现了基本的用户登录和注册互动界面…

web前端 html5+css3相关知识点(跟着黑马学)8

先总结一下网页常见的布局方式: 1. 标准流 块级元素独占一行 -> 垂直布局 行内元素/行内块元素一行显示多个 -> 水平布局 2. 浮动 可以让原本垂直布局的块级元素变成水平布局。 3. 定位 可以让元素自由的摆放在网页的任意位置 一般用于盒子之间的层叠…

分布式锁(Redis)

一、序言 本文和大家聊聊分布式锁以及常见的解决方案。 二、什么是分布式锁 假设一个场景:一个库存服务部署在上面三台机器上,数据库里有 100 件库存,现有 300 个客户同时下单。并且这 300 个客户均摊到上面的三台机器上(即三台…

React 19 带来了 JSX 运行时的重要更新

在 React 的发展历程中,JSX 运行时一直扮演着重要的角色。在以前的的版本,JSX 运行时会克隆传入的 props 对象,这背后有着两大原因。 历史原因 React 保留了一些特殊的 prop 名称,如 key 和在 React 19 之前的 ref。这些 prop 并…

SpringBoot整合Swagger3生成接口文档

一:前言 Swagger 是一个 RESTful API 的开源框架,它的主要目的是帮助开发者设计、构建、文档化和测试 Web API。Swagger 的核心思想是通过定义和描述 API 的规范、结构和交互方式,以提高 API 的可读性、可靠性和易用性,同时降低 …

深度图转点云

一、理论分析 二、其他分析 1、相机内参 相机内参主要是四个参数fx,fy,u0,v0。要明白相机内参就是相机内部参数,是参考像素坐标系而言,有了这个前提,这四个参数也就很好理解了。 (1)首先,。其中F是相机的…