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

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

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

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

表格

PC端

自定义表格搜索功能

在某些场景,如级联、表单联动,则需要自定义搜索功能,首先,我们需要取消全开框架生成的搜索功能,需要在生成的模块中找到index.vue文件,找到useTable并schemas属性给删掉,并在需要添加showSubmitButton: false,此属性是取消原来搜索功能的搜索按钮,将showResetButton设置为false,隐藏原来搜索功能的重置按钮,经过以上操作就会发现表格自带的搜索功能消失不见。

index.vue

<script lang="ts" setup>
// 前面代码省略
const [registerTable, { reload,   }] = useTable({
    title: (formName + '列表') || '',
    api: getTestTablePage,
    rowKey: 'id',
    columns: filterColumns,
    formConfig: {
        rowProps: {
            gutter: 16,
        },
        schemas: searchFormSchema, // 原始表单显示的表单项的配置
        fieldMapToTime: [],
        showResetButton: false, // 控制原始表单的重置功能,一般为“重置”按钮
        showSubmitButton: false // 控制原始表单触发搜索的按钮的显隐,一般为“搜索”按钮
    },
    beforeFetch: (params) => {
      return { ...params, FormId: formIdComputedRef.value, PK: 'id' };
    },
    afterFetch: (res) => {
      tableRef.value.setToolBarWidth();
    },
    useSearchForm: true, // 是否使用搜索表单
    showTableSetting: true,

    striped: false,
    actionColumn: {
      width: 160,
      title: '操作',
      dataIndex: 'action',
      slots: { customRender: 'action' },
    },
    tableSetting: {
      size: false,
      setting: false,
    },

  });
// 后面省略代码
</script>

然后,自定义搜索表单,可以用ant-design-vue中的a-form,特别注意的,自定义搜索表单的字段必须存在表格已经定义的字段里面,若不存在的话,可能会导致该字段搜索无效,具体字段可以查看index.vue所在目录下的components对应的config.ts的searchFormSchema中的field,如下:

config.ts

/** 省略代码 **/
export const searchFormSchema: FormSchema[] = [
    {
        field: 'mingZi8847',
        label: '名字',
        component: 'Input',
    },
    {
        field: 'zhi4547',
        label: '值',
        component: 'Input',
    },
];
/** 省略代码 **/

接下来就是重写搜索功能,全开框架的BasicTable组件预留了一个headerContent的插槽,自定义的搜索功能就是写在这个插槽里面,而BasicTable组件提供了一个搜索表格方法beforeSearchInfoChange,我们只需要把搜索的字段和对应的值传入这个方法,接口实现与表格的联动,如下:

index.vue

<BasicTable @register="registerTable" ref="tableRef" @row-dbClick="dbClickRow">
    <template #headerContent>
        <a-form
            layout="inline"
            @submit="customHandleSubmit"
        >
            <a-form-item label="名字">
                <a-input v-model:value="customSearchForm.mingZi8847" placeholder="请输入名称" />
            </a-form-item>
            <a-form-item>
                <a-button type="primary" html-type="submit">搜索</a-button>
            </a-form-item>
        </a-form>
    </template>
     <!-- 其余代码省略 -->
</BasicTable>

<script lang="ts" setup>
// 前面代码省略
const customSearchForm = reactive({
    mingZi8847: '',
})

function customHandleSubmit() {
    tableRef.value?.beforeSearchInfoChange(customSearchForm);
}
// 后面省略代码
</script>

特别注意:

1、在比较早的全开框架版本中,BasicTable组件的beforeSearchInfoChange并没有导出,最新版本则已经导出;若没有,则需要自己找到BasicTable组件手动导出,如下:

BasicTable.vue

<script lang="ts" setup>
// 前面代码省略
function beforeSearchInfoChange(info){
    setSearchFormData(info);
    handleSearchInfoChange(info);
}
// 中间代码省略
expose({...tableAction, beforeSearchInfoChange});
// 后面省略代码
</script>

2、全开框架的BasicTable组件预留了一个headerContent的插槽默认是在最右侧,若需让它靠左的话,可在index.vue中添加以下样式。

index.vue

<style lang="less" scoped>
  // 前面代码省略
  :deep(.ant-table-title) {
    .items-center {
      display: none;
    }
  }
</style>

带有展开功能的搜索二开

如果你的搜索条件比较多,而且需要保持原有的样式,可以按照下面的方式进行二开。这里隐藏了原始代码,只给出template和样式的修改部分,事件绑定可以参考源文件里的组件定义。

