【共创季稿事节】待办清单应用开发实战:ArkTS 列表渲染与状态管理深度解析
一、引言待办清单Todo List是前端开发领域的Hello World几乎所有现代前端框架的官方教程都会以它作为入门案例。这并非偶然——Todo List 虽小却涵盖了前端开发中最核心的三大能力列表渲染将数据数组映射为 UI 元素状态管理添加、删除、修改数据后自动更新视图用户交互输入框、按钮、复选框的协同工作本文将通过构建一个完整的待办清单应用深入讲解 ArkTS 中列表渲染与状态管理的原理与实践。二、需求规格2.1 功能清单功能 描述 优先级查看清单 显示所有待办事项列表 P0添加事项 通过输入框和按钮添加新待办 P0标记完成 通过复选框切换待办的完成状态 P0删除事项 一键删除不再需要的待办 P0完成统计 显示总数量和已完成数量 P12.2 数据模型每一条待办事项需要包含以下三个字段interface Todo {id: number; // 唯一标识text: string; // 待办内容done: boolean; // 是否完成}三、ArkTS 中的列表渲染3.1 ForEach 基础用法在 ArkTS 中列表渲染通过 ForEach 组件实现。它的基本语法是ForEach(arr: any[], // 数据源数组itemGenerator: (item, index) void, // 子组件生成函数keyGenerator?: (item, index) string // 唯一键生成函数可选)在我们的待办清单中List() {ForEach(this.todos, (todo: Todo, index: number) {ListItem() {// 每个待办项的 UI}})}3.2 keyGenerator 的重要性keyGenerator 虽然标记为可选参数但在实际开发中强烈建议提供。它的作用是帮助 ArkUI 框架在列表更新时精确追踪每个元素实现高效的 DOM Diff。ForEach(this.todos, (todo: Todo) {ListItem() { … }}, (todo: Todo) todo.id.toString())如果不提供 keyGenerator框架会使用数组索引作为默认键。这在以下场景会导致严重的渲染错误删除列表中间的某个元素时后续元素会因为索引变化而重新创建复选状态可能会错位动画过渡异常3.3 List 组件的特性ArkTS 的 List 组件专为滚动列表设计具备以下特性虚拟列表Virtual List对于长列表只渲染可视区域内的元素大幅提升性能弹性滚动Bounce Effect在列表边界提供回弹效果滑动操作支持滑动删除等高级交互在待办清单中我们使用 List → ListItem → ForEach 的经典三层结构List() {ForEach(this.todos, (todo: Todo, index: number) {ListItem() {// 待办项内容}})}.layoutWeight(1) // 占据剩余空间.width(‘100%’)四、状态管理深入分析4.1 State 的反应式边界在 ArkTS 中State 装饰器为变量建立了反应式边界Reactive Boundary。当 State 变量的值发生变化时框架会自动收集依赖于该变量的 UI 组件并在下一个帧周期进行重新渲染。但在操作对象数组时有一个常见的陷阱错误示范// 直接修改数组元素属性——可能不会触发 UI 更新let todo this.todos[index];todo.done true;正确做法// 通过数组索引直接修改——ArkTS 可以追踪this.todos[index].done true;在 ArkTS 中, State 对数组的监听是浅监听Shallow Watch。直接通过索引修改数组元素内部的属性是支持的框架会追踪数组元素的变更但替换整个数组对象也会触发更新。4.2 添加待办Button(‘添加’).onClick(() {let txt this.inputText.trim();if (txt) {this.todos.push({ id: this.nextId, text: txt, done: false });this.inputText ‘’;}})这里有一个容易被忽略的细节在添加待办之前先对输入文本进行 trim() 操作去除首尾空白。如果用户只输入了空格txt 为空字符串if (txt) 判断会阻止添加空待办。4.3 删除待办Button(‘’).onClick(() {this.todos.splice(index, 1);})使用 Array.splice(index, 1) 删除指定索引的元素。splice 是原地操作In-place Operation会直接修改原数组。ArkTS 的 State 能够监听到 splice 操作并触发 UI 更新。4.4 切换完成状态Toggle({ type: ToggleType.Checkbox, isOn: todo.done }).onChange((v: boolean) {this.todos[index].done v;})Toggle 组件的 onChange 回调返回当前的选中状态 v。我们将这个值直接赋给对应待办的 done 属性。五、UI 实现细节5.1 待办项的视觉状态已完成和未完成的待办项在视觉上应有明显区分Text(todo.text).fontSize(16).decoration({type: todo.done ? TextDecorationType.LineThrough : TextDecorationType.None}).fontColor(todo.done ? ‘#AAAAAA’ : ‘#333333’)通过 decoration 属性为已完成待办添加删除线LineThrough同时将字体颜色变为灰色。这种视觉变化给用户提供了即时的完成反馈。5.2 统计信息Text(‘总计: ’ this.todos.length)Text(’ 已完成: ’ this.todos.filter(t t.done).length)实时更新的统计信息让用户对整个清单的状态一目了然。filter 方法筛选出所有 done 为 true 的待办再取 length 得到已完成数量。六、常见陷阱与解决方案6.1 列表未更新如果修改待办后列表没有刷新请检查是否使用了 State 装饰器是否直接修改了数组而不是替换ForEach 是否提供了 keyGenerator6.2 删除后状态错乱如果在 ForEach 中没有提供 keyGenerator删除元素后可能出现复选框状态错位的问题。这通常表现为删除了第二项但原来第三项的复选框被标记为已完成。解决方案始终为 ForEach 提供稳定的 keyGenerator使用数据的唯一标识如 todo.id作为键。七、扩展思路本地持久化使用 Preferences API 保存待办数据分类分组按完成状态或标签对清单进行分组拖拽排序使用 onDrag 和 onDrop 事件实现拖拽排序日历集成为待办设置截止日期待办清单虽小但它代表了 CRUDCreate, Read, Update, Delete类应用的基础范式。掌握它你就掌握了绝大多数信息管理类应用的核心模式。

相关新闻

C# 自定义特性(Attribute)+ 反射读取特性 +WinForm 自定义控件常用特性

C# 自定义特性(Attribute)+ 反射读取特性 +WinForm 自定义控件常用特性

一、核心概念1. 什么是特性特性(Attribute)是 标记代码元素的描述信息(类、方法、字段、属性)。作用:给代码附加额外元数据,编译时标记、运行时通过反射读取,实现扩展功能。系统自带特性&#x…

2026/7/5 14:12:32阅读更多 →
C++语言基础4:例程讲解(结合在QT的应用)

C++语言基础4:例程讲解(结合在QT的应用)

我们从最基础的语法、每个关键字 / 符号的含义、每一行的执行逻辑逐句拆解&#xff0c;全程用新手能理解的表述&#xff0c;你可以对着代码一行一行看。例程如下&#xff1a;void TemperatureBar::update_data(int base_address, const QVector<quint16> &value) {Q_…

2026/7/5 14:12:32阅读更多 →
B11:AI 时代怎么跨部门协作?我用 4 步说服了销售、HR、IT 一起推 AI

B11:AI 时代怎么跨部门协作?我用 4 步说服了销售、HR、IT 一起推 AI

文章目录 B11:AI 时代怎么跨部门协作?我用 4 步说服了销售、HR、IT 一起推 AI 🎯 开篇:我做了一个 AI 工具,演示给销售总监看,他说了一句话 一、那天晚上,我想通了一件事 二、AI 时代,跨部门协作为什么变难了? 2.1 第一个难:AI 是"全公司的事",不是"…

2026/7/5 14:07:32阅读更多 →
SARSteer: Safeguarding Large Audio Language Models via Safe-Ablated Refusal Steering

SARSteer: Safeguarding Large Audio Language Models via Safe-Ablated Refusal Steering

文章核心总结与翻译 一、主要内容 本文聚焦大型音频语言模型(LALMs)的安全对齐问题,针对现有LLM和LVLM安全防御方法直接迁移至LALMs时存在的两大缺陷(音频输入下基于LLM的引导失效、基于提示的防御导致良性查询过度拒绝),提出了首个推理时防御框架SARSteer(Safe-Ablat…

2026/7/5 15:17:44阅读更多 →
Explainability of Large Language Models: Opportunities and Challenges toward Generating Trustwort...

Explainability of Large Language Models: Opportunities and Challenges toward Generating Trustwort...

文章核心总结与创新点 主要内容 文章聚焦大型语言模型(LLMs)的可解释性,围绕局部可解释性和机制可解释性两大核心方向展开。首先梳理了LLMs的发展背景与Transformer架构基础,系统综述了现有局部可解释性(如思维链推理、检索增强生成等)和机制可解释性(如注意力头分析、…

2026/7/5 15:17:44阅读更多 →
用optiland绘制光扇图

用optiland绘制光扇图

文章目录光扇图的基本概念测试RayFan光扇图的基本概念 Ray Fan即光扇图&#xff0c;是光学设计中用于分析一维截面上几何像差的核心工具。与点列图展示二维平面上的光斑分布不同&#xff0c;Ray Fan 将三维的光线追迹结果降维&#xff0c;通过二维曲线直观地展示横向像差&…

2026/7/5 15:17:44阅读更多 →
如何去除 AI 输出文本中带 *、# 的小技巧,选用 AI 导出鸭优化文档导出,结合行业数据根除多余格式符号困扰

如何去除 AI 输出文本中带 *、# 的小技巧,选用 AI 导出鸭优化文档导出,结合行业数据根除多余格式符号困扰

摘要 AI生成内容时常附带星号、井号等markdown标记符号&#xff0c;手动清理耗费大量办公时间。本文围绕去除特殊符号的实用技巧展开&#xff0c;结合市面五种主流文档导出方案横向测评&#xff0c;引用行业白皮书实测数据与业内专家观点&#xff0c;搭配用户实测反馈与问答科普…

2026/7/5 15:17:44阅读更多 →
P1634 禽兽的传染病

P1634 禽兽的传染病

题目背景mxj 的启发。题目描述禽兽患传染病了。一个禽兽会每轮传染 x 个禽兽。试问 n 轮传染后有多少禽兽被传染&#xff1f;输入格式两个非负整数 x 和 n。输出格式一个整数&#xff0c;即被传染的禽兽数。输入输出样例输入 #1复制10 2输出 #1复制121说明/提示保证 x,n 以及答…

2026/7/5 15:17:44阅读更多 →
AsrTools终极指南:5分钟学会高效语音转文字技巧

AsrTools终极指南:5分钟学会高效语音转文字技巧

AsrTools终极指南&#xff1a;5分钟学会高效语音转文字技巧 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text i…

2026/7/5 15:12:37阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述&#xff1a;从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目&#xff0c;叫 skills4/skills &#xff0c;它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景&#xff1a;一个旨在展示或教授某种技能的仓库&#xff0c;本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示&#xff1a;因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战&#xff1a;从“黑箱预测”到“可信推理”2026年6月&#xff0c;第7届机器学习与趋势国际会议&#xff08;MLT 2026&#xff09;将在悉尼召开。会议议程中&#xff0c;“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述&#xff1a;从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目&#xff0c;叫 skills4/skills &#xff0c;它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景&#xff1a;一个旨在展示或教授某种技能的仓库&#xff0c;本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示&#xff1a;因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战&#xff1a;从“黑箱预测”到“可信推理”2026年6月&#xff0c;第7届机器学习与趋势国际会议&#xff08;MLT 2026&#xff09;将在悉尼召开。会议议程中&#xff0c;“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →