鸿蒙 ArkTS 实战:野餐物品准备的状态建模、算法与交互实现

前言

野餐物品准备用于出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。
项目通过 ArkTSArkUI@State 管理 labels、done。
核心是 平行数组、完成统计和整体重置,默认数据为五项均未准备。
页面展示已准备数量和剩余项目。
在这里插入图片描述
图 1:DevEco Studio 中的 ArkTS 开发环境。

页面结果应能从当前状态完整复算。
边界条件必须落到真实代码路径。
labels 与 done 按索引对应。
本文只讨论源码已实现能力。

一、业务对象

1.1 数据结构

野餐物品准备使用 labels、done 支撑业务对象。
labels 与 done 按索引对应。

1.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

1.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

1.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

业务对象维度 当前实现 作用
状态 labels、done 保存数据
规则 toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论 生成反馈
边界 平行数组、完成统计和整体重置 保护结果
结果 已准备数量和剩余项目 呈现结论

二、状态字段

2.1 数据结构

野餐物品准备使用 labels、done 支撑状态字段。
完成数实时派生。

2.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

2.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

2.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

三、核心规则

3.1 数据结构

野餐物品准备使用 labels、done 支撑核心规则。
重新准备恢复全部 false。

3.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

3.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

3.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

  1. 读取输入。
  2. 执行业务规则。
  3. 处理边界。
  4. 刷新界面。

四、输入控件

4.1 数据结构

野餐物品准备使用 labels、done 支撑输入控件。
labels 与 done 按索引对应。

4.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

4.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

4.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

输入控件维度 当前实现 作用
状态 labels、done 保存数据
规则 toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论 生成反馈
边界 平行数组、完成统计和整体重置 保护结果
结果 已准备数量和剩余项目 呈现结论

五、事件回调

5.1 数据结构

野餐物品准备使用 labels、done 支撑事件回调。
完成数实时派生。

5.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

5.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

5.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

六、边界保护

6.1 数据结构

野餐物品准备使用 labels、done 支撑边界保护。
重新准备恢复全部 false。

6.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

6.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

6.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

  • 野餐物品准备保存真实状态。
  • count参与核心逻辑。
  • 已准备数量和剩余项目形成反馈。
  • 平行数组、完成统计和整体重置保护输出。

七、状态反馈

7.1 数据结构

野餐物品准备使用 labels、done 支撑状态反馈。
labels 与 done 按索引对应。

7.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

7.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

7.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

八、默认运行

8.1 数据结构

野餐物品准备使用 labels、done 支撑默认运行。
完成数实时派生。

8.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

8.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

8.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

默认运行维度 当前实现 作用
状态 labels、done 保存数据
规则 toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论 生成反馈
边界 平行数组、完成统计和整体重置 保护结果
结果 已准备数量和剩余项目 呈现结论

九、连续操作

9.1 数据结构

野餐物品准备使用 labels、done 支撑连续操作。
重新准备恢复全部 false。

9.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

9.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

9.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

  1. 读取输入。
  2. 执行业务规则。
  3. 处理边界。
  4. 刷新界面。

十、数组或数值更新

10.1 数据结构

野餐物品准备使用 labels、done 支撑数组或数值更新。
labels 与 done 按索引对应。

10.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

10.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

10.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

十一、声明式刷新

11.1 数据结构

野餐物品准备使用 labels、done 支撑声明式刷新。
完成数实时派生。

11.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

11.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

11.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

  • 野餐物品准备保存真实状态。
  • count参与核心逻辑。
  • 已准备数量和剩余项目形成反馈。
  • 平行数组、完成统计和整体重置保护输出。

十二、布局结构

12.1 数据结构

野餐物品准备使用 labels、done 支撑布局结构。
重新准备恢复全部 false。

12.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

12.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

12.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

布局结构维度 当前实现 作用
状态 labels、done 保存数据
规则 toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论 生成反馈
边界 平行数组、完成统计和整体重置 保护结果
结果 已准备数量和剩余项目 呈现结论

十三、颜色语义

13.1 数据结构

野餐物品准备使用 labels、done 支撑颜色语义。
labels 与 done 按索引对应。

13.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

13.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

13.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

十四、异常输入

14.1 数据结构

野餐物品准备使用 labels、done 支撑异常输入。
完成数实时派生。

14.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

14.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

14.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

十五、验证场景

15.1 数据结构

野餐物品准备使用 labels、done 支撑验证场景。
重新准备恢复全部 false。

15.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

15.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

15.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

  1. 读取输入。
  2. 执行业务规则。
  3. 处理边界。
  4. 刷新界面。

十六、性能表现

16.1 数据结构

野餐物品准备使用 labels、done 支撑性能表现。
labels 与 done 按索引对应。

16.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

16.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

16.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

