You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
301 lines
7.5 KiB
301 lines
7.5 KiB
/**
|
|
* 组件相关类型定义
|
|
*/
|
|
|
|
import { ReactNode, CSSProperties } from 'react';
|
|
|
|
// 基础组件Props类型
|
|
declare namespace ComponentProps {
|
|
/** 基础Props */
|
|
interface Base {
|
|
className?: string;
|
|
style?: CSSProperties;
|
|
children?: ReactNode;
|
|
}
|
|
|
|
/** 可点击组件Props */
|
|
interface Clickable extends Base {
|
|
onClick?: (event?: any) => void;
|
|
disabled?: boolean;
|
|
}
|
|
|
|
/** 表单组件基础Props */
|
|
interface FormItem extends Base {
|
|
label?: string;
|
|
required?: boolean;
|
|
error?: string;
|
|
help?: string;
|
|
}
|
|
|
|
/** 输入组件Props */
|
|
interface Input extends FormItem {
|
|
value?: string;
|
|
defaultValue?: string;
|
|
placeholder?: string;
|
|
disabled?: boolean;
|
|
readonly?: boolean;
|
|
maxLength?: number;
|
|
onChange?: (value: string, event?: any) => void;
|
|
onFocus?: (event?: any) => void;
|
|
onBlur?: (event?: any) => void;
|
|
}
|
|
|
|
/** 选择器组件Props */
|
|
interface Selector<T = any> extends FormItem {
|
|
value?: T;
|
|
defaultValue?: T;
|
|
options: Option<T>[];
|
|
placeholder?: string;
|
|
disabled?: boolean;
|
|
multiple?: boolean;
|
|
onChange?: (value: T, option?: Option<T>) => void;
|
|
}
|
|
|
|
/** 分页组件Props */
|
|
interface Pagination extends Base {
|
|
current: number;
|
|
total: number;
|
|
pageSize?: number;
|
|
showSizeChanger?: boolean;
|
|
showQuickJumper?: boolean;
|
|
showTotal?: boolean;
|
|
onChange?: (page: number, pageSize?: number) => void;
|
|
}
|
|
|
|
/** 表格列定义 */
|
|
interface TableColumn<T = any> {
|
|
key: string;
|
|
title: string;
|
|
dataIndex?: string;
|
|
width?: number | string;
|
|
align?: 'left' | 'center' | 'right';
|
|
fixed?: 'left' | 'right';
|
|
sortable?: boolean;
|
|
filterable?: boolean;
|
|
render?: (value: any, record: T, index: number) => ReactNode;
|
|
}
|
|
|
|
/** 表格组件Props */
|
|
interface Table<T = any> extends Base {
|
|
columns: TableColumn<T>[];
|
|
dataSource: T[];
|
|
rowKey?: string | ((record: T) => string);
|
|
loading?: boolean;
|
|
pagination?: false | Pagination;
|
|
scroll?: { x?: number; y?: number };
|
|
onRow?: (record: T, index: number) => any;
|
|
onChange?: (pagination: any, filters: any, sorter: any) => void;
|
|
}
|
|
|
|
/** 模态框组件Props */
|
|
interface Modal extends Base {
|
|
visible: boolean;
|
|
title?: string;
|
|
width?: number | string;
|
|
closable?: boolean;
|
|
maskClosable?: boolean;
|
|
keyboard?: boolean;
|
|
centered?: boolean;
|
|
destroyOnClose?: boolean;
|
|
footer?: ReactNode | null;
|
|
onOk?: () => void | Promise<void>;
|
|
onCancel?: () => void;
|
|
afterClose?: () => void;
|
|
}
|
|
|
|
/** 抽屉组件Props */
|
|
interface Drawer extends Base {
|
|
visible: boolean;
|
|
title?: string;
|
|
width?: number | string;
|
|
placement?: 'left' | 'right' | 'top' | 'bottom';
|
|
closable?: boolean;
|
|
maskClosable?: boolean;
|
|
keyboard?: boolean;
|
|
destroyOnClose?: boolean;
|
|
onClose?: () => void;
|
|
afterVisibleChange?: (visible: boolean) => void;
|
|
}
|
|
|
|
/** 上传组件Props */
|
|
interface Upload extends Base {
|
|
action?: string;
|
|
accept?: string;
|
|
multiple?: boolean;
|
|
maxCount?: number;
|
|
maxSize?: number;
|
|
fileList?: UploadFile[];
|
|
beforeUpload?: (file: File) => boolean | Promise<boolean>;
|
|
onChange?: (fileList: UploadFile[]) => void;
|
|
onPreview?: (file: UploadFile) => void;
|
|
onRemove?: (file: UploadFile) => boolean | Promise<boolean>;
|
|
}
|
|
|
|
/** 图片预览组件Props */
|
|
interface ImagePreview extends Base {
|
|
visible: boolean;
|
|
images: string[];
|
|
current?: number;
|
|
onClose?: () => void;
|
|
onChange?: (current: number) => void;
|
|
}
|
|
|
|
/** 搜索组件Props */
|
|
interface Search extends Base {
|
|
value?: string;
|
|
placeholder?: string;
|
|
disabled?: boolean;
|
|
loading?: boolean;
|
|
onSearch?: (value: string) => void;
|
|
onChange?: (value: string) => void;
|
|
onClear?: () => void;
|
|
}
|
|
|
|
/** 筛选器组件Props */
|
|
interface Filter extends Base {
|
|
filters: Array<{
|
|
key: string;
|
|
label: string;
|
|
type: 'input' | 'select' | 'date' | 'dateRange';
|
|
options?: Option[];
|
|
placeholder?: string;
|
|
}>;
|
|
values?: Record<string, any>;
|
|
onChange?: (values: Record<string, any>) => void;
|
|
onReset?: () => void;
|
|
}
|
|
|
|
/** 商品列表组件Props */
|
|
interface GoodsList extends Base {
|
|
goods: Product.Info[];
|
|
loading?: boolean;
|
|
layout?: 'grid' | 'list';
|
|
columns?: number;
|
|
showPrice?: boolean;
|
|
showStock?: boolean;
|
|
showSales?: boolean;
|
|
onItemClick?: (goods: Product.Info) => void;
|
|
onAddToCart?: (goods: Product.Info, sku?: Product.SKU) => void;
|
|
}
|
|
|
|
/** 商品卡片组件Props */
|
|
interface GoodsCard extends Base {
|
|
goods: Product.Info;
|
|
layout?: 'vertical' | 'horizontal';
|
|
showPrice?: boolean;
|
|
showStock?: boolean;
|
|
showSales?: boolean;
|
|
onClick?: () => void;
|
|
onAddToCart?: (sku?: Product.SKU) => void;
|
|
}
|
|
|
|
/** 规格选择器组件Props */
|
|
interface SpecSelector extends Base {
|
|
specs: Product.Spec[];
|
|
skus: Product.SKU[];
|
|
selectedSku?: Product.SKU;
|
|
onChange?: (sku: Product.SKU) => void;
|
|
}
|
|
|
|
/** 数量选择器组件Props */
|
|
interface QuantitySelector extends Base {
|
|
value: number;
|
|
min?: number;
|
|
max?: number;
|
|
step?: number;
|
|
disabled?: boolean;
|
|
onChange?: (value: number) => void;
|
|
}
|
|
|
|
/** 购物车商品项组件Props */
|
|
interface CartItem extends Base {
|
|
item: Cart.Item;
|
|
editable?: boolean;
|
|
onSelect?: (selected: boolean) => void;
|
|
onQuantityChange?: (quantity: number) => void;
|
|
onRemove?: () => void;
|
|
}
|
|
|
|
/** 订单列表组件Props */
|
|
interface OrderList extends Base {
|
|
orders: Order.Info[];
|
|
loading?: boolean;
|
|
showActions?: boolean;
|
|
onItemClick?: (order: Order.Info) => void;
|
|
onPay?: (order: Order.Info) => void;
|
|
onCancel?: (order: Order.Info) => void;
|
|
onConfirm?: (order: Order.Info) => void;
|
|
onRefresh?: () => void;
|
|
}
|
|
|
|
/** 订单卡片组件Props */
|
|
interface OrderCard extends Base {
|
|
order: Order.Info;
|
|
showActions?: boolean;
|
|
onClick?: () => void;
|
|
onPay?: () => void;
|
|
onCancel?: () => void;
|
|
onConfirm?: () => void;
|
|
}
|
|
|
|
/** 地址选择器组件Props */
|
|
interface AddressSelector extends Base {
|
|
value?: Order.Address;
|
|
addresses?: Order.Address[];
|
|
onSelect?: (address: Order.Address) => void;
|
|
onAdd?: () => void;
|
|
onEdit?: (address: Order.Address) => void;
|
|
onDelete?: (address: Order.Address) => void;
|
|
}
|
|
|
|
/** 支付方式选择器组件Props */
|
|
interface PaymentSelector extends Base {
|
|
value?: Order.PaymentType;
|
|
methods: Array<{
|
|
type: Order.PaymentType;
|
|
name: string;
|
|
icon?: string;
|
|
disabled?: boolean;
|
|
}>;
|
|
onChange?: (type: Order.PaymentType) => void;
|
|
}
|
|
|
|
/** 用户头像组件Props */
|
|
interface UserAvatar extends Base {
|
|
user?: User.BaseInfo;
|
|
size?: 'small' | 'medium' | 'large' | number;
|
|
shape?: 'circle' | 'square';
|
|
showName?: boolean;
|
|
onClick?: () => void;
|
|
}
|
|
|
|
/** 错误边界组件Props */
|
|
interface ErrorBoundary extends Base {
|
|
fallback?: ReactNode;
|
|
onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
|
|
}
|
|
|
|
/** 加载状态组件Props */
|
|
interface Loading extends Base {
|
|
loading: boolean;
|
|
tip?: string;
|
|
size?: 'small' | 'medium' | 'large';
|
|
overlay?: boolean;
|
|
}
|
|
|
|
/** 空状态组件Props */
|
|
interface Empty extends Base {
|
|
image?: string;
|
|
description?: string;
|
|
action?: ReactNode;
|
|
}
|
|
|
|
/** 骨架屏组件Props */
|
|
interface Skeleton extends Base {
|
|
loading: boolean;
|
|
rows?: number;
|
|
avatar?: boolean;
|
|
title?: boolean;
|
|
active?: boolean;
|
|
}
|
|
}
|