news 2026/7/5 8:29:09

open harmony 项目实战:用 ArkTS 实现诗词收藏和阅读历史

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
open harmony 项目实战:用 ArkTS 实现诗词收藏和阅读历史

open harmony 项目实战:用 ArkTS 实现诗词收藏和阅读历史

收藏和阅读历史是学习类 App 中非常常见的功能。用户看到喜欢的诗词,希望可以收藏;读过的内容,也希望能在“我的”页面看到记录。

在“语文视界”项目中,我把这部分逻辑放在PoetryViewModel.ets中,页面只负责展示和触发操作。这样做的好处是业务逻辑更集中,后续维护也更轻松。❤️

一、为什么用 ViewModel 管收藏和历史

如果把收藏逻辑写在诗词列表、诗词详情、首页推荐等多个页面里,会出现很多重复代码:

  • 收藏 id 怎么保存?
  • 取消收藏怎么处理?
  • 列表里的收藏状态怎么同步?
  • 阅读历史怎么去重?
  • 历史记录最多保存多少条?

所以项目选择让PoetryViewModel管这些业务。

二、核心字段

exportclassPoetryViewModel{privatefavoriteIds:number[] = [];privatereadHistoryIds:number[] = [];privatepoetryCache:Map<number,Poetry> =newMap<number,Poetry>(); }

这里没有保存完整诗词对象,而是保存 id 列表。真正展示时,再通过缓存找到对应诗词。

这种方式更轻,也更容易处理数据更新。

三、构建诗词缓存

项目启动时会构建一个Map缓存:

privatebuildCache():void{for(constpoetry of POETRY_DATA) {this.poetryCache.set(poetry.id, poetry); } }

后续通过 id 查询诗词时,就不用每次遍历完整数组了。

四、收藏数据如何保存

收藏列表通过AppStorage保存为 JSON 字符串:

privateloadFavorites():void{conststored = AppStorage.get<string>('poetry_favorites');if(stored) {try{this.favoriteIds = JSON.parse(stored); }catch{this.favoriteIds = []; } } }privatesaveFavorites():void{ AppStorage.setOrCreate('poetry_favorites', JSON.stringify(this.favoriteIds)); }

这里加了try/catch,防止存储内容异常导致页面崩溃。

五、切换收藏状态

收藏和取消收藏使用同一个方法:

publictoggleFavorite(id: number): boolean {constindex =this.favoriteIds.indexOf(id);if(index > -1) {this.favoriteIds.splice(index,1);this.saveFavorites();returnfalse; }else{this.favoriteIds.push(id);this.saveFavorites();returntrue; } }

返回值表示切换后的收藏状态。页面拿到返回值后,就可以马上更新 UI。

六、详情页如何使用

诗词详情页只需要调用:

privatetoggleFavorite(): void {this.isFavorite = poetryViewModel.toggleFavorite(this.poetryId); }

页面不需要知道收藏数据到底存在什么地方,也不需要关心 JSON 序列化。

七、首页推荐里的收藏同步

首页推荐和热门诗词列表也能切换收藏。切换后,需要同步更新当前列表中的对象:

privatetoggleFavorite(poetryId:number):void{constresult = poetryViewModel.toggleFavorite(poetryId);constinRec =this.recommendedPoetry.find(p=>p.id=== poetryId);if(inRec) { inRec.isFavorite= result; }this.favoriteCount= poetryViewModel.getFavoriteCount(); }

这样用户点了爱心后,当前页面能立即反馈。

八、阅读历史如何维护

阅读历史的逻辑比收藏多一步:同一首诗重复阅读时,要移到最前面,而不是重复插入。

publicaddToReadHistory(id: number): void {constindex =this.readHistoryIds.indexOf(id);if(index > -1) {this.readHistoryIds.splice(index,1); }this.readHistoryIds.unshift(id);if(this.readHistoryIds.length >50) {this.readHistoryIds =this.readHistoryIds.slice(0,50); }this.saveReadHistory(); }

