README.md

基础层 (core/base)

介绍

@core/base 模块提供应用的基础类和状态管理,包括:

  • ViewModel 基类:统一的 ViewModel 抽象
  • 网络请求 ViewModel:自动化网络请求处理
  • 列表 ViewModel:分页列表数据管理
  • UI 状态管理:标准化的 UI 状态

核心类

BaseViewModel

所有 ViewModel 的基类,提供生命周期管理。

@ObservedV2
export abstract class BaseViewModel {
  /**
   * 页面出现时的生命周期回调
   */
  aboutToAppear(): void {}

  /**
   * 页面即将消失时的生命周期回调
   */
  aboutToDisappear(): void {}
}

BaseNetWorkViewModel

网络请求 ViewModel 基类,自动处理 loading、error、success 状态。

@ObservedV2
export abstract class BaseNetWorkViewModel<T> extends BaseViewModel {
  @Trace uiState: BaseNetWorkUiState = BaseNetWorkUiState.LOADING;
  @Trace data: T | null = null;

  // 子类实现此方法
  protected abstract requestRepository(): Promise<NetworkResult<T>>;

  // 自动执行请求
  executeRequest(): void;

  // 重试请求
  retryRequest(): void;
}

BaseNetWorkListViewModel

分页列表 ViewModel 基类,支持下拉刷新和上拉加载。

@ObservedV2
export abstract class BaseNetWorkListViewModel<T> extends BaseViewModel {
  @Trace uiState: BaseNetWorkUiState = BaseNetWorkUiState.LOADING;
  @Trace dataList: T[] = [];
  @Trace hasMore: boolean = true;

  // 子类实现此方法
  protected abstract requestRepository(page: number, pageSize: number):
    Promise<NetworkResult<NetworkPageData<T>>>;

  // 刷新列表
  refreshList(): void;

  // 加载更多
  loadMore(): void;
}

快速开始

1. 简单数据请求

import { BaseNetWorkViewModel } from "@core/base";
import { NetworkResult } from "@core/network";

@ObservedV2
export class UserViewModel extends BaseNetWorkViewModel<User> {
  private repository: IUserRepository = new UserRepositoryImpl();

  protected requestRepository(): Promise<NetworkResult<User>> {
    return this.repository.getUserInfo("123");
  }
}

2. 分页列表

import { BaseNetWorkListViewModel } from "@core/base";
import { NetworkResult, NetworkPageData } from "@core/network";

@ObservedV2
export class GoodsListViewModel extends BaseNetWorkListViewModel<Goods> {
  private repository: IGoodsRepository = new GoodsRepositoryImpl();

  protected requestRepository(page: number, pageSize: number):
    Promise<NetworkResult<NetworkPageData<Goods>>> {
    return this.repository.getGoodsPage({ page, pageSize });
  }
}

3. 在页面中使用

@Entry
@Component
struct UserPage {
  @Local viewModel: UserViewModel = new UserViewModel();

  build() {
    Column() {
      if (this.viewModel.uiState === BaseNetWorkUiState.LOADING) {
        LoadingView()
      } else if (this.viewModel.uiState === BaseNetWorkUiState.ERROR) {
        ErrorView({ onRetry: () => this.viewModel.retryRequest() })
      } else if (this.viewModel.uiState === BaseNetWorkUiState.SUCCESS) {
        UserInfoView({ user: this.viewModel.data })
      }
    }
  }
}

UI 状态

export enum BaseNetWorkUiState {
  LOADING = 'loading',   // 加载中
  SUCCESS = 'success',   // 成功
  ERROR = 'error',       // 错误
  EMPTY = 'empty'        // 空数据
}

文件结构

core/base/
├── Index.ets                         # 模块导出
├── README.md                         # 本文档
└── src/main/ets/
    ├── viewmodel/
    │   ├── BaseViewModel.ets         # ViewModel 基类
    │   ├── BaseNetWorkViewModel.ets  # 网络请求基类
    │   └── BaseNetWorkListViewModel.ets  # 列表基类
    └── state/
        └── BaseNetWorkUiState.ets    # UI 状态枚举