鸿蒙应用入门级开发者认证实验八(点餐)

举报
黄生 发表于 2025/12/26 11:04:21 2025/12/26
【摘要】 一些项目的目录结构基于MVVM(Model-View-ViewModel)模式设计。📂 1. entryability(Ability层)处理应用生命周期和系统交互,继承UIAbility的类(如EntryAbility),实现onCreate/onWindowStageCreate等生命周期方法,通过windowStage.loadContent()加载UI页面// DetailsAbi...

一些项目的目录结构基于MVVM(Model-View-ViewModel)模式设计。

📂 1. entryability(Ability层)处理应用生命周期和系统交互,继承UIAbility的类(如EntryAbility),实现onCreate/onWindowStageCreate等生命周期方法,通过windowStage.loadContent()加载UI页面

// DetailsAbility.ets
export default class DetailsAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.loadContent("pages/DetailsPage"); // 加载页面
  }
}

📂 2. pages(页面层)定义具体页面的UI结构和布局。使用@Entry@Component装饰的页面组件,通过ArkUI声明式语法构建界面(如Column/List等组件),调用view中的可复用组件

// DetailsPage.ets
@Entry @Component
struct DetailsPage {
  build() {
    Column() {
      PreviewerComponent()  // 来自view目录的组件
      BottomBarComponent()   // 来自view目录的组件
    }
  }
}

📂 3. view(视图组件层)封装可复用的UI组件,无状态的自定义组件(如ClassifyItem/CourseItem),纯UI渲染逻辑,不处理业务数据,通过参数接收数据(如classifyName/isSelected),组件可在多个页面复用

**📂 4. **viewmodel(业务逻辑层)管理数据和业务逻辑。数据获取(如网络请求loadDetails())、状态管理(如购物车数据/用户信息)、数据处理(过滤/排序等)。viewmodel可独立单元测试

提供数据
用户操作事件
调用
viewmodel
pages
网络模块/数据库
entryability → 初始化应用
    ↓
pages → 组合view组件
    ↓ 双向绑定
viewmodel → 处理数据

💡 这种结构在华为官方示例(如MultiShopping项目)中被广泛采用,尤其适合中大型项目。小型项目可简化合并viewpages,但保持viewmodel分离仍是最佳实践。

点餐结算支付项目源码

ets

├─common
│      CommonConstants.ets
│
├─entryability
│      EntryAbility.ets
│
├─entrybackupability
│      EntryBackupAbility.ets
│
├─entryformability
│      EntryFormAbility.ets
│
├─order
│  └─pages
│          OrderCard.ets
│
├─orderability
│      OrderAbility.ets
│
├─pages
│      Index.ets
│      Login.ets
│      Pay.ets
│
├─payability
│      PayAbility.ets
│
├─view
│      ClassifyItem.ets
│      FoodItem.ets
│      LoginInfoView.ets
│      MineView.ets
│      OrderView.ets
│      PayView.ets
│
└─viewmodel
        ClassifyModel.ets
        FoodData.ets
        FoodModel.ets
        MainViewModel.ets

主脉络

  1. 用户流程模块(核心路径)

    • Login.etsIndex.etsOrderView.ets/Pay.ets
    • 对应能力:EntryAbility.ets(主入口)→ OrderAbility.ets(订单)→ PayAbility.ets(支付)
  2. 业务能力层

    • orderability/OrderAbility.ets:订单处理能力
    • payability/PayAbility.ets:支付能力
    • entryformability/EntryFormAbility.ets:服务卡片能力(扩展功能)
  3. 数据管理层

    • viewmodel/ 目录:
      • FoodModel.ets(菜品数据)
      • ClassifyModel.ets(分类数据)
      • MainViewModel.ets(全局状态)

**✅ **第一优先级(核心流程)

文件路径 作用 关联文件
pages/Index.ets 首页入口 view/FoodItem.ets(菜品展示)
pages/Login.ets 登录认证 view/LoginInfoView.ets
view/OrderView.ets 订单界面 order/pages/OrderCard.ets
pages/Pay.ets 支付页面 view/PayView.ets
viewmodel/MainViewModel.ets 全局数据枢纽 所有视图组件

**⚠️ **第二优先级(支撑模块)

文件路径 作用
viewmodel/FoodModel.ets 菜品数据逻辑
viewmodel/ClassifyModel.ets 分类管理
view/FoodItem.ets 单菜品UI组件
view/ClassifyItem.ets 分类导航组件

后续扩展

  • EntryBackupAbility.ets:跨设备迁移能力
  • entryformability/:服务卡片相关
  • common/CommonConstants.ets:常量定义

代码建议

  1. 纵向穿透式阅读(核心路径) 按用户操作流:Login.ets → 登录后跳转Index.ets → 下单触发OrderView.ets → 支付调用Pay.ets

  2. 横向关联分析

    • Index.ets中查看如何调用:

      // 典型调用示例
      FoodItem({ foodData: foodModel.currentFood })
      ClassifyItem({ categories: classifyModel.categories })
      
    • OrderView.ets中观察数据绑定:

      // 订单数据来源
      OrderCard({ order: mainViewModel.currentOrder })
      
  3. 关键切入点

    • 全局状态:优先阅读MainViewModel.ets中的@State@Link变量
    • 跨模块通信:检查OrderAbility.etsPayAbility.etsstartAbilityForResult()调用

Index.ets开始逐层调试,使用console.log()输出MainViewModel状态变化,再逐步深入支付等复杂模块。遇到跨能力调用时,优先阅读EntryAbility.ets中的路由逻辑。

以上每个Ability独立占用目录,可能因为Ability作为鸿蒙应用的基本执行单元(如入口、订单、支付),每个都代表独立功能模块。独立目录强制物理隔离,避免代码耦合,符合“高内聚、低耦合”原则。例如支付能力 (PayAbility) 的修改不会意外影响订单模块 (OrderAbility),提升系统稳定性。

若需复用公共逻辑(如网络请求工具):创建共享目录如 common/utils 存放公共代码,通过导入机制引用:

// 在PayAbility.ets中复用工具
import { httpRequest } from '../../common/utils/NetUtil'
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。