Skip to content

Table 表格

element-plusel-table 组件进行封装

写在前面

  • LdTable 是从 Vben Admin 迁移过来
  • Vue-Vben-Admin 是一个基于 Vue3.0、Vite、 Ant-Design-Vue、TypeScript 的后台解决方案

使用

<template>
  <div class="app-container">
    <LdTable ref="logTableRef" @register="register">
      <template #toolbar>
        <el-button
          type="danger"
          :disabled="getSelectedRowIds().length === 0"
          size="small"
          @click="handleDatchDel"
          >批量删除</el-button
        ></template
      >
      <template v-slot:operatorSlot="{ row }">
        <TableAction
          :actions="[
            {
              label: '删除',
              type: 'danger',
              auth: 'manage.log.destroy',
              onClick: handleDel.bind(null, row),
            },
          ]"
        ></TableAction>
      </template>
    </LdTable>
  </div>
</template>
<script>
import { LogService } from "@/service";
import { ref } from "vue";
import { ElMessageBox, ElMessage } from "element-plus";
import LogSchemas from "@/views/system/schemas/LogSchemas";
import { TableAction, useTable } from "@/components/LdTable";

export default {
  components: {
    TableAction,
  },
  setup() {
    const logTableRef = ref(null);

    //删除日志
    const handleDel = (row) => {
      ElMessageBox.confirm("此操作将永久删除选中数据,是否继续?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          LogService.doDelete(row.log_id)
            .then((res) => {
              if (logTableRef) {
                logTableRef.value.refresh();
              }
            })
            .catch((err) => {
              ElMessage.error(err);
            });
        })
        .catch(() => {});
    };

    //表格配置和表单配置
    const { tableColumns, getFormConfig } = LogSchemas();

    const [
      register,
      { getSelectedRowIds, reload, setPaginationPage, clearSelectedRowKeys },
    ] = useTable({
      api: LogService.getList,
      actionButtons: ["refresh", "refreshCurrent"],
      columns: tableColumns,
      rowKey: "log_id",
      showTableSetting: true,
      showEasySearch: true,
      tableSetting: {
        size: true,
      },
      showIndexColumn: true,
      showSelectionColumn: true,
      useSearchForm: false,
    });

    function handleDatchDel() {
      ElMessageBox.confirm("此操作将永久删除选中数据,是否继续?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          LogService.doBatch(getSelectedRowIds())
            .then((res) => {
              if (res.code === 200) {
                setPaginationPage(1);
                clearSelectedRowKeys();
                reload();
              }
            })
            .catch((error) => {
              console.log(error);
            });
        })
        .catch((err) => {});
    }

    return {
      handleDel,
      logTableRef,
      register,
      handleDatchDel,
      getSelectedRowIds,
    };
  },
};
</script>

Table 属性

属性类型默认值可选值说明
api(...arg) => Promise<any>--请求接口,可以直接将src/service内的函数直接传入
actionButtonsarray[]["refresh", "add"]顶部左侧刷新按钮
sizestringsmalllarge / default / small根据业务状态控制当前是否显示
columnsarray[]-表单列信息,详见Table-column
paginationbooleantrue-是否显示分页
paginationPropsObject{}-分页配置,详见el-pagination
emptyDescstring暂无数据-数据为空展示
rowKeystring``-表格数据pk
afterFetchFunction``-请求之后对返回值进行处理
searchParamsobject{}-额外的请求参数
borderbooleantrue-是否显示边框
stripebooleantrue-是否显示斑马线
headerCellStyleobject{ background: "#f5f7fa",color: "#606266",}-表头样式
showTableSettingbooleanfalse-是否显示表头右侧设置
showEasySearchbooleanfalse-是否显示表头右侧简易搜索
tableSettingobject{}-表头右侧设置,详见下方tableSetting
isTreeTablebooleanfalse-是否树形表格
showIndexColumnbooleanfalse-是否显示序号,默认不显示
indexColumnPropsobject{}-序号列属性
showSelectionColumnbooleanfalse-是否显示多选框
selectionColumnPropsobject{}-多选框属性
useSearchFormbooleanfalse-是否开启高级搜索
immediatebooleantrue-是否立即请求接口
formConfigobject{}-高级搜索表单配置,useSearchForm属性为true时生效。配置详见LdForm
dataSourcearray[]-表格数据,非 api 加载情况

