全代码框架文档
首页
快速上手
前端组件
前端二开
首页
快速上手
前端组件
前端二开
  • 二开前准备
  • 对接移动办公
  • 表单介绍

    • 表单封装逻辑
    • 传值和formModel
    • 组件的封装
    • 显示隐藏控制
    • 字段事件
  • 基础二开

    • 值计算
    • 修改组件值
    • 自定义校验
    • 使用远程数据源
    • 为工具栏添加按钮
    • 为表单添加新字段
  • 高级二开

    • 自定义字段
    • 自定义页面
    • 弹窗
    • 表单
    • 表格

字段事件

此处PC端和移动端的字段事件整体逻辑是一致的。 在未进行拆分之前,字段事件的逻辑可以写在代码生成的config.ts文件中。具体是在每个字段的componentProps下的events属性中编写。能够接收的事件类型随组件不同而有所差异,如input组件中可以接收onChange、onBlur事件,select组件中可以接收onChange、onOptionsChange事件等,具体能够抛出的事件需要在组件中查看。在events中编写的事件会在simpleFormItem.vue文件中被收集解析并触发。(PC与移动端逻辑相同)

if (componentProps['events']) {
    for (const eventKey in componentProps['events']) {
        try {
            const fun = componentProps['events'][eventKey];
            let event;
            if (typeof fun === 'string') {
                event = new Function('schema', 'formModel', 'formActionType', 'extParams', `${fun}`);
            } else if (typeof fun === 'function') {
                event = fun;
            }
            componentProps['on' + upperFirst(eventKey)] = function (value, selectedOptions) {
                let cloneFormModel = cloneDeep(formModel);
                for (let item in cloneFormModel) {
                    let field = camelCaseString(item);
                    if (field) cloneFormModel[field] = cloneFormModel[item];
                }
                event(props.schema, isCamelCase ? cloneFormModel : formModel, props.formApi, { formData, value, selectedOptions });

                if (isCamelCase) {
                    for (let item in formModel) {
                        let field = camelCaseString(item);
                        if (cloneFormModel && field && cloneFormModel[field] !== undefined) {
                            formModel[item] = cloneFormModel[field];
                        }
                    }
                }
            };
        } catch (error) {
            console.log('error', error);
            notification.error({
                message: 'Tip',
                description: '触发事件填写有误!'
            });
        }
    }
}

但是这样会导致代码生成的config.ts文件中会出现大量的事件函数,导致代码可读性降低,且修改表单值及其他变量很是不方便,因此在拆分后不推荐这种方式。

拆分表单后,可以直接将公共组件暴露出来,写在生成的CustomDevForm.vue文件中,所有的事件显隐等都可以自己进行控制。

<template>
    <Col v-if="getIfShow2('9a8db2186edb49879f59162ae2660b21')" v-show="getIsShow2('9a8db2186edb49879f59162ae2660b21')" :span="getColWidth(schemaMap['9a8db2186edb49879f59162ae2660b21'])">
        <template v-if="showComponent(schemaMap['9a8db2186edb49879f59162ae2660b21'])">
            <FormItem
                :label="'审计内容'"
                :rules="schemaMap['9a8db2186edb49879f59162ae2660b21'].rules"
                name="title"
                :required="true"
            >
                <a-input v-model:value="formModel[schemaMap['9a8db2186edb49879f59162ae2660b21'].field]" @blur="blurInput"/>
            </FormItem>
        </template>
    </Col>
</template>

如果嫌这样麻烦,并且只是想监听字段变化并进行相应修改的话,也可以在代码生成的form层或者CustomDevForm对formModal的相应表单值进行监听,字段有变化后进行相应修改。

Last Updated:: 4/18/25, 4:18 PM
Contributors: DESKTOP-45LLIKH\11405
Prev
显示隐藏控制