Table 表格
对 element-plus
的 el-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内的函数直接传入 |
actionButtons | array | [] | ["refresh", "add"] | 顶部左侧刷新按钮 |
size | string | small | large / default / small | 根据业务状态控制当前是否显示 |
columns | array | [] | - | 表单列信息,详见Table-column |
pagination | boolean | true | - | 是否显示分页 |
paginationProps | Object | {} | - | 分页配置,详见el-pagination |
emptyDesc | string | 暂无数据 | - | 数据为空展示 |
rowKey | string | `` | - | 表格数据pk |
afterFetch | Function | `` | - | 请求之后对返回值进行处理 |
searchParams | object | {} | - | 额外的请求参数 |
border | boolean | true | - | 是否显示边框 |
stripe | boolean | true | - | 是否显示斑马线 |
headerCellStyle | object | { background: "#f5f7fa",color: "#606266",} | - | 表头样式 |
showTableSetting | boolean | false | - | 是否显示表头右侧设置 |
showEasySearch | boolean | false | - | 是否显示表头右侧简易搜索 |
tableSetting | object | {} | - | 表头右侧设置,详见下方tableSetting |
isTreeTable | boolean | false | - | 是否树形表格 |
showIndexColumn | boolean | false | - | 是否显示序号,默认不显示 |
indexColumnProps | object | {} | - | 序号列属性 |
showSelectionColumn | boolean | false | - | 是否显示多选框 |
selectionColumnProps | object | {} | - | 多选框属性 |
useSearchForm | boolean | false | - | 是否开启高级搜索 |
immediate | boolean | true | - | 是否立即请求接口 |
formConfig | object | {} | - | 高级搜索表单配置,useSearchForm 属性为true 时生效。配置详见LdForm |
dataSource | array | [] | - | 表格数据,非 api 加载情况 |
tableSetting
{
size: false, //表格大小
setting: false, //列设置
}
Table 事件
事件 | 回调参数 | 说明 |
---|---|---|
expand-change | `row, (expandedRows | expanded)` |
selection-change | selection | 当选择项发生变化时会触发该事件 |
TableColumn 属性
Table-column 属性
全部继承于el-table column属性
见Table-column 属性
TableColumn 额外属性
属性 | 类型 | 默认值 | 可选值 | 说明 |
---|---|---|---|---|
slot | string | - | - | 自定义插槽 |
visible | boolean | true | false / true | 是否显示 |
ifShow | `boolean | ((action) => boolean)` | - | - |
customRender | Function({text, row, index, column}) {} | - | - | 生成复杂数据的渲染函数,参数分别为当前行的值,当前行数据,行索引行配置 |
format | Function(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
会被视为form
的slot
具体参考LdForm
内置组件
内置组件,仅用于表格内部使用
TableAction 组件
用于表格右侧操作列渲染
Props
属性 | 类型 | 默认值 | 可选值 | 说明 |
---|---|---|---|---|
actions | Array | - | - | 右侧操作列按钮列表,详见下方action 属性 |
dropDownActions | Object | - | - | 下拉菜单,详见下方dropDownActions |
actions 属性
属性 | 类型 | 默认值 | 可选值 | 说明 |
---|---|---|---|---|
label | String | - | - | 名称 |
auth | String/Array | - | - | 权限标识 |
icon | String | - | - | 按钮图标,详见IconSvg |
type | String | - | - | 按钮类型,详见el-button |
ifShow | boolean|((action) => boolean) | - | - | 根据业务状态控制当前是否显示 |
tooltip | String|ElTooltipProps | - | - | 按钮是否显示文字提示,传提示内容,或者ElTooltipProps 所有配置 |
popconfirm | ElPopconfirm | - | - | 气泡确认框,属性详见ElPopconfirm 所有配置 |
onClick | Fn | - | - | 按钮事件 |
dropDownActions 下拉菜单属性
属性 | 类型 | 默认值 | 可选值 | 说明 |
---|---|---|---|---|
label | String | - | - | 下拉菜单名,有传,文字后面自动加上ArrayDown 图标,没有传。显示三个原点图标 |
buttons | Array | - | - | 下拉操作组,详见dropDownItem |
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 },
},
]
dropDownActions 事件
方法名 | 说明 | 参数 |
---|---|---|
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>