tableSetting

{
    size: false, //表格大小
    setting: false, //列设置
}

Table 事件

事件回调参数说明
expand-change`row, (expandedRowsexpanded)`
selection-changeselection当选择项发生变化时会触发该事件

TableColumn 属性

Table-column 属性全部继承于el-table column属性Table-column 属性

TableColumn 额外属性

属性类型默认值可选值说明
slotstring--自定义插槽
visiblebooleantruefalse / true是否显示
ifShow`boolean((action) => boolean)`--
customRenderFunction({text, row, index, column}) {}--生成复杂数据的渲染函数,参数分别为当前行的值,当前行数据,行索引行配置
formatFunction(text, row, index) {}--格式化数据

注意事项

customRender中使用函数时插槽渲染

错误用法:

return h(ElTag,{},'12');

正确用法:

return h(ElTag,{},  {default: () => xxx,});

多个插槽:

return h(ElTag,{},  {default: () => [xxx,xxxx]});

TableSlots 插槽

插槽名说明
toolbar表格顶部左侧区域,在刷新按钮后面

FormSlots 表单搜索插槽

当开启from表单搜索后,以form-xxxx为前缀的slot会被视为formslot

具体参考LdForm

内置组件

内置组件,仅用于表格内部使用

TableAction 组件

用于表格右侧操作列渲染

Props

属性类型默认值可选值说明
actionsArray--右侧操作列按钮列表,详见下方action 属性
dropDownActionsObject--下拉菜单,详见下方dropDownActions

actions 属性

属性类型默认值可选值说明
labelString--名称
authString/Array--权限标识
iconString--按钮图标,详见IconSvg
typeString--按钮类型,详见el-button
ifShowboolean|((action) => boolean)--根据业务状态控制当前是否显示
tooltipString|ElTooltipProps--按钮是否显示文字提示,传提示内容,或者ElTooltipProps所有配置
popconfirmElPopconfirm --气泡确认框,属性详见ElPopconfirm所有配置
onClickFn--按钮事件
属性类型默认值可选值说明
labelString--下拉菜单名,有传,文字后面自动加上ArrayDown图标,没有传。显示三个原点图标
buttonsArray--下拉操作组,详见dropDownItem

注意

command 指令要传递对象,要告诉@command回传的当前操作的表格数据,和操作类型。

[
  {
    label: '编辑',
    auth: ['manage.menu.update'],
    icon: 'Plus',
    command: { action: 'edit', row },
  },
  {
    label: '删除',
    auth: ['manage.menu.delete'],
    icon: 'CircleCheck',
    command: { action: 'delete', row },
  },
]
方法名说明参数
command点击菜单项触发的事件回调dropdown-item 的指令

使用

<template>
    <LdTable>
        <template v-slot:handleSlot="{ row }">
        <TableAction
          :actions="[
            {
              label: '编辑',
              auth: ['manage.menu.update'],
              onClick: handleEdit.bind(null, row),
            },
           {
              label: '删除',
              type: 'danger',
              auth: 'manage.account.destroy',
              popconfirm: {
                title: '是否确认要删除?',
                onConfirm: handleDel.bind(null, row),
              },
              ifShow: parseInt(row.is_super) === 0,
            },
          ]"
          :dropDownActions="{
            label:'更多',
            buttons: [
              {
                label: 'action1',
                auth: ['manage.menu.update'],
                icon: 'Plus',
                command: { action: 'action1', row },
              },
              {
                label: 'action2',
                auth: ['manage.menu.update'],
                icon: 'CircleCheck',
                command: { action: 'action2', row },
              },
            ],
          }"
          @command="handleCommand"
        ></TableAction>
      </template>
    </LdTable>
</template>
<script>
import { TableAction } from "@/components/LdTable";
export default {
      setup() {
        function handleCommand(action) {
            console.log(action);
        }
        function handleDel(row) {}
        function handleEdit(row) {}
        return {
            handleCommand,
            handleDel,
            handleEdit
        }
      }
}
</script>

根据 MIT 许可证发布。