Vben admin创建表格

1.创建表格

创建ts文件

TypeScript 复制代码
// 引入必要的 VxeTable 类型
import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';

// 引入国际化功能
import { $t } from '#/locales';

/**
 * 定义表格查询表单的结构配置
 * 用于表格上方的查询条件表单
 */
export function useGridFormSchema(): VbenFormSchema[] {
  return [
    {
      component: 'Input', // 使用输入框组件
      fieldName: 'name', // 字段名
      label: $t('system.tabletest.name'), // 角色名称查询条件
    },
    {
      component: 'Input',
      fieldName: 'id', // ID查询条件
      label: $t('system.tabletest.id'),
    },
    {
      component: 'Select', // 使用下拉选择组件
      componentProps: {
        allowClear: true, // 允许清除选择
        options: [
          // 下拉选项
          { label: $t('common.enabled'), value: 1 }, // 启用
          { label: $t('common.disabled'), value: 0 }, // 禁用
        ],
      },
      fieldName: 'status', // 状态查询条件
      label: $t('system.role.status'),
    },
  ];
}

/**
 * 定义表格列的配置
 * @param onActionClick 操作列点击回调函数
 * @param onStatusChange 状态改变回调函数
 * @returns 表格列配置数组
 */
export function useColumns(): VxeTableGridOptions['columns'] {
  return [
    {
      field: 'id', // 字段名
      title: $t('system.tabletest.id'), // 列标题(ID)
      // width: 250, // 列宽度
      sortable: true, // 可排序
      showOverflow: true, // 超出显示省略号
      fixed: 'left', // 固定在左侧
    },
    {
      field: 'gsId', // 字段名
      title: $t('gsId'),
      // width: 200, // 列宽度
    },
    {
      field: 'code', // 字段名
      title: $t('system.tabletest.code'),
      // width: 200, // 列宽度
    },
    {
      field: 'name', // 字段名
      title: $t('system.tabletest.name'),
      // width: 200, // 列宽度
    },
    {
      field: 'status', // 字段名
      title: $t('system.role.status'), // 列标题(状态)
      // width: 100, // 列宽度
    },
    {
      align: 'center', // 居中对齐

      field: 'operation', // 字段名
      fixed: 'right', // 固定在右侧
      title: $t('system.role.operation'), // 列标题(操作)
      // width: 130, // 列宽度
    },
  ];
}

创建vue文件

html 复制代码
<script lang="ts" setup>
// 这是一个自定义的 TypeScript 类型通常用于表示一个可以接受任意字符串键的对象类型

// import type TypeScript 的类型导入语法仅导入类型信息,不导入实际的值编译后会被完全移除,不影响运行时
// OnActionClickParams表格操作事件参数类型   VxeTableGridOptions: 表格配置参数类型
// #/adapter/vxe-table 这是一个适配器文件,用于配置和封装 vxe-table 组件
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
// SystemRoleApi:系统角色相关的 API 类型定义
// 通常包含与系统角色管理相关的数据接口和类型
// 在你的项目中代表系统角色的数据结构类型
import type { TableTestApi } from '#/api';

// Page:一个页面布局组件 useVbenDrawer:一个自定义的 Vue Composition API Hook
import { Page } from '@vben/common-ui';

// 消息提示组件
// useVbenVxeGrid专门用于创建和管理 vxe-table 表格组件
import { useVbenVxeGrid } from '#/adapter/vxe-table';
// 导入国际化功能
// 导入相关的 API
import { getTableTestList } from '#/api';

// 导入表格列配置和表单配置
import { useColumns, useGridFormSchema } from './data';

