表单操作
API 提供了一系列强大的表单操作方法,使开发者能够在不同的业务场景中灵活地控制和操作表单。这些方法涵盖了表单数据处理、DOM 操作、提交逻辑等多方面内容。
数据结构
以下是 Api 表单操作相关的数据结构及简明解释:
interface Api {
// 提交按钮的控制接口,允许动态设置提交按钮的状态
btn: {
// 设置提交按钮的加载状态,如加载中状态
loading(loading: boolean): void;
// 设置提交按钮的禁用状态
disabled(disabled: boolean): void;
// 设置提交按钮的显示状态,控制按钮是否可见
show(show: boolean): void;
}
// 重置按钮的控制接口,允许动态设置重置按钮的状态
resetBtn: {
// 设置重置按钮的加载状态
loading(loading: boolean): void;
// 设置重置按钮的禁用状态
disabled(disabled: boolean): void;
// 设置重置按钮的显示状态
show(show: boolean): void;
}
// 获取整个表单的 Vue 组件实例,便于直接操作组件的内部方法或属性
formEl(): undefined | ComponentInternalInstance;
// 获取指定表单项的 Vue 组件实例,用于对具体表单项的操作
wrapEl(id: string): undefined | ComponentInternalInstance;
// 更新表单提交按钮的配置,如文本、样式等
submitBtnProps(props: ButtonProps): void;
// 更新表单重置按钮的配置
resetBtnProps(props: ButtonProps): void;
// 更新表单的全局配置
updateOptions(options: Options): void;
// 监听表单提交事件,当表单被提交时执行回调
onSubmit(fn: (formData: Object, api: Api) => void): void;
// 手动提交表单,触发提交流程并执行成功或失败的回调
submit(success?: (formData: Object, api: Api) => void, fail?: (api: Api) => void): Promise<any>;
// 隐藏整个表单,通常用于表单不需要展示的场景
hideForm(hide?: Boolean): void;
// 获取表单的 JSON 生成规则,用于导出或保存表单结构
toJson(space?: string | number): string;
// 获取指定字段的子表单 Api 对象,支持嵌套表单的操作
getSubForm(field: string): Api | Api[];
}
获取表单组件的vm/dom
元素
formEl
方法用于获取整个表单组件的 Vue 实例或 DOM 元素。
type formEl = () => Vue|Document|undefined
- 示例:
const vm = fApi.formEl();
console.log(vm);
获取 FormItem 组件的vm/dom
元素
wrapEl
方法用于获取指定字段的 FormItem 组件的 Vue 实例或 DOM 元素。
type wrapEl = (field:string) => Vue|Document|undefined
- 示例:
const vm = fApi.wrapEl('goods_name');
console.log(vm);
获取表单数据
formData
方法用于获取表单中所有字段或部分字段的数据。该方法的返回值是数据的快照,不是双向绑定。
interface formData {
//获取全部数据
(): {[field:string]:any }
//获取部分字段的数据
(field:string[]): {[field:string]:any }
}
- 示例:
const allData = fApi.formData();
console.log('所有表单数据:', allData);
const specificData = fApi.formData(['goods_name', 'price']);
console.log('部分表单数据:', specificData);
表单中的值是否发生变化状态
changeStatus
方法用于检查表单中的值是否发生了变化。返回的布尔值指示表单自加载以来是否被用户修改过。
type changeStatus = ()=>Boolean
- 示例:
const hasChanged = fApi.changeStatus();
if (hasChanged) {
console.log('表单数据已修改');
} else {
console.log('表单数据未修改');
}
清除变化状态
clearChangeStatus
方法用于清除表单的变化状态,这意味着在调用此方法后,changeStatus 将返回 false。
type clearChangeStatus = ()=>void
- 示例:
fApi.clearChangeStatus();
console.log('表单变化状态已清除');
修改提交按钮
submitBtnProps
方法用于动态修改表单提交按钮的属性,例如禁用状态、加载状态或按钮文本。
type submitBtnProps = (props:Object) => void
- 示例:
fApi.submitBtnProps({ disabled: true });
快捷操作:
fApi.btn.loading(true)
设置提交按钮进入loading状态fApi.btn.disabled(true)
设置提交按钮禁用状态fApi.btn.show(true)
设置提交按钮显示状态
修改重置按钮
resetBtnProps
方法用于动态修改表单重置按钮的属性,例如禁用状态、加载状态或按钮文本。
type resetBtnProps = ( props:Object) => void
- 示例:
fApi.resetBtnProps({ disabled: true });
快捷操作:
fApi.resetBtn.loading(true)
设置重置按钮进入loading状态fApi.resetBtn.disabled(true)
设置重置按钮禁用状态fApi.resetBtn.show(true)
设置重置按钮显示状态
更新表单配置
updateOptions
方法用于动态更新表单的全局配置选项。这些配置选项包括表单布局、按钮配置、校验规则等。
type updateOptions = (options:Object) => void
- 示例:
fApi.updateOptions({ form: { inline: true } });
更新表单提交事件
onSubmit
方法用于为表单设置自定义的提交事件处理函数。当用户提交表单时,会执行该回调函数,可以在回调中处理表单数据。
type onSubmit = (callback:(formData:Object,fApi:fApi)=>void) => void
- 示例:
fApi.onSubmit((formData, fApi) => {
console.log('表单提交数据:', formData);
// 自定义的提交逻辑
});
刷新表单配置
refreshOptions
方法用于手动刷新表单的配置选项,确保配置的更改立即生效。
type refreshOptions = ()=>void
- 示例:
fApi.refreshOptions();
console.log('表单配置已刷新');
刷新表单渲染
refresh
方法用于手动刷新表单的渲染状态。这在表单内容需要动态更新时非常有用。
type refresh = ()=>void
- 示例:
fApi.refresh();
console.log('表单渲染已刷新');
隐藏表单
hideForm
方法用于隐藏或显示整个表单。表单隐藏后,用户将无法看到或操作表单。
type hideForm = (hide:Boolean)=>void
- 示例:
fApi.hideForm(true); // 隐藏表单
fApi.hideForm(false); // 显示表单
重载表单
reload
方法用于重新加载表单,您可以选择使用现有的生成规则或传入新的生成规则来重载表单。
interface reload{
():void
(rules:Rule[]):void
}
- 示例:
fApi.reload(); // 使用现有规则重载表单
fApi.reload(newRules); // 使用新的规则重载表单
表单渲染后回调
nextTick
方法在表单渲染完成后执行回调函数。可以用来确保 DOM 操作在渲染完成后进行。
type nextTick = (callback:Function) => void
- 示例:
fApi.nextTick(() => {
console.log('表单已渲染完成');
// 渲染完成后的操作
});
自动刷新
nextRefresh
方法执行回调函数后自动刷新表单渲染。这在回调中执行影响表单渲染的操作时特别有用。
type nextRefresh = (callback:Function) => void
- 示例:
fApi.nextRefresh(() => {
console.log('表单操作已完成,正在刷新表单...');
// 执行影响表单渲染的操作
});
提交表单
submit
方法用于手动提交表单,支持传入成功和失败的回调函数。提交表单时可以进行自定义的验证和数据处理。
type submit = (
success?: (formData: Object, $f: Api) => void,
fail?: ($f: Api) => void
) => Promise<any>;
- 示例:
fApi.submit(
(formData, fApi) => {
console.log('表单提交成功:', formData);
// 提交后的逻辑处理
},
(fApi) => {
console.log('表单提交失败');
// 验证未通过的处理逻辑
}
).then(formData => {
// 推荐
console.log('表单提交成功:', formData);
// 提交后的逻辑处理
});
获取表单json
规则
toJson
方法用于将表单规则转换为 JSON 字符串。
type toJson = () => string
- 示例:
const jsonString = fApi.toJson();
console.log('表单规则的 JSON 字符串:', jsonString);
示例
动态控制提交和重置按钮的状态
在一个表单提交过程中,根据用户操作动态控制提交按钮和重置按钮的状态。例如,在提交表单时禁用按钮并显示加载状态,提交完成后恢复按钮状态。
fApi.onSubmit((formData) => {
fApi.btn.loading(true); // 设置提交按钮为加载状态
fApi.btn.disabled(true); // 禁用提交按钮
fApi.resetBtn.disabled(true); // 禁用重置按钮
// 模拟提交操作
setTimeout(() => {
fApi.btn.loading(false); // 取消加载状态
fApi.btn.disabled(false); // 重新启用提交按钮
fApi.resetBtn.disabled(false); // 重新启用重置按钮
console.log('表单提交成功:', formData);
}, 2000);
});
实时更新表单的全局配置
在一个多语言支持的表单中,根据用户选择的语言动态更新表单的全局配置,如表单的布局、标签位置、验证规则等。
const language = fApi.getValue('language');
if (language === 'en') {
fApi.updateOptions({ form: { labelPosition: 'top' }, validation: { message: 'Field is required' } });
} else if (language === 'zh') {
fApi.updateOptions({ form: { labelPosition: 'left' }, validation: { message: '此字段为必填项' } });
}
导出表单的 JSON 生成规则以便保存或复用
在一个表单设计器工具中,用户可以实时编辑表单结构,并导出当前表单的 JSON 规则,以便保存或在其他项目中复用。
const jsonRules = fApi.toJson(); // 以格式化的方式导出 JSON 规则
console.log('导出的表单规则:', jsonRules);
// 将导出的 JSON 规则保存到服务器或本地存储
saveFormConfig(jsonRules);
根据用户选择动态修改分组的字段规则
在一个客户信息表单中,不同的客户类型(个人客户或企业客户)需要填写不同的信息。通过修改子表单的规则,可以动态调整表单内容以适应用户选择。
// 获取子表单的 API 对象
const customerInfoApi = fApi.getSubForm('customerInfo');
// 根据客户类型动态修改子表单规则
const customerType = fApi.getValue('customer_type');
if (customerType === 'individual') {
customerInfoApi.updateRule('company_name', { hidden: true }); // 隐藏公司名称字段
customerInfoApi.updateRule('personal_id', { hidden: false }); // 显示个人ID字段
} else if (customerType === 'business') {
customerInfoApi.updateRule('company_name', { hidden: false }); // 显示公司名称字段
customerInfoApi.updateRule('personal_id', { hidden: true }); // 隐藏个人ID字段
}
// 刷新子表单以应用新的规则
customerInfoApi.refresh();
批量修改子表单中的数据
在一个复杂的多商品订单表单中,用户可以批量更新子订单的状态。
// 获取所有子订单表单的 API 对象数组
const subOrderApis = fApi.getSubForm('subOrders');
// 批量修改所有子订单的状态
subOrderApis.forEach(api => {
api.setValue('order_status', 'shipped'); // 设置子订单状态为已发货
api.sync('order_status'); // 同步状态到子表单的显示
});
// 刷新所有子订单表单
subOrderApis.forEach(api => {
api.refresh();
});
批量修改子表单中组件的规则
在一个订单管理系统中,每个订单可能包含多个商品。根据商品类型,需要批量修改所有子订单表单中字段的显示状态、参数和验证规则。
// 获取所有子订单表单的 API 对象数组
const subOrderApis = fApi.getSubForm('subOrders');
// 批量修改子订单表单中字段的参数、显示状态和验证规则
subOrderApis.forEach((api) => {
const itemType = api.getValue('item_type'); // 获取当前子订单的商品类型
if (itemType === 'electronic') {
api.updateRule({
'warranty': { hidden: false, validate: [{ required: true, message: '保修期不能为空' }] }, // 显示保修期字段并验证必填
'discount': { props: { min: 0, max: 10 } } // 限制折扣范围为 0-10%
});
} else if (itemType === 'furniture') {
api.updateRule({
'warranty': { hidden: true, validate: [{ required: false }] }, // 隐藏保修期字段并取消验证
'discount': { props: { min: 0, max: 20 } } // 扩大折扣范围为 0-20%
});
}
// 刷新每个子订单表单以应用新的字段规则
api.refresh();
});