HarmonyOS 状态管理-任务统计案例

HarmonyOS 的状态管理在开发应用中起到了关键作用,特别是当涉及到动态更新和响应式视图时。以下是一个基于 HarmonyOS 状态管理的任务统计案例的概述:

案例背景

假设我们正在开发一个任务管理应用,其中包含一个任务列表,每个任务都有一个进度条来显示其完成度。我们需要使用 HarmonyOS 的状态管理功能来确保当任务进度更新时,进度条也能实时更新。先看下效果图如下

Screen-2024-05-22-113416(1)

代码介绍

我们先创建一个任务类

// 任务类
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 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')
}


@Entry
@Component
struct PropPage {
  // 总任务数量
  @State totalTask: number = 0
  // 已完成任务数量
  @State finishTask: number = 0
  // 任务数组
  @State tasks: Task[] = [];

  handleTaskChange(){
    //2、更新任务总数量
    this.totalTask = this.tasks.length
    //2、更新已完成任务数量
    this.finishTask = this.tasks.filter(item=>item.finished).length
  }

  build() {
      Column({space:10}) {
        // 1.任务进度卡片
        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)
        // 2.新增任务按钮

        Button('新增任务')
          .width(200)
          .onClick(()=>{
            //1.新增任务数据
            this.tasks.push(new Task())
            //2、更新任务总数量
            this.handleTaskChange()
          })

        // 3.任务列表
        List({space:10}){
          ForEach(
            this.tasks,
            (item : Task,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)


      }
      .width('100%')
      .height('100%')
    .backgroundColor('#F1F2F3')
  }
  @Builder DeleteButton(index:number){
    Button(){
      Text('删除')
        .fontColor(Color.White)

    }
    .width(40)
    .height(40)
    .type(ButtonType.Circle)
    .backgroundColor(Color.Red)
    .margin(5)
    .onClick(() =>{
      this.tasks.splice(index,1)
      this.handleTaskChange()
    })
  }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值