鸿蒙开发之@State案例

基于@State来创建一个任务管理的案例。

//任务类
class Task {static  id: number = 1name:string = '任务名称'+Task.id++finished:boolean = false
}//公共卡片样式
@Styles function  card() {.width('90%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius:6,color:'#1F00000',offsetX:2,offsetY:4})
}//扩展Text的样式,完成效果
@Extend(Text) function successd() {.decoration({type: TextDecorationType.LineThrough}).fontColor('#B1B2B1')
}@Entry
@Component
struct  ProgressTask {@State totalTasks: number = 0@State finishTasks:number = 0@State tasks: Task[] = []handleTaskNumber() {this.totalTasks = this.tasks.lengththis.finishTasks = this.tasks.filter(item =>item.finished).lengthconsole.log('完成任务数'+this.finishTasks)}build() {Column() {//进度卡片Row() {Text('任务进度:').fontWeight(FontWeight.Bold).fontSize(30).layoutWeight(1)//Stack组件可以让内部的组件堆叠Stack() {//Progress进度条Progress({value:this.finishTasks,total:this.totalTasks,type:ProgressType.Ring}).width(100)Row() {Text(this.finishTasks.toString()).fontSize(24).fontColor('#36D')Text(' / '+this.totalTasks.toString()).fontSize(24)}}}.card().height(150).margin({top:20,bottom:10}).justifyContent(FlexAlign.SpaceEvenly)//添加按钮Button('新增任务').width(200).height(35).onClick(() => {this.tasks.push(new Task())this.handleTaskNumber()}).margin({bottom:20})//任务列表List({space:10}){ForEach(this.tasks,(task:Task,index) => {ListItem() {Row(){Text(task.name).fontSize(20)Checkbox().select(task.finished).onChange(value => {task.finished = valueconsole.log('任务状态'+value+'')this.handleTaskNumber()})}.card().justifyContent(FlexAlign.SpaceBetween)}.swipeAction({end:this.deleteButton(index)})},item => ''+item.name)}.width('100%').alignListItem(ListItemAlign.Center).layoutWeight(1)}.width('100%').height('100%')}//ListItem左滑返回视图@Builder deleteButton(index:number) {Button('➖').fontColor(Color.White).backgroundColor(Color.Red).width(40).height(40).type(ButtonType.Circle).margin({left:5}).onClick(() => {this.tasks.splice(index,1)this.handleTaskNumber()})}
}

开发过程中的新知识点

1、Stack组件

该组件支持内部的组件堆叠

 Stack() {Text('任务进度1:').fontWeight(FontWeight.Bold).fontSize(30).layoutWeight(1)Text('任务进度2:').fontWeight(FontWeight.Bold).fontSize(30).layoutWeight(1)
}

2、数组的添加删除元素方式

 //插入一个元素this.tasks.push(Element)//删除从index起length个元素this.tasks.splice(index,length)

3、勾选框CheckBox组件

Checkbox()//选中状态.select(task.finished).onChange(value => { //状态改变回调})

4、Progress组件

//value是当前进度,total总值,type样式          
Progress({value:this.finishTasks,total:this.totalTasks,type:ProgressType.Ring})

5、给ListItem添加左滑事件

 ListItem() {Row(){Text(task.name).fontSize(20)}.justifyContent(FlexAlign.SpaceBetween)}.swipeAction({end:this.deleteButton(index)})},item => ''+item.name)

6、遇到的坑

在做的过程中,最开始Task的name,id等都是一样的,然后,导致处理ListItem各种异常,应该是复用刷新机制的问题。后来处理成name不一样,并且将name设置为ListItem的keyGenerator。这个字段我理解为原生开发的复用ID。因为每个task的id一样导致ListItem没有刷新。这个待后期学习验证。

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

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

相关文章

【AUTOSAR】【通信栈】Mirror

AUTOSAR专栏——总目录-CSDN博客文章浏览阅读339次。本文主要汇总该专栏文章,以方便各位读者阅读。https://blog.csdn.net/qq_42357877/article/details/132072415?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132072415%22…

EDT:On Efficient Transformer-Based Image Pre-training for Low-Level Vision

EDT:On Efficient Transformer-Based Image Pre-training for Low-Level Vision 论文地址:On Efficient Transformer-Based Image Pre-training for Low-Level Vision 代码地址:fenglinglwb/EDT: On Efficient Transformer-Based Image Pre…

Web UI 自动化 元素定位利器

序 元素定位,对于 Web UI 自动化而言,绝对是大家成长道路上的一道绊脚石。 很多初学者,都“死”在了元素定位上,从而失去了学习的兴趣。导致职业规划不得不半途而废~ 那么,今天,我们就使用 Katalon Stu…

datav-实现轮播表,使用updateRows方法-无缝衔接加载数据

前言 最近在做大屏需求的时候,遇到一个轮播数据的需求,查看datav文档发现确实有这个组件 但这个组件只提供了一次加载轮播的例子,虽然提供了轮播加载数据updateRows方法 但是文档并没有触发事件,比如轮播完数据触发事件&#xf…

设计模式02创建者模式

创建者模式 参考网课:黑马程序员Java设计模式详解 博客笔记 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。 创建型模式分为&#…

【分治】循环赛日程表Python实现

文章目录 [toc]问题描述分治算法示例Python实现 无运动员数量约束循环赛日程表算法示例Python实现 问题描述 设有 n 2 k n 2^{k} n2k个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表 每个选手必须与其他 n − 1 n - 1 n−1个选手各赛一次每个选手一天…

域渗透之影子凭证 滥用密钥信任账户映射进行账户接管

关注公众号回复20231110获取最新网络安全以及内网渗透等资料。 什么是 PKINIT? 在 Kerberos 身份验证中,客户端必须在 KDC为其提供票证授予票证 (TGT) 之前执行“预验证”,该票证随后可用于获取服务票证。预认证的原因是,没有它&…

Linux上进行Nacos安装

Nacos安装指南 仅供参考,若有错误,欢迎批评指正! 后期会继续上传docker安装nacos的过程! 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面,提供有下载链接,可以下载编译好…

PP和PVC可以相互粘接吗?

PP(聚丙烯)和PVC(聚氯乙烯)是两种不同类型的塑料,它们的化学性质和表面特性不同,因此直接的粘接会比较困难。这是因为它们的分子结构和化学成分不太相容,不易产生牢固的粘接。通常情况&#xff…

电路中各种接地的用途和含义

在电路设计中,地这个概念是十分重要的,它是整个电路中的参考地点,同时也是信号回流的路径。 我们经常见到有各种地,比如什么数字地、模拟地、信号地,它们在电路中都有什么含义?都是用在哪里?下面…

SpringBoot热部署

SpringBoot热部署 借鉴链接&#x1f517;&#xff1a;SpringBoot中的热部署 添加devtools依赖和pom插件 <!-- devtools 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId&…

【算法题】数字字符串组合倒序 (js)

解法&#xff1a; const str "I am an 20-years out--standing * -stu- dent";function solution(str) {const arr str.split(" ");const newArr arr.map((str) > {if (/[a-zA-Z0-9-]/.test(str)) {if (/-{2}/g.test(str)) {return str.replace(/-…