摘要:本文深入探讨了在ArkTS严格模式下,如何通过class + 默认值的方式构建稳定的业务实体模型。以羽球联盟项目为例,详细分析了ArticlePlayerSportEvent等核心实体的建模策略,重点阐述了本地Resource与远程URL并存的设计思路,以及ContentBlock块级建模如何简化页面渲染逻辑。文章旨在帮助开发者建立“模型先行”的思维,通过集中约束实体边界、默认值和数据来源,有效控制复杂度外溢,确保页面层长期稳定可维护。

文章导读

  • ArkTS 严格模式下,用 class + 默认值 承载业务实体,比到处写对象字面量更稳。

  • ArticleEquipmentPlayerSportEvent 共用一套建模约束,页面层只管渲染和交互。

  • 本地 Resource 与远程 URL 并存,能同时兜住离线内置数据和联网抓取数据。

页面效果

这一层的好坏,最终会直接反映到页面是否稳定。球员动态页要能直接读取头像、简介、点赞数和关注态;资讯详情页要能顺着正文块类型渲染文本、单图和图集,而不是在页面里到处做空判断。

player-feed

article-detail

实战拆解

很多项目在刚开始时会把模型写得很轻,只保留几个必填字段,等到页面增多后再补字段、补默认值、补兜底逻辑。这样短期看起来快,后面却会把判断逻辑摊到每个页面和组件里。羽球联盟没有走这条路,而是先在 common 层把几个核心实体的边界定清楚。

这里最关键的不是“字段多不多”,而是字段的职责要稳定。比如 Article 既要服务本地内置资讯,也要服务联网抓取资讯,所以 cover: ResourcecoverUrl?: string 会同时存在;ContentBlock 则把正文拆成 text / image / gallery 三种块,让详情页可以按块分发渲染,不需要把正文当成一大段字符串硬塞进页面。

同样的思路也体现在 PlayerSportEvent 这些实体上。球员动态页直接消费头像、简介、统计字段;赛事列表直接消费赛事名称、时间、状态和赛程数组。模型先约束清楚,页面层就能保持很薄。

关键代码

export class ContentBlock {
  type: ContentBlockType = 'text';
  text?: string;
  image?: Resource;
  images?: Resource[];
  caption?: string;
  imageUrl?: string;
  imageUrls?: string[];
}
export class Article {
id: string = '';
title: string = '';
cover: Resource = $r('app.media.startIcon');
tag: string = '';
tagColor: string = '#0F7B5F';
author: string = '';
publishTime: string = '';
readCount: number = 0;
summary: string = '';
content: ContentBlock[] = [];
related?: RelatedVideo[];
category: 'event' | 'equipment' | 'skill' = 'event';
coverUrl?: string;
source?: string;
url?: string;
}

这段代码真正解决的问题有两个:第一,页面拿到模型后可以立即渲染,默认值把大量 undefined 分支提前消化掉;第二,本地资源和远程内容共存时,不必为了适配某一类数据源去重写整套页面逻辑。

取舍分析

这里更像是在“模型集中约束”和“页面自由发挥”之间做取舍。模型层把默认值、类型和兜底字段先定义好,会多写一些代码,但它换来的收益很直接:详情页、卡片组件、收藏页、历史页都能复用同一批实体,不会每多一个页面就复制一份轻微不同的数据结构。

ResourceURL 双字段看上去有点重复,其实是在承认真实数据来源并不统一。本地演示数据需要直接引用资源,联网抓取又可能只给封面链接,统一塞成一个字段反而会让渲染层更混乱。把差异收口在模型里,比把差异扩散到每个页面里更可控。

设计落点

  • 业务实体全部落到 common 层,组件和页面只消费实体,不重新发明结构。
  • 默认值优先在模型层解决,避免页面渲染时充满空值分支。
  • ContentBlock 负责描述正文块类型,详情页只负责根据类型分发 UI。
  • 本地资源与远程链接并存时,优先把兼容逻辑收在模型里,而不是散落到多个页面。

易踩坑

  • 不要把函数、UIContext 或运行时对象塞进实体模型,否则持久化和跨模块传递都会变得别扭。
  • 不要为了“纯粹”只保留一种封面字段。真实项目里,本地资源和远程数据并存是常态。
  • ContentBlock 一旦开始支持图集、视频、引用块,最好继续沿用块级建模,不要退回长字符串拼接。

验证方式

  • Article 增加一个可选字段,确认老数据仍能渲染,不需要回填全部 mock 数据。
  • 分别打开本地资讯详情页和联网资讯详情页,确认封面和正文块都能被兜住。
  • 在球员动态页和赛事页同时使用实体模型,检查统计字段、头像和状态标签是否正常显示。

参考资料

  • [学习 ArkTS 语言(官方文档)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-more-cases-V5)
  • [资源分类与访问(官方文档)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/resource-categories-and-access)

小结

这篇最值得带走的不是某个字段名字,而是建模顺序:先把实体边界、默认值和资源来源说明白,再去写页面。这样做的好处是,后续不管继续加收藏、历史、搜索还是远程抓取,页面层都能保持稳定,复杂度不会一路外溢。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