<template>
    <BasicTable ref="tableRef" @register="registerTable" @row-dbClick="dbClickRow">
        <template #headerContent>
            <!-- 默认form-item有下边距,这里写死高度,因为展开的时候还要保持下边距 -->
            <div style="height: 32px">
                <a-form class="vben-basic-form">
                    <!-- suspensionRow样式默认带了弹出效果 但是必须和vben-basic-form连用 -->
                    <a-row :class="{ suspensionRow: isAdv }">
                        <!-- 注意这里的层级,row部分是搜索表单,col里面的action是搜索按钮 -->
                        <a-row>
                            <a-col :span="8">
                                <a-form-item label="搜索字段1">
                                    <a-input placeholder="请输入名称" />
                                </a-form-item>
                            </a-col>
                            <a-col :span="8">
                                <a-form-item label="搜索字段2">
                                    <a-input placeholder="请输入名称" />
                                </a-form-item>
                            </a-col>
                            <a-col :span="8">
                                <a-form-item label="搜索字段3">
                                    <a-input placeholder="请输入名称" />
                                </a-form-item>
                            </a-col>
                            <!-- 不展开的时候其余的字段隐藏 注意默认样式col-8在搜索中定死了宽度280px -->
                            <a-col :span="8" :style="{display: isAdv ? 'block' : 'none'}">
                                <a-form-item label="搜索字段4">
                                    <a-input placeholder="请输入名称" />
                                </a-form-item>
                            </a-col>
                            <a-col :span="8" :style="{display: isAdv ? 'block' : 'none'}">
                                <a-form-item label="搜索字段5">
                                    <a-input placeholder="请输入名称" />
                                </a-form-item>
                            </a-col>
                            <a-col :span="8" :style="{display: isAdv ? 'block' : 'none'}">
                                <a-form-item label="搜索字段6">
                                    <a-input placeholder="请输入名称" />
                                </a-form-item>
                            </a-col>
                        </a-row>
                        <a-col>
                            <!-- 只要绑定事件就行 默认就开启了搜索、重置、展开这3个按钮 -->
                            <form-action :is-advanced="isAdv" @toggle-advanced="toggleAdv"></form-action>
                        </a-col>
                    </a-row>
                </a-form>
            </div>
        </template>
    </BasicTable>
</template>
<script setup>
    import FormAction from '/@/components/Form/src/components/FormAction.vue';

    const isAdv = ref(false);

    function toggleAdv() {
        // 注意form-action的展开状态不是自己保存的 需要外部状态控制
        isAdv.value = !isAdv.value;
    }
</script>
<style scoped>
    /*隐藏原来表单的区域 否则中间会被占满*/
    :deep(.ant-table-title .items-center) {
        display: none;
    }

    /* 让展开时的搜索按钮和表单左右显示 */
    :deep(.ant-row.suspensionRow) {
        flex-wrap: nowrap;
    }
</style>

效果如下 搜索二开效果

自定义表格列

在某些场景,我们需要对表格的某些列进行定制化开发,例如显示进度条,tag标签等,可在BasicTable的bodyCell插槽里面添加,在bodyCell插槽里面尽量使用v-if/v-else-if,防止匹配多列的情况,其中:column为列的配置,record为数据源。特别注意:自定义表格列会覆盖原有的列,示例代码如下:

index.vue

<BasicTable @register="registerTable" ref="tableRef" @row-dbClick="dbClickRow">
    <!-- 前面代码省略 -->
    <template #bodyCell="{ column, record }">
        <!-- 前面代码省略 -->
        <template v-else-if="column.dataIndex === 'zhi4547'">
            <a-progress :percent="record[column.dataIndex]" />
        </template>
    </template>
</BasicTable>

效果:

自定义表格列效果

修改分页

若你不需要分页,可以在BasicTable组件上,将pagination置为false即可取消分页,如下:

index.vue

<!-- 前面代码省略 -->
<BasicTable @register="registerTable" ref="tableRef" :pagination="false" @row-dbClick="dbClickRow">
<!-- 中间代码省略 -->
</BasicTable>
<!-- 后面代码省略 -->

修改分页,若需要调整分页的样式,BasicTable组件提供了获取分页配置接口getPaginationRef和设置分页配置接口setPagination,分页配置里面具体的参数可以参考Ant-Design-Vue的分页Pagination,修改分页配置生命周期onMounted修改,如下:我将分页修改成简单分页以及每页只展示1条数据。

index.vue

// 前面代码省略
<script lang="ts" setup>
import { nextTick } from 'vue';
// 中间代码省略
onMounted(() => {
    // 中间代码省略
    nextTick(() => {
        const pagination = tableRef.value?.getPaginationRef();
        pagination.simple = true;
        pagination.pageSize = 1;
        tableRef.value?.setPagination(pagination);
    })
});
// 后面代码省略
</script>

效果如下:

修改表格分页效果

表格的其他功能

BasicTable组件还提供了其他功能,如useTable中提供了beforeFetch和afterFetch方法,beforeFetch是表格发送请求前的拦截,可以在这里对参数进行处理;afterFetch是表格请求后返回的数据,可以在这里对返回的数据进行格式处理等,若你在afterFetch对数据进行处理,你必须把处理完的结果return回去,否则无法生效,如:我对表格返回的数据中的zhi4547全部设置为100。

index.vue

<script lang="ts" setup>
// 前面代码省略
const [registerTable, { reload,   }] = useTable({
    // 中间代码省略
    beforeFetch: (params) => {
        // 可以对筛选的参数params进行处理
        return { ...params, FormId: formIdComputedRef.value, PK: 'id' };
    },
    afterFetch: (res) => {
        const newRes = res.map(item => {
            return {
                ...item,
                zhi4547: 100
            }
        })
        tableRef.value.setToolBarWidth();
        return newRes;
    }
    // 中间代码省略
});
// 后面代码省略
</script>

效果如下:表格zhi4547字段所在的列(表格列名为:值)进度都为100%。

拦截表格请求

移动端

移动端暂不支持表格组件,移动端的子表展示形式是多组表单的形式,这里不多赘述。

Last Updated:: 5/30/25, 4:05 PM
Contributors: DESKTOP-45LLIKH\11405, Chen_Jie_Wen, gaoyunqi
Prev
表单