鸿蒙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,一经查实,立即删除!

相关文章

ts中的任意接口

interface Persontest {name:string;[key:string]:any } var psss:Persontest{name:1,age:10,sex:男,[Symbol()]:灵境胡同 }ts中&#xff0c;[Symbol()] 是一个计算属性名称的语法&#xff0c;可以在对象字面量中使用 Symbol 类型来动态地生成属性名称&#xff0c;[Symbol()] 生…

【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;其他的情况&…

Flask 用户信息编辑系统

Flask 用户信息编辑系统 web/templates/user/edit.html {% extends "common/layout_main.html" %} {% block content %} {% include "common/tab_user.html" %} <div class"row m-t user_edit_wrap"><div class"col-lg-12"…

Java面试题86-95

86. Java代码查错&#xff08;4&#xff09;public class Something { public int addOne(final int x) { return x; }}此代码有错误吗&#xff1f;答案: 错。int x被修饰成final&#xff0c;意味着x不能在addOne method中被修改。87. Java代码查错&#xff08;5&…

Oracle如何自定义数据类型和数组和在数组中使用自定义类型

在Oracle数据库中&#xff0c;你可以自定义数据类型和数组。以下是如何做到这一点的简要指南&#xff1a; 自定义数据类型&#xff1a; 你可以使用CREATE TYPE语句来定义一个新类型。例如&#xff0c;定义一个名为person的类型&#xff0c;它包含两个属性&#xff1a;name和a…

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…

HarmonyOS应用开发实战—开箱即用的登录页面3【ArkTS】

文章目录 一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专栏-31】1.1 项目背景1.2 ArkTS详解二.HarmonyOS应用开发实战—开箱即用的登录页面3【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专…

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

在做微信公众号开发时&#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 测试固定公网地址远…

vue exceljs json数据转excel

json数据转excel 有时候我们会遇到这样一个需求&#xff0c;就是将数据转成excel下载&#xff0c;这一般都是由后端来处理&#xff0c;使用插件poi轻松搞定。如果只有少量数据&#xff0c;那么能不能避免调用后端接口&#xff0c;前端直接处理呢&#xff1f; 答案是&#xff…

使用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;我们经常需要在不同设备之间传输文件和信息。传书…