/** * DbTabList - 通用 Tab 列表组件类型定义 * * 特性: * - 支持多 Tab 数据缓存,避免切换白屏 * - 自动预加载相邻 Tab 数据 * - 内置骨架屏、加载更多、下拉刷新 * - 支持列表布局和瀑布流布局 * - 适用于订单列表、商品列表、分类列表等场景 */ import { ReactNode } from 'react'; import { ViewStyle, StyleProp } from 'react-native'; import type { DbInfiniteListProps } from '../DbInfiniteList'; import type { DbTabProps } from '../DbTab'; /** 布局类型 */ export type LayoutType = 'list' | 'waterfall'; export type TabKey = string | number; export interface TabItem { /** Tab 唯一标识 */ key: TKey; /** Tab 显示标题 */ title: string; /** Tab 额外数据 */ extra?: Record; } /** 列表数据缓存项 */ export interface TabDataCache { /** 列表数据 */ data: T[]; /** 当前页码 */ page: number; /** 是否还有更多 */ hasMore: boolean; /** 加载状态 */ loadingState: 'idle' | 'loading' | 'refreshing' | 'loadingMore' | 'noMore' | 'error'; /** 是否已初始化(加载过数据) */ initialized: boolean; /** 总数量 */ total?: number; } /** 获取列表数据的参数 */ export interface FetchDataParams { /** 当前 Tab key */ tabKey: TKey; /** 当前页码 */ page: number; /** 每页数量 */ pageSize: number; } /** 获取列表数据的返回结果 */ export interface FetchDataResult { /** 列表数据 */ data: T[]; /** 是否还有更多 */ hasMore: boolean; /** 总数量(可选) */ total?: number; } export interface DbTabListProps { /** Tab 配置列表 */ tabs: TabItem[]; /** 当前选中的 Tab key(受控) */ activeKey?: TKey; /** 默认选中的 Tab key(非受控) */ defaultActiveKey?: TKey; /** 默认选中 Tab 的索引(优先级低于 defaultActiveKey) */ initialPage?: number; /** Tab 切换回调 */ onChange?: (key: TKey) => void; /** 获取列表数据的函数 */ fetchData: (params: FetchDataParams) => Promise>; /** 渲染列表项 */ renderItem: (item: T, index: number, tabKey: TKey) => ReactNode; /** 唯一键提取器 */ keyExtractor: (item: T, index: number) => string; /** 每页数量,默认 10 */ pageSize?: number; /** 缓存 Tab 数量(当前选中 Tab 左右的缓存数量),默认 1 */ cacheSize?: number; /** 是否预加载相邻 Tab,默认 true */ preload?: boolean; /** 最大缓存 Tab 数量,默认根据 cacheSize 自动计算 (cacheSize * 2 + 1) */ maxCacheCount?: number; /** 是否使用骨架屏,默认 true */ useSkeleton?: boolean; /** 自定义骨架屏组件 */ skeletonComponent?: ReactNode; /** 骨架屏数量,默认 3(list 模式)或 6(waterfall 模式,每列3个) */ skeletonCount?: number; /** * 骨架屏列数(仅 waterfall 模式有效) * - 如果不提供,默认使用 numColumns * - 用于控制骨架屏的列布局,使其与实际瀑布流布局一致 */ skeletonColumns?: number; /** 空数据组件 */ emptyComponent?: ReactNode; /** 空数据文案 */ emptyText?: string; /** * 布局类型,默认 'list' * - 'list': 列表布局,使用 DbInfiniteList * - 'waterfall': 瀑布流布局,使用 DbItemCard.List */ layoutType?: LayoutType; /** 瀑布流列数(仅 waterfall 模式有效),默认 2 */ numColumns?: number; /** * 获取瀑布流每项高度(仅 waterfall 模式有效) * 如果不提供,将使用卡片固定高度 */ getItemHeight?: (item: T, index: number) => number; /** * 是否自动测量瀑布流项目高度(仅 waterfall 模式有效) * - 当设置为 true 且未提供 getItemHeight 时,组件会自动测量每个项目的实际高度 * - 默认为 false,保持向后兼容 */ autoMeasureHeight?: boolean; /** * 瀑布流默认卡片高度(在未测量完成前使用,仅 waterfall 模式有效) * 当启用 autoMeasureHeight 时,此值作为初始高度 * @default 200 */ defaultCardHeight?: number; /** 瀑布流水平间距(仅 waterfall 模式有效),默认 8 */ itemSpacing?: number; /** 瀑布流垂直间距(仅 waterfall 模式有效),默认 10 */ rowSpacing?: number; /** 瀑布流两侧边距(仅 waterfall 模式有效),默认 12 */ sideSpacing?: number; /** 瀑布流卡片圆角(仅 waterfall 模式有效),默认 12 */ cardBorderRadius?: number; /** 瀑布流是否显示阴影(仅 waterfall 模式有效),默认 true */ cardShadow?: boolean; /** 瀑布流阴影强度(仅 waterfall 模式有效),默认 'sm' */ cardShadowLevel?: 'none' | 'sm' | 'md' | 'lg'; /** TabBar 配置 */ tabProps?: Omit; /** 列表配置(仅 list 模式有效) */ listProps?: Partial, 'data' | 'renderItem' | 'keyExtractor' | 'onRefresh' | 'onLoadMore' | 'hasMore' | 'loadingState' | 'emptyComponent' | 'skeletonComponent'>>; /** * 刷新超时时间(毫秒),默认 15000 * 超过此时间未完成刷新,自动重置刷新状态 */ refreshTimeout?: number; /** 头部组件(在 TabBar 上方) */ headerComponent?: ReactNode; /** 底部组件(在列表下方) */ footerComponent?: ReactNode; /** TabBar 和列表之间的组件 */ tabContentHeader?: ReactNode; /** 容器样式 */ style?: StyleProp; /** TabBar 样式 */ tabBarStyle?: StyleProp; /** 列表容器样式 */ listContainerStyle?: StyleProp; /** 自定义 TabBar */ renderTabBar?: (props: { tabs: TabItem[]; activeKey: TKey; onChange: (key: TKey) => void; }) => ReactNode; /** 数据转换(用于处理接口返回数据格式) */ transformData?: (data: any) => T[]; }