UNPKG

@txdfe/at

Version:

一个设计体系组件库

278 lines (233 loc) 6.83 kB
/// <reference types="react" /> import * as React from 'react'; type FieldOption<T> = { /** * 所有组件的change都会到达这里[setValue不会触发该函数] */ onChange?: (name: keyof T, value: T[typeof name]) => void; /** * 是否翻译init(name)中的name(getValues会把带.的字符串转换成对象) * @default false */ parseName?: boolean; /** * 仅建议PureComponent的组件打开此强制刷新功能,会带来性能问题(500个组件为例:打开的时候render花费700ms, 关闭时候render花费400ms) * @default false */ forceUpdate?: boolean; /** * field.validate的时候滚动到第一个出错的组件 (默认false, 1.0版本会改成true) * @default false */ scrollToFirstError?: boolean; /** * 自动删除(remove) Unmout 元素, getValues不会出现冗余数据 * @default false */ autoUnmount?: boolean; /** * 强制重置数据(设置所有数据为undefined,业务组件需要自己支持value=undefined情况清空数据)(版本要求>next@0.15) (1.0版本会改成true) * @default false */ deepReset?: boolean; /** * 默认值 */ values?: T | Readonly<T>; }; type InitResult<T> = { id: string; value: T; onChange(value: T): void; }; type InitResult2<T, T2> = { id: string; value: T; onChange(value: T, extra: T2): void; }; type Rule<T> = { /** * 不能为空 (不能和pattern同时使用) * @default true */ required?: boolean; /** * 出错时候信息 */ message?: string; /** * 被校验数据类型(注意 type:'number' 表示数据类型为Number,而不是字符串形式的数字,字符串形式的数字请用pattern:/^[0-9]*$/) String/Array/url/email/... */ type?: | 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email' | string; /** * 校验正则表达式 */ pattern?: RegExp; /** * 长度校验,如果max、mix混合配置,len的优先级最高 */ len?: number; /** * 字符最小长度 */ min?: number; /** * 字符最大长度 */ max?: number; /** * 是否进行空白字符校验(true进行校验) */ whitespace: boolean; /** * 自定义校验,(校验成功的时候不要忘记执行 callback(),否则会校验不返回) */ validator: ( rule: Rule<T>, value: T, callback: (error?: null | string | Error) => void ) => void; /** * 触发校验的事件名称 */ trigger: 'onChange' | 'onBlur' | string; }; type InitOption<T> = { /** * 组件值的属性名称,如 Checkbox 的是 checked,Input是 value */ valueName?: string; /** * 组件初始值(组件第一次render的时候才会读取,后面再修改此值无效),类似defaultValue */ initValue?: T; /** * 触发数据变化的事件名称 */ trigger?: string | 'onChange' | 'onBlur'; /** * 校验规则 */ rules?: Rule<T>[] | Rule<T>; /** * 组件自定义的事件可以写在这里,其他会透传(小包版本^0.3.0支持,大包^0.7.0支持) */ props?: object; /** * 自定义从onChange事件中获取value的方式,一般不需要设置. 详细用法查看demo 自定义数据获取 参数顺序和组件是完全一致的 */ getValueFromEvent?: (eventArgs: object) => T; }; export default class Field<T> { /** * * @param contextComp 传入调用class的this * @param options 一些事件配置 */ constructor(contextComp: React.Component, options?: FieldOption<T>); /** * 初始化每个组件 */ init<K extends keyof T>(name: K, options: InitOption<T[K]>): InitResult<T[K]>; /** * 初始化每个组件 */ init<K extends keyof T, T2>(name: K, option?: InitOption<T[K]>): InitResult2<T[K], T2>; /** * * 重置一组输入控件的值、清空校验, 第二个参数控制是否回到defaultValue * @param names 重置的字段名 * @param backToDefault */ reset<K extends keyof T>(names?: K[], backToDefault?: InitOption<T[K]>): void; /** * 删除某一个或者一组控件的数据,删除后与之相关的validate/value都会被清空 * @param name 字段名称 */ remove<K extends keyof T>(name: K | K[]): void; /** * 校验 * @param names * @param options * @param callback */ validate(callback?: (errorData: Partial<Record<keyof T, { errors: string[] }>> | null, data: T) => void): void; /** * 校验 * @param names * @param callback */ validate<K extends keyof T>( names: K[], callback?: (errorData: Partial<Record<keyof T, { errors: string[] }>> | null, data: T) => void ): void; /** * 校验并获取一组输入域的值与Error对象 */ /** * 获取所有组件的key */ getNames(): Array<keyof T>; /** * 获取单个输入控件的值 * @param 字段名 */ getValue<K extends keyof T>(name: K): T[K]; /** * 获取一组输入控件的值,如不传入参数,则获取全部组件的值 * @param names */ getValues<K extends keyof T>(names: K[]): Pick<T, K>; getValues(): T; /** * 设置单个输入控件的值 (会触发render,请遵循react时机使用) */ setValue<K extends keyof T>(name: K, value: T[K]): void; /** * 设置一组输入控件的值(会触发render,请遵循react时机使用) */ setValues(obj: Partial<T>): void; /** * 判断校验状态 */ getState<K extends keyof T>(name: K): 'error' | 'success' | 'validating'; /** * 获取单个输入控件的 Error */ getError<K extends keyof T>(name: K): null | string[]; /** * 获取一组输入控件的 Error * @param names 字段名 */ getErrors<K extends keyof T>(names: K[]): Record<K, null | string[]>; /** * 设置单个输入控件的 Error * @param name * @param errors */ setError<K extends keyof T>(key: K, err: null | string | string[]): void; /** * 设置一组输入控件的 Error */ setErrors<K extends keyof T>(obj: Partial<Record<K, null | string | string[]>>): void; /** * react hooks 风格使用 Field * @param options */ static useField<T>(options?: FieldOption<T>): Field<T>; }