性能表现维度 当前实现 作用
状态 labels、done 保存数据
规则 toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论 生成反馈
边界 平行数组、完成统计和整体重置 保护结果
结果 已准备数量和剩余项目 呈现结论

十七、维护方式

17.1 数据结构

野餐物品准备使用 labels、done 支撑维护方式。
完成数实时派生。

17.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

17.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

17.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

十八、代码职责

18.1 数据结构

野餐物品准备使用 labels、done 支撑代码职责。
重新准备恢复全部 false。

18.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

18.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

18.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

  • 野餐物品准备保存真实状态。
  • count参与核心逻辑。
  • 已准备数量和剩余项目形成反馈。
  • 平行数组、完成统计和整体重置保护输出。

十九、运行结论

19.1 数据结构

野餐物品准备使用 labels、done 支撑运行结论。
labels 与 done 按索引对应。

19.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

19.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

19.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

二十、项目启示

20.1 数据结构

野餐物品准备使用 labels、done 支撑项目启示。
完成数实时派生。

20.2 业务规则

toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论
count 及相关表达式承担核心行为。

20.3 交互刷新

控件回调更新状态并显示已准备数量和剩余项目。
ArkUI 根据依赖关系刷新。

20.4 边界结论

平行数组、完成统计和整体重置
结果因此保持稳定。

项目启示维度 当前实现 作用
状态 labels、done 保存数据
规则 toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论 生成反馈
边界 平行数组、完成统计和整体重置 保护结果
结果 已准备数量和剩余项目 呈现结论

二十一、真实源码分段

21.1 源码片段 1

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

21.2 源码片段 2

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

21.3 源码片段 3

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

21.4 源码片段 4

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

21.5 源码片段 5

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

21.6 源码片段 6

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

21.7 源码片段 7

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

21.8 源码片段 8

以下代码来自当前项目。

@Entry @Component struct Index { @State labels:string[]=['野餐垫','饮用水','餐具','垃圾袋','防晒用品'];@State done:boolean[]=[false,false,false,false,false];toggle(i:number):void{this.done[i]=!this.done[i];this.done=this.done.slice()}count():number{return this.done.filter((v:boolean)=>v).length}build(){Column(){Text('野餐物品清单').fontSize(27).fontWeight(FontWeight.Bold).width('100%');Text('出发前逐项确认,避免遗漏必需品').fontColor('#667085').width('100%').margin({top:6,bottom:20});Text(this.count()+'/'+this.labels.length+' 项已准备').fontSize(25).fontWeight(FontWeight.Bold).fontColor('#175CD3').width('100%');ForEach(this.labels,(v:string,i:number)=>{Row(){Checkbox().select(this.done[i]).onChange(()=>this.toggle(i));Text(v).fontSize(17).layoutWeight(1).margin({left:10});Text(this.done[i]?'已准备':'待准备').fontSize(13).fontColor(this.done[i]?'#087443':'#B54708')}.width('100%').padding(15).backgroundColor(this.done[i]?'#F0FAF4':'#FFF8EB').borderRadius(8).margin({top:9})});Text(this.count()===this.labels.length?'全部物品已准备':'还有 '+(this.labels.length-this.count())+' 项待准备').width('100%').textAlign(TextAlign.Center).padding(18).margin({top:16}).backgroundColor('#EEF5FF').borderRadius(9);Button('重新准备').width('100%').margin({top:12}).backgroundColor('#EEF2F6').fontColor('#344054').onClick(()=>this.done=[false,false,false,false,false])}.width('100%').height('100%').padding(22).backgroundColor('#FFFFFF')} }

该片段参与出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品。

二十二、运行案例

22.1 默认数据

使用五项均未准备。
观察 labels、done 与结果文案。
确认已准备数量和剩余项目可复算。

22.2 最小边界

平行数组、完成统计和整体重置
观察 labels、done 与结果文案。
确认已准备数量和剩余项目可复算。

22.3 临界输入

围绕平行数组、完成统计和整体重置验证阈值。
观察 labels、done 与结果文案。
确认已准备数量和剩余项目可复算。

22.4 连续操作

连续执行 count 相关操作。
观察 labels、done 与结果文案。
确认已准备数量和剩余项目可复算。

验证维度 当前实现 作用
状态 labels、done 保存数据
规则 toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论 生成反馈
边界 平行数组、完成统计和整体重置 保护结果
结果 已准备数量和剩余项目 呈现结论

二十三、总结

野餐物品准备使用鸿蒙 ArkTS 完成了“出发前逐项确认野餐垫、饮水、餐具、垃圾袋和防晒用品”闭环。
核心规则是:toggle 翻转索引状态,count 用 filter 统计完成项,全部完成后生成结论。
状态字段为 labels、done。
状态建模业务函数声明式界面 共同保证结果稳定。
labels 与 done 按索引对应。 完成数实时派生。 重新准备恢复全部 false。


相关资源:

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