// useVbenVxeGrid Hook 创建一个功能完整的数据表格组件。
// 返回两个值:Grid(表格组件)和 gridApi(控制表格的API)
const [Grid, gridApi] = useVbenVxeGrid({
  // 配置与表格关联的查询表单选项
  formOptions: {
    // 将 createTime 字段映射到表单中的 startTime 和 endTime 两个字段
    fieldMappingTime: [['createTime', ['startTime', 'endTime']]],
    // 使用 useGridFormSchema() 函数提供的表单结构定义查询表单包含哪些输入项(如输入框、下拉框等
    schema: useGridFormSchema(),
    // 表单内容改变时自动提交查询
    submitOnChange: true,
    // 配置表单一行显示四列
    wrapperClass: 'grid-cols-4',
  },
  // 表格本身的配置选项
  gridOptions: {
    // 使用 useColumns 函数定义表格列传入两个回调函数:onActionClick(操作列点击)和 onStatusChange(状态改变)
    columns: useColumns(),
    // 表格高度自适应
    height: 'auto',
    // 保留原生数据,即使刷新页面也不会丢失已编辑的数据
    keepSource: true,
    // 导出功能配置
    exportConfig: {},
    // 代理配置,用于处理数据请求
    proxyConfig: {
      // AJAX 请求配置
      ajax: {
        // page 包含分页信息,formValues 是表单查询条件
        query: async ({ page }, formValues) => {
          // 调用 getRoleList API 获取角色列表数据
          const result = await getTableTestList({
            page: page.currentPage,
            pageSize: page.pageSize,
            ...formValues,
          });
          return result;
        },
      },
    },
    // 行配置,指定每行数据的唯一标识字段为 id
    rowConfig: {
      keyField: 'id',
    },

    // 工具栏配置
    toolbarConfig: {
      custom: true, // 自定义列
      export: true, // 导出数据
      refresh: true, // 刷新数据
      search: true, // 搜索功能
      zoom: true, // 全屏缩放
      // print: true, //打印
    },
    // 使用类型断言指定配置的类型SystemRoleApi.SystemRole 是数据的类型定义
  } as VxeTableGridOptions<TableTestApi.TableTest>,
});
</script>

<template>
  <Page auto-content-height>
    <FormDrawer />
    <Grid table-title="测试表格">
      <template #toolbar-tools> </template>
    </Grid>
  </Page>
</template>

2.模拟数据

mock数据方式一

模拟数据二(简单)

TypeScript 复制代码
 proxyConfig: {
      ajax: {
        query: async ({ page }) => {
          // 模拟分页逻辑
          const pageSize = page.pageSize || 10;
          const currentPage = page.currentPage || 1;
          const data = mockData[] || [];

          // 模拟分页结果
          const start = (currentPage - 1) * pageSize;
          const end = start + pageSize;
          const paginatedData = data.slice(start, end);

          return {
            total: data.length,
            records: paginatedData,
          };
        },
}

模拟数据三

直接在gridOptions配置data: mockData

3.后端接口联调

前端设置了对应的返回结果集字段名,后端要保持一致否则数据在页面渲染不出来

4.前端三种响应方式

查询请求参数设置

上传下载请求参数设置

相关推荐
少卿6 小时前
React Compiler 完全指南:自动化性能优化的未来
前端·javascript
广州华水科技6 小时前
水库变形监测推荐:2025年单北斗GNSS变形监测系统TOP5,助力基础设施安全
前端
快起来搬砖了6 小时前
Vue 实现阿里云 OSS 视频分片上传:安全实战与完整方案
vue.js·安全·阿里云
广州华水科技6 小时前
北斗GNSS变形监测一体机在基础设施安全中的应用与优势
前端
七淮6 小时前
umi4暗黑模式设置
前端
8***B6 小时前
前端路由权限控制,动态路由生成
前端
爱隐身的官人7 小时前
beef-xss hook.js访问失败500错误
javascript·xss
军军3607 小时前
从图片到点阵:用JavaScript重现复古数码点阵艺术图
前端·javascript
znhy@1237 小时前
Vue基础知识(一)
前端·javascript·vue.js
terminal0077 小时前
浅谈useRef的使用和渲染机制
前端·react.js·面试