这里还限制最多保存 50 条,避免历史列表无限增长。

九、我的页面如何展示数据

MyPage会读取收藏数、阅读历史数和学习天数:

privateloadStats(): void {this.favoriteCount = poetryViewModel.getFavoriteCount();this.readHistoryCount = poetryViewModel.getReadHistoryCount();conststreak = AppStorage.get<number>('learn_streak');this.currentStreak = streak !== undefined ? streak :0; }

这就形成了一个简单的数据看板,让用户能看到自己的学习积累。

十、可以继续优化的地方

后续可以考虑:

  • 收藏列表支持排序。
  • 阅读历史支持清空。
  • 收藏数据迁移到持久化数据库。
  • 收藏和历史支持备份恢复。
  • 添加“最近阅读”快捷入口。

总结

收藏和阅读历史看似简单,但真正写起来要考虑数据保存、状态同步、重复阅读、异常兜底和页面展示。

在这个项目中,我用PoetryViewModel + AppStorage + id 列表实现了一个轻量但完整的方案,很适合本地学习类 OpenHarmony App 使用。🌟

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 9:57:13

基于51/STM32单片机温湿度控制系统设计大棚检测成品恒温恒湿光照44(设计源文件+万字报告+讲解)(支持资料、图片参考_相

基于51/STM32单片机温湿度控制系统设计大棚检测成品恒温恒湿光照44(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相 温湿度检测和温湿度控制的区别&#xff1a;温湿度检测&#xff1a; 对当前环境的温湿度采集温湿度控制&#xff1a;温度高继电器1闭合开启加热片温…

作者头像 李华
网站建设 2026/7/4 4:06:26

JavaScript Promise详解

JavaScript Promise详解&#xff1a;从异步困境到优雅解决方案引言&#xff1a;异步编程的演进之路在JavaScript的世界中&#xff0c;异步编程一直是开发者必须面对的核心挑战。从最初的回调函数&#xff08;Callback&#xff09;到Promise对象&#xff0c;再到async/await语法…

作者头像 李华
网站建设 2026/7/4 10:28:03

Grid布局开发实践

Grid布局开发实践&#xff1a;构建现代网页的基石在网页设计的演进历程中&#xff0c;布局技术始终是前端开发的核心挑战之一。从早期的表格布局到浮动定位&#xff0c;再到Flexbox&#xff0c;每一次技术革新都让开发者们离“完美布局”更近一步。而CSS Grid布局的出现&#x…

作者头像 李华
网站建设 2026/7/3 22:10:02

C++虚函数工作原理

虚函数&#xff1a;C多态性的运行机制与实现原理在面向对象编程领域&#xff0c;多态性是一个核心概念&#xff0c;它允许我们使用统一的接口处理不同类型的对象。C通过虚函数机制实现了运行时多态&#xff0c;这种机制不仅是C面向对象编程的基石&#xff0c;也是理解C对象模型…

作者头像 李华
网站建设 2026/7/4 0:51:20

Angular基础开发教程

Angular基础开发教程&#xff1a;构建现代化Web应用的起点Angular作为当今最流行的前端框架之一&#xff0c;以其强大的功能和完整的生态系统&#xff0c;成为众多开发者构建企业级Web应用的首选。本文将带你从零开始&#xff0c;系统学习Angular的基础开发知识&#xff0c;为你…

作者头像 李华
网站建设 2026/7/5 14:17:39

阅读APP书源配置终极指南:一键解锁全网小说库的完整教程

阅读APP书源配置终极指南&#xff1a;一键解锁全网小说库的完整教程 【免费下载链接】Yuedu &#x1f4da;「阅读」自用书源分享 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 还在为找不到想看的免费小说而烦恼吗&#xff1f;想要一个纯净无广告的阅读体验&…

作者头像 李华