基于 Taro v2 的小程序通用列表组件设计及实现方案(1)
前言
在日常前端的开发过程中,可能往往会遇到需要完成列表业务的需求。鉴于不同列表业务的需求大致相同,基本可分为几种常见状态:列表请求 Loading、列表正常渲染、列表加载失败(网络错误、接口错误等)、上滑加载更多数据(没有更多数据、接口错误)、下拉刷新列表等。
1、状态整理
根据不同状态,整理出以下状态类型:
有了以上状态的简单梳理,我们可以很简单的设计出以下组件结构。
2、组件结构
- CommonList.interface.ts - 组件与管理者的相关接口声明
- CommonListManager.ts - 核心状态管理者:负责状态切换的核心逻辑
- CommonList.tsx - 组件:负责渲染视图界面
- CommonList.scss - 样式:负责美化视图界面
3、代码设计
CommonList.interface - 接口相关声明
/** * CommonList.state 参数类型 * * @export * @interface CommonListState */ export interface CommonListState { // 组件当前的状态 status: CommonListStatusEnum; // 组件页脚当前的状态 footerStatus: CommonListFooterStatusEnum } /** * CommonList.props 参数类型 * * @export * @interface CommonListProps */ export interface CommonListProps { // 传递 Manager 并绑定回调函数,分发 render 不同界面(CommonListManager) listManager?: ICommonListManager // 重新加载(刷新) onReload?: () => void } /** * 列表状态枚举 */ export enum CommonListStatusEnum { // 网络错误 CommonListStatusNetworkBrokenEnum = 0, // 服务器错误 CommonListStatusServerErrorEnum, // 加载中 CommonListStatusLoadingEnum, // 空白数据 CommonListStatusEmptyDataEnum, // 正常数据 CommonListStatusNormalEnum } /** * 列表页脚状态枚举 */ export enum CommonListFooterStatusEnum { // 没有更多数据 CommonListFooterStatusRechedToFooterEndEnum, // 加载更多数据 CommonListFooterStatusFooterLoadingEnum, // 正常状态(隐藏) CommonListFooterStatusHiddenEnum } /** * CommonListManager 接口 */ export interface ICommonListManager { // 设置页面状态的 Setter setStatus(status: CommonListStatusEnum): void; // 设置页面状态改变时产生的回调,用于反馈给组件进行 render setPageStatusChangeCallback(callback: (status: CommonListStatusEnum) => void): void; // 更新页面状态的核心逻辑 update(response: ICommonListResult) // 设置页脚状态改变时产生的回调,,用于反馈给组件进行 render setFooterStatusChangeCallback(cb: (status: CommonListFooterStatusEnum) => void); // 是否可以获取更多数据 canFetchMore(): boolean; // 获取页面状态的 Getter getStatus(): CommonListStatusEnum } /** * ICommonListResult 接口 * 声明接口返回的数据格式,此处可以根据自己的业务需求自定义 */ export interface ICommonListResult { // 列表总数据量 total: number; // 每页多少条数据 pageSize: number; // 第几页 page: number; // 当前返回的列表数据长度 listCount: number;
CommonListManager - 核心状态管理者
import { CommonListFooterStatusEnum, CommonListStatusEnum, ICommonListResult, ICommonListManager } from "./CommonList.interface"; export class CommonListManager implements ICommonListManager { // 页面状态 protected pageStatus: CommonListStatusEnum = CommonListStatusEnum.CommonListStatusLoadingEnum // 页脚状态 protected footerStatus: CommonListFooterStatusEnum = CommonListFooterStatusEnum.CommonListFooterStatusHiddenEnum // 列表总数据量 protected total: number; // 每页多少条数据 protected pageSize: number; // 第几页数据 protected page: number; // 页面状态改变回调 protected pageStatusChangeCallback: (status: CommonListStatusEnum) => void // 页脚状态改变回调 protected footerStatusChangeCallback: (status: CommonListFooterStatusEnum) => void /** * 设置页面状态 * @param status 状态 */ setPageStatusChangeCallback(cb: (status: CommonListStatusEnum) => void) { this.pageStatusChangeCallback = cb } /** * 设置页脚状态 * @param status 状态 */ setFooterStatusChangeCallback(cb: (status: CommonListFooterStatusEnum) => void) { this.footerStatusChangeCallback = cb } /** * 设置页面状态 * @param status 页面状态 */ setStatus(status: CommonListStatusEnum): void { this.pageStatus = status // 如果传递了回调函数 if (this.pageStatusChangeCallback) { // 状态改变,产生回调 this.pageStatusChangeCallback(this.pageStatus) } } }
超出字数限制了,代码放不全,第二篇再放
-
Taro
-
Typescript
-
列表组件