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

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

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

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

PC端设计

默认情况下的显示/隐藏设计

以默认的组件封装为例,我们可以看到3个控制显隐的部分

<template>
    <Col v-if="getIfShow(schema, formModel[schema.field])" v-show="getIsShow(schema, formModel[schema.field])" :span="getColWidth(schema)">
        <template v-if="showComponent(schema) && schema.type !== 'slot'">
            <SimpleFormItem v-model:value="formModel[schema.field]" :form-api="formApi" :isWorkFlow="isWorkFlow" :refreshFieldObj="refreshFieldObj" :schema="schema" />
        </template>
    </Col>
</template>

showComponent是某些特殊组件的显隐控制,和组件类型有关,目前只有2个用到该值,一个是隐藏字段,一个是在非流程中隐藏审批意见字段。

而getIfShow和getIsShow的逻辑完全相同,都是判断ifShow和isShow(读的是show)的值,这两个值可以是bool也可以是函数,区别是:

  • isShow是直接控制表单字段显隐的属性,无需流程绑定,可以在表单编辑器配置,也可以在config.ts里修改
  • ifShow是用于框架内部逻辑,是的,全开的内置页面(包括系统设置、权限管理等)也使用同样的封装逻辑,假如内置页面需要某些字段在特定时候才能修改,就会使用ifShow字段

对于流程绑定的显隐是show字段,这个字段由useWorkflowForm将流程节点配置的view参数转化得到,这里你也可以看到,流程通过dynamicDisabled字段控制只读编辑:

function getSchemePermissionItem() {
    if (permissionConfig) {
        //查看
        schema.show = permissionConfig.view;
        // 无用代码省略
        if (isViewProcess) {
            schema.dynamicDisabled = true;
        }
    } else {
        schema.show = false;
        schema.dynamicDisabled = true;
    }
}

在SimpleFormItem里会读取这个show参数:

function getShow(schema: FormSchema): boolean {
    const { show } = schema;
    let isIfShow = true;

    if (isBoolean(show)) {
        isIfShow = show;
    }
    return isIfShow;
}

注意show的优先级大于isShow,这点从代码可以看出来,getIsShow函数中,如果show有值会覆盖掉isShow的值。

二开控制显隐

对于拆分后的代码,所有字段都是Col和SimpleFormItem,因此直接使用v-show控制显隐即可。对于非拆分的字段,可以复写配置的ifShow,注意以配置文件复写的ifShow在外层,和key同级:

// 无关属性省略
const field = {
    key: '044e8bc1f9c345e0afa024ed7f21fe50',
    field: 'duoXingWenBen3343',
    label: '多行文本',
    type: 'textarea',
    // 四个参数分别为当前字段值、整个页面的model、当前字段配置、当前字段名
    ifShow: function ({values, model, schema, field}) {
        return model.danXingWenBen23227?.length > 10;
    }
}

如果被控制的组件位于tab、grid等嵌套组件内,我们建议直接拆分后二开,对于非拆分二开,这里提供个思路:

function getIsShow(schema: FormSchema): boolean {
    const { componentProps, show } = schema as any;
    let isShow = true;
    if (isBoolean(componentProps?.isShow)) {
        isShow = componentProps.isShow;
    } else if (typeof componentProps?.isShow === 'function') {
        // 支持isShow的函数格式,这里的formModel为响应式,可以拿到表单的动态值
        isShow = componentProps.isShow(formModel);
    }
    if (isBoolean(show)) {
        // 要求show和isShow同时为真才显示
        isShow = show && isShow;
    }
    return isShow;
}

这样就可以将isShow改为函数,动态计算显隐状态。

移动端设计

移动端组件显隐逻辑基本与PC端一致,不再赘述。

Last Updated:: 5/16/25, 6:02 PM
Contributors: gaoyunqi, DESKTOP-45LLIKH\11405
Prev
组件的封装
Next
字段事件