鸿蒙Harmony(八)ArkUI--状态管理器之@State

状态管理

在声明式UI中,是以状态驱动视图更新
状态:指驱动视图更新的数据(被装饰器标记的变量)

  • @State
  • @Prop 和 @Link
  • @Provide和 @Consume

@State

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

嵌套类型无法刷新视图

// 嵌套类型
class Person{name:stringage:numberfriend:Personconstructor(name:string,age:number,friend?:Person) {this.name=namethis.age=agethis.friend=friend}
}@Entry
@Component
struct Index {@State xiaoming: Person = new Person('xiaoming',13)@State xiaohong: Person = new Person('xiaohong',14,new Person("lilei",14))build() {Row() {Column() {Text(this.xiaoming.name+"的年龄"+this.xiaoming.age).fontSize(20).fontWeight(FontWeight.Bold).onClick(()=>{// 会刷新uithis.xiaoming.age++})Text(this.xiaohong.name+"的朋友的年龄"+this.xiaohong.friend.age).fontSize(20).fontWeight(FontWeight.Bold).onClick(()=>{// 嵌套类型,不会刷新uithis.xiaohong.friend.age++})}.width('100%')}.height('100%')}
}

数组中的对象属性无法触发视图更新

class Person {name: stringage: numberfriend: Personconstructor(name: string, age: number, friend?: Person) {this.name = namethis.age = agethis.friend = friend}
}@Entry
@Component
struct Index {@State xiaoming: Person = new Person('xiaoming', 13)@State friendList: Person[] = [new Person("lilei", 14),new Person("lilei2", 15)]build() {Row() {Column() {Text("朋友列表").fontSize(40).fontWeight(FontWeight.Bold)Button("添加朋友").onClick(() => {// 点击会增加let friendIndex = this.friendList.lengththis.friendList.push(new Person("lilei" + friendIndex, 20))})ForEach(this.friendList, (item, index) => {Row({space:10}) {Text(item.name + "的年龄" + item.age).fontSize(20).fontWeight(FontWeight.Bold).onClick(() => {// 点击不会发生年龄变更item.age++})Button("删除朋友").onClick(() => {// 点击会删除当前项this.friendList.splice(index, 1)})}.width('100%').justifyContent(FlexAlign.SpaceAround).margin({bottom:10,left:10,right:10}).borderRadius(15).padding(10).backgroundColor('#cccccc')})}.width('100%').height('100%').justifyContent(FlexAlign.Start)}.height('100%')}
}

应用示例

在这里插入图片描述

涉及内容:
基础组件:Progress CheckBox
容器组件:Stack List

class Task {static id: number = 1name: string = '任务' + Task.id++isDone: boolean = false
}@Extend(Text) function finishedTask() {.decoration({ type: TextDecorationType.LineThrough }).fontColor('#B1B2B1')
}@Entry
@Component
struct TaskPage {// 总任务数量@State totalTask: number = 0@State finishTask: number = 0@State taskList: Array<Task> = []build() {Column() {// 1.顶部任务统计部分this.TaskProgressView()// 2.新增任务Button("新增任务").onClick(() => {this.taskList.push(new Task())this.totalTask = this.taskList.length}).width("60%").margin({ top: 10 })// 3.任务列表List() {ForEach(this.taskList, (item, index) => {ListItem() {this.TaskItemView(item)}.swipeAction({ end: this.getDeleteButton(index) })// 向左滑动,出现删除按钮})}.layoutWeight(1) // 高度权重.width('100%').alignListItem(ListItemAlign.Center)}.width('100%').height('100%').backgroundColor('#eeeeee').justifyContent(FlexAlign.Start)}@Builder TaskProgressView() {Row() {Text("任务进度:").fontSize(20).fontWeight(FontWeight.Bold).margin({ right: 40 })Stack() {Progress({ value: this.finishTask, type: ProgressType.Ring, total: this.totalTask }).width(120)Text(this.finishTask + "/" + this.totalTask).fontSize(20).fontWeight(FontWeight.Bold)}}.commonCardStyle().height(200).padding({ left: 20, right: 20 }).justifyContent(FlexAlign.Center)}@Builder TaskItemView(task: Task) {Row() {// 这里不生效,原因:state 数组对象嵌套不刷新视图if (task.isDone) {Text(task.name).fontSize(15).fontWeight(FontWeight.Bold).margin({ right: 40 }).finishedTask()} else {Text(task.name).fontSize(15).fontWeight(FontWeight.Bold).margin({ right: 40 })}Checkbox().select(task.isDone).onChange((isChecked) => {task.isDone = isCheckedthis.finishTask = this.taskList.filter(item => item.isDone).length})}.commonCardStyle().height(100).padding({ left: 20, right: 20 }).justifyContent(FlexAlign.SpaceBetween)}@Builder getDeleteButton(index: number) {Button({ type: ButtonType.Circle }) {Image($r('app.media.del'))}.onClick(() => {this.taskList.splice(index, 1)this.finishTask = this.taskList.filter(item => item.isDone).lengththis.totalTask = this.taskList.length}).width(50).height(50).padding(10).margin({ right: 5 }).backgroundColor('#ffffff')}@Styles commonCardStyle(){.width('95%').margin({ left: 10, right: 10, top: 10 }).borderRadius(20).backgroundColor('#ffffff').shadow({ radius: 6, color: '#1f000000', offsetX: 2, offsetY: 4 })}
}

@Prop 和 @Link

@Provide和 @Consume

@Observerd 和 ObjectLink

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

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

相关文章

【PostgreSQL内核学习(二十)—— 数据库中的遗传算法】

数据库中的遗传算法 概述个体的编码方式及种群初始化geqo 函数 适应值geqo_eval 函数gimme_tree 函数 父体选择策略geqo_selection 函数 杂交算子边重组杂交 ERX ( edge recombination crossover)gimme_edge_table 函数gimme_tour 函数 变异算子geqo_mutation 函数 声明&#x…

Java EE 网络原理之HTTP 响应详解

文章目录 1. 认识"状态码"(status code)2. 通过 form 表单构造 HTTP 请求3. 通过 ajax 构造 HTTP 请求 1. 认识"状态码"(status code) 表示了这次请求对应的响应&#xff0c;是什么样的状态 &#xff08;成功&#xff0c;失败&#xff0c;其他的情况&…

12.Go 函数

1、函数的声明 语法&#xff1a;func 函数名(参数列表)(返回参数列表){函数体} 函数名遵循标识符的命名规则&#xff0c;首字母的大小写决定该函数在其他包的可见性&#xff1a;大写时其他包可见&#xff0c;小写时只有相同的包可以访问&#xff1b;函数的参数和返回值需要使…

GIT提交、回滚等基本操作记录

1、add文件时warning: LF will be replaced by CRLF in .idea/workspace.xml. 原因&#xff1a;windows中的换行符为 CRLF&#xff0c; 而在Linux下的换行符为LF&#xff0c;所以在执行add . 时会出现以下提示 解决&#xff1a;git config core.autocrlf false 2、GIT命令&…

pip 国内镜像源

pip 国内镜像源 部分可用的pip国内镜像源有下面这些&#xff1a; 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣 http://pypi.douban.com/simple Python官方 https://pypi.python.org/simple/ v2ex http://pypi…

【微信】公众号授权绑定登录流程详解

在做微信公众号开发时&#xff0c;经常需要对公众号上面的菜单做授权登录&#xff0c;如果是首次登录还需要做微信openId和系统账号的绑定操作。 这里做如下假设&#xff1a; 系统前端地址&#xff1a;http://www.test.com系统接口地址&#xff1a;http://api.test.com需要打…

Activity启动过程

首语 Activity作为Android四大组件中使用最频繁的组件&#xff0c;也是和用户交互最多的组件&#xff0c;可见它在Android技术体系的核心地位&#xff0c;了解Activity的启动过程可以帮助我们更好的了解Android系统和使用Activity。 文章目录 首语Activity启动过程根Activity…

加强->servlet->tomcat

0什么是servlet jsp也是servlet 细细体会 Servlet 是 JavaEE 的规范之一&#xff0c;通俗的来说就是 Java 接口&#xff0c;将来我们可以定义 Java 类来实现这个接口&#xff0c;并由 Web 服务器运行 Servlet &#xff0c;所以 TomCat 又被称作 Servlet 容器。 Servlet 提供了…

打造完备数据生态,「开放互信、合作共赢」: 拓数派亮相2023龙蜥操作系统大会

拓数派始终持「开放互信&#xff0c;合作共赢」的理念&#xff0c;通过积极建立合作伙伴生态网络、构建生态工具、打造活跃的技术和用户社区等方式&#xff0c;构筑更加完善的数据生态体系&#xff0c;为用户带来更加便捷的使用体验。2023年12月17-18日&#xff0c;由开放原子开…

如何实现无公网ip环境访问vscode远程开发【内网穿透】

文章目录 前言1、安装 OpenSSH2、vscode 配置 ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu 安装 cpolar 内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定 TCP 端口地址5.1 保留一个固定 TCP 端口地址5.2 配置固定 TCP 端口地址5.3 测试固定公网地址远…

使用Vue3开发学生管理系统模板5 学生家长信息的实现

字段设计 IDname&#xff1a;姓名&#xff0c;字符串&#xff0c;最长36个字符gender&#xff1a;性别&#xff0c;字符串&#xff0c;最长6个字符串age&#xff1a;年龄&#xff0c;数字类型phone&#xff1a;电话&#xff0c;字符串&#xff0c;最长20个字符student_id&…

无需手动搜索!轻松创建IntelliJ IDEA快捷方式的Linux教程

轻松创建IntelliJ IDEA快捷方式的Linux教程 一、IntelliJ IDEA简介二、在Linux系统中创建快捷方式的好处三、命令行创建IntelliJ IDEA快捷方式四、图形界面创建IntelliJ IDEA快捷方式五、常见问题总结 一、IntelliJ IDEA简介 IntelliJ IDEA是一个由JetBrains搞的IDE&#xff0…

搭建FTP服务器详细介绍

一.FTP简介 &#xff11;.&#xff11;什么是FTP &#xff11;.&#xff12;FTP服务器介绍 &#xff11;.&#xff13;FTP服务器优缺点 二.FTP服务器的搭建与配置 2.1 开启防火墙 2.2创建组 2.3创建用户 2.4安装FTP服务器 2.5配置FTP服务器 &#xff12;.&#xff…

麒麟KYLINOS _ 传书 _ 如何传输文件?

原文链接&#xff1a;麒麟KYLINOS | 传书 | 如何传输文件&#xff1f; hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在麒麟KYLINOS操作系统上使用自带的文件传输软件——传书。在日常工作和生活中&#xff0c;我们经常需要在不同设备之间传输文件和信息。传书…

论文阅读《Restormer: Efficient Transformer for High-Resolution Image Restoration》

论文地址:https://openaccess.thecvf.com/content/CVPR2022/html/Zamir_Restormer_Efficient_Transformer_for_High-Resolution_Image_Restoration_CVPR_2022_paper.html 源码地址:https://github.com/swz30/Restormer 概述 图像恢复任务旨在从受到各种扰动(噪声、模糊、雨滴…

账号租号平台PHP源码,支持单独租用或合租使用

源码简介 租号平台源码&#xff0c;采用常见的租号模式。 平台的主要功能如下&#xff1a; 支持单独租用或采用合租模式&#xff1b; 采用易支付通用接口进行支付&#xff1b; 添加邀请返利功能&#xff0c;以便站长更好地推广&#xff1b; 提供用户提现功能&#xff1b;…

超强整理,Web自动化测试-验证码/cookie机制(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、后台登录案例 …

Springboot整合Elastic-job

一 概述 Elastic-Job 最开始只有一个 elastic-job-core 的项目&#xff0c;定位轻量级、无中心化&#xff0c;最核心的服务就是支持弹性扩容和数据分片&#xff01;从 2.X 版本以后&#xff0c;主要分为 Elastic-Job-Lite 和 Elastic-Job-Cloud 两个子项目。esjbo官网地址 Ela…

【五】【C语言\动态规划】删除并获得点数、粉刷房子、买卖股票的最佳时机含冷冻期,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

Docker部署Plik临时文件上传系统并实现远程访问设备上传下载文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…