@qin-ui/antd-vue-pro
Version:
93 lines • 4.77 kB
TypeScript
import { Form as _Form, Data, ExtendWithAny, DeepPartial } from '../../../shared/core';
import { Field } from '../types';
import { ComponentName } from '../constants';
import { FormInstance } from '../../../shared/ui';
/**
* 表单实例类型
*
* @description 在 core Form 类型的基础上,将字段类型 F 绑定为本地 Field<ComponentName, D>,
* 将底层表单实例 I 绑定为 Ant Design Vue 的 FormInstance,使 formRef 获得完整的类型提示。
*
* @template D - 表单数据类型
* @template F - 字段配置类型,默认使用本地 Field 类型
*
* @property formData - 响应式表单数据对象,可直接读写,支持深层路径如 `formData.address.city`
* @property getFormData - 获取指定路径的表单数据,支持点号分隔的深层路径,如 `getFormData('address.city')`
* @property setFormData - 设置表单数据,支持三种调用方式:<br>
* 1. `setFormData(path, value)` - 设置指定路径的值<br>
* 2. `setFormData(path, prev => newVal)` - 函数式更新<br>
* 3. `setFormData({ ... })` - 批量覆盖整个表单
* @property fields - 字段配置数组(响应式 Ref),ProForm 根据此数组渲染表单字段
* @property getField - 获取字段配置,支持路径字符串(如 `'name'`)或查找函数(如 `f => f.label === '姓名'`)
* @property setField - 更新字段配置,默认合并模式(Object.assign),可通过 `{ updateType: 'rewrite' }` 覆盖
* @property deleteField - 删除字段配置,支持 `{ all: true }` 批量删除所有匹配项
* @property appendField - 在指定字段后追加新字段,传 `undefined` 则在末尾追加
* @property prependField - 在指定字段前插入新字段,传 `undefined` 则在开头插入
* @property getParentField - 获取指定字段的父级字段配置,用于嵌套字段场景
* @property formRef - 底层 Ant Design Vue Form 组件实例的响应式引用(Ref),可调用 `validate()`、`resetFields()` 等方法
* @property setFormRef - 设置底层 Form 组件实例,由 ProForm 内部自动调用,一般无需手动使用
*
* @example
* ```ts
* interface User { name: string; age: number }
* const form: Form<User> = useForm({ name: '张三', age: 25 })
*
* form.formData.name // 直接读写响应式数据
* form.getFormData('name') // 通过路径读取
* form.setFormData('name', '李四') // 更新数据
* form.formRef.value?.validate() // 访问底层 Form 实例
* ```
*
* @public
*/
export type Form<D extends Data = Data, F extends Field<ComponentName, D> = Field<ComponentName, D>> = _Form<D, F, FormInstance>;
/**
* 创建表单实例的 Hook
*
* @description 基于 `@qin-ui/pro-components-core` 的 `useForm`,将泛型参数绑定为 Ant Design Vue 的本地类型:
* - 字段类型 F -> `Field<ComponentName, D>`(支持 Ant Design Vue 所有内置组件类型推导)
* - 表单实例 -> Ant Design Vue 的 `FormInstance`(使 formRef 获得完整的类型提示)
*
* 表单实例组合了三个子模块的能力:
* - **useFormData**:表单数据管理(响应式数据、读写、批量更新)
* - **useFields**:字段配置管理(增删改查字段配置,支持嵌套)
* - **useFormRef**:底层 Form 组件实例引用
*
* @template D - 表单数据类型
*
* @param {ExtendWithAny<DeepPartial<D>>} [initFormData] - 初始表单数据
* @param {Field<ComponentName, D>[]} [initFields] - 初始字段配置数组
* @param {boolean} [root=true] - 是否为根表单。设为 `false` 时尝试从父组件注入获取表单实例
*
* @returns {Form<D>} 表单实例,包含数据操作、字段操作和 ref 操作
*
* @example
* ```ts
* interface User { name: string; age: number }
*
* // 方式一:同时传入初始数据和字段
* const form = useForm<User>(
* { name: '张三', age: 25 },
* [
* { path: 'name', label: '姓名', component: 'input' },
* { path: 'age', label: '年龄', component: 'input-number' },
* ],
* true
* )
*
* // 方式二:仅设置 root 标识
* const form = useForm<User>(true)
*
* // 使用
* const { formData, formRef, fields, setFormData, getField } = form
* setFormData('name', '李四')
* await formRef.value?.validate()
* ```
*
* @see {@link coreUseForm} 底层核心实现(来自 @qin-ui/pro-components-core)
*
* @public
*/
export declare function useForm<D extends Data = Data>(initFormData?: ExtendWithAny<DeepPartial<D>>, initFields?: Field<ComponentName, D>[], root?: boolean): Form<D, Field<ComponentName, D>>;
export declare function useForm<D extends Data = Data>(root?: boolean): Form<D, Field<ComponentName, D>>;
//# sourceMappingURL=useForm.d.ts.map