DgTable 表格
封装了 el-table 和 el-pagination 的表格组件。封装了表格获取数据请求的细节,自动分页处理,字段数据配置化等。
基础使用
:::demo
<template>
<dg-table style="height: 300px" :api="api" :columns="columns" />
</template>
<script>
export default {
data() {
return {
api: this.$api.getTableList, // 实际是import引入使用,此处示例是由于demo container的限制使用hack的演示
columns: [
{ align: 'left', isVisible: true, prop: 'date', label: '日期' },
{ align: 'left', isVisible: true, prop: 'name', label: '姓名' },
{ align: 'left', isVisible: true, prop: 'address', label: '地址' },
],
}
},
}
</script>
:::
序号
:::demo 在 columns 的列配置里 type 属性设置为 order 开启序号列, 序号列与 element 的序号不同,此序号列在跳页后不重新计数。
<template>
<dg-table style="height: 300px" :api="api" :columns="columns" />
</template>
<script>
export default {
data() {
return {
api: this.$api.getTableList,
columns: [
{ align: 'left', isVisible: true, type: 'order', label: '序号' },
{ align: 'left', isVisible: true, prop: 'date', label: '日期' },
{ align: 'left', isVisible: true, prop: 'name', label: '姓名' },
{ align: 'left', isVisible: true, prop: 'address', label: '地址' },
],
}
},
}
</script>
:::
全选&多选
:::demo 全选为选择所有数据(非当前页)。可以在 columns 的列配置里 type 属性设置为 checkbox 开启, 然后监听组件 select 方法获取选择项目的数据。默认情况下,收集的勾选列表或取消勾选列表为 row.id,如果需要收集其它 id,可以传 selectKey 属性指定。如果需要指定全选按钮的行为为选择当前页,可以传 selectAllBehaviour 的值为page
<template>
<div>
<el-button size="small" @click="handleResetSelect" type="primary">重置全选</el-button>
<dg-table
ref="table"
style="height: 300px"
:api="api"
:columns="columns"
@select="handleCheckBoxSelect"
selectKey="user_id"
/>
</div>
</template>
<script>
export default {
data() {
return {
api: this.$api.getTableList,
columns: [
{ align: 'left', isVisible: true, type: 'checkbox' },
{ align: 'left', isVisible: true, prop: 'date', label: '日期' },
{ align: 'left', isVisible: true, prop: 'name', label: '姓名' },
{ align: 'left', isVisible: true, prop: 'address', label: '地址' },
],
}
},
methods: {
handleCheckBoxSelect({ isAll, checkedList, uncheckedList, selection }) {
// 如果isAll为true, 那么uncheckedList就是取消勾选列表
// 如果isAll位false,那么checkedList就是勾选列表
console.log(isAll, checkedList, uncheckedList)
// selectAllBehaviour为page时才有这个字段回传,为选中的row的集合, v1.9.3新增
console.log(selection)
},
handleResetSelect() {
this.$refs.table.resetSelectData()
},
},
}
</script>
:::
操作列
:::demo 传入按钮配置给 button-group 属性即可开启操作列,操作列宽度按照按钮数量自适应宽度。
<template>
<dg-table style="height: 300px" :api="api" :columns="columns" :button-group="buttonGroup" />
</template>
<script>
export default {
data() {
return {
api: this.$api.getTableList,
columns: [
{ align: 'left', isVisible: true, prop: 'date', label: '日期' },
{ align: 'left', isVisible: true, prop: 'name', label: '姓名' },
{ align: 'left', isVisible: true, prop: 'address', label: '地址' },
],
buttonGroup: [
{
type: 'primary', // el-button的type属性
handler: this.handleEdit, // 此按钮的回调
name: '编辑', // 按钮名,可传一个函数,返回值为按钮名字。函数接受row为参数, 类型为Function或String
disabled: (row, index) => true, // 按钮禁用状态,类型为Function或Boolean
isConfirm: true, // 使用dg-confirm-button
confirmMsg: '确定此操作吗?' // 弹框提示内容
visible: (row) => true // 显示\隐藏按钮。可选,类型为Function或Boolean。不传为显示
},
{
type: 'danger',
handler: this.handleDelete,
name: row => '删除',
},
],
}
},
methods: {
handleEdit(row) {
alert('编辑')
console.log(row)
},
handleDelete(row) {
alert('删除')
console.log(row)
},
},
}
</script>
:::
自定义列
:::demo 在 columns 的列配置里 type 属性设置为 slot 可开启此列的命名作用域插槽。插槽名为此列配置的 prop 属性值。回传给父作用域参数为 row
<template>
<dg-table style="height: 300px" :api="api" :columns="columns">
<template v-slot:status="{ row }">
<el-switch v-model="row.status" @change="onSwitchEnable(row)" :active-value="1" :inactive-value="0" />
</template>
</dg-table>
</template>
<script>
export default {
data() {
return {
api: this.$api.getTableList,
columns: [
{ align: 'left', isVisible: true, prop: 'date', label: '日期' },
{ align: 'left', isVisible: true, prop: 'name', label: '姓名' },
{ align: 'left', isVisible: true, prop: 'address', label: '地址' },
{ align: 'left', isVisible: true, prop: 'status', label: '状态', type: 'slot' },
],
}
},
methods: {
onSwitchEnable(row) {
console.log(row)
},
},
}
</script>
使用render自定义列
通过给
columns数据的项,设置一个函数render,可以自定义渲染当前列,包括渲染自定义组件,它基于 Vue 的 Render 函数。render函数传入两个参数,第一个是h,第二个是对象,包含row、column和index,分别指当前单元格数据,当前列数据,当前是第几行。
const columns = [
{
prop: 'sp_st',
label: '样品状态',
},
{
type: 'options',
label: '操作',
width: 400,
render: (h, { row }) => {
return h('div', [
h(AuthButton, {
type: 'primary',
name: '解读',
size: 'small',
hidden: !['待解读', '待审核'].includes(row.sp_st),
onClick: () => {
router.push({ name: 'InterpretReport', params: { id: row.sample_id } })
},
}),
])
},
},
]
:::
可编辑列
:::demo 在 columns 的列配置里 type 属性设置为 editable 开启可编辑列,双击此列单元格进入编辑模式,编辑完成触发cellValueChanged事件
<template>
<dg-table style="height: 300px" :api="api" :columns="columns" @cellValueChanged="handleCellValueChanged">
</dg-table>
</template>
<script>
export default {
data() {
return {
api: this.$api.getTableList,
columns: [
{ align: 'left', isVisible: true, prop: 'date', label: '日期' },
{ align: 'left', isVisible: true, prop: 'name', label: '姓名', type: 'editable' }, // 可编辑列
{ align: 'left', isVisible: true, prop: 'address', label: '地址' },
{ align: 'left', isVisible: true, prop: 'status', label: '状态', type: 'slot' },
],
}
},
methods: {
handleCellValueChanged(row, column, cellValue) {
console.log(row, column, cellValue)
},
},
}
</script>
:::
Typescript类型
:::demo
<script lang="ts">
import { SelectData, Column } from '@degon/admin-component-vue3'
</script>
:::
Attributes
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|---|---|---|---|---|
| api | 获取表格列表接口 | Function<Promise> | - | - |
| rq | 获取表格列表传给 api 的参数 | Object | - | - |
| columns | 表格的列字段配置,具体查看其它-columns 配置说明,必传 | Array<Column> | - | - |
| buttonGroup | 操作列按钮组配置,具体查看操作列 demo,不传时没有操作列。 | Array<Object> | - | - |
| buttonGroupWidth | 手动设置操作列按钮组宽度,传 0 或 null,则自动计算 | Number | - | 0 |
| height | 传入 el-table height 属性,默认值为 100%,传 null 时,内容自动撑开表格 | String、Number | - | '100%' |
| selectKey | 全选数据的 key | String | - | 'id' |
| selectAllBehaviour v1.9.3 | 全选按钮的行为, all为选择数据库所有数据,page为选择当前页数据 | String | - | 'all' |
| selectable | 仅对 type=checkbox 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选 | Function | - | (row, index) => true |
| hasPagination | 是否需要分页 | Boolean | - | true |
| initPage | 默认第几页 | number | - | 1 |
| initPageSize | 默认每页几条数据 | number | - | 10 |
| lazyload | 懒加载,true时mounted不请求api获取数据,默认为false | Boolean | true、false | false |
| el-table 属性 | 支持传入除 data 属性外的其它 el-table 组件属性,具体查看element-ui 文档 | - | - | - |
Methods
| 方法名 | 说明 | 参数 |
|---|---|---|
| refresh | 刷新表格数据(重新请求 api,请求参数为 rq 和分页参数, Object.assign({page, per_page}, rq)) | - |
| search | 搜索表格数据(请求参数为 rq 和分页参数, page 参数重置为 1, Object.assign({page, per_page}, rq, { page: 1 })) | - |
| resetSelectData | 重置 selectData | params, 对象,可选,初始 selectData |
| validateSelectData | 校验是否勾选了checkbox, 通过返回Promise<SelectData>, 失败返回reject Promise | alertMsg, 字符串,可选,传入时校验失败显示提示 |
| doLayout | 执行重新计算buttonGroup按钮列的宽度,然后调用el-table的doLayout方法。在需要显示/隐藏表格且表格数据有变化时可能需要调用该方法 | - |
| setCurrentPage | 设置当前为第几页 | page, 数字 |
Scoped Slot
| name | 说明 | 参数 |
|---|---|---|
| 字段名 | 自定义列的内容 | { row } |
Events
| 事件名 | 说明 | 参数 |
|---|---|---|
| select | 当用户勾选了 checkbox 时触发的事件 | { isAll, checkedList, uncheckedList } |
| data | 调用完api后触发的事件 | 列表数据 |
| cellValueChanged | 可编辑列,编辑单元格内容触发 | row, column, cellValue |
其它
columns 配置说明
columns 的类型是对象数组(Array<Object>), 对象结构如下, 其中大部分属性为el-table-column 的属性
| 属性 | 说明 | 类型 | 可选值 |
|---|---|---|---|
| type | 决定该列的类型,可选 | string | 'slot', 'order', 'checkbox', 'editable' |
| isVisible | 是否显示该列, 可选 | Boolean | true, false |
| prop | el-table-column 的 prop 属性, 必选 | Sring | - |
| label | el-table-column 的 label 属性,必选 | Sring | - |
| formatter | el-table-column 的 formatter 属性 | Function | - |
| showOverflowToolTip | el-table-column 的 show-overflow-tooltip 属性 | Boolean | true, false |
| isFixed | el-table-column 的 fixed 属性 | Boolean, Sring | true, left, right |
| align | el-table-column 的 align 属性 | String | left/center/right |
| minWidth | el-table-column 的 min-width 属性 | Sring | - |
| width | el-table-column 的 width 属性 | Sring | - |
| render | 自定义渲染列,使用 Vue 的 Render 函数。传入两个参数,第一个是 h,第二个为对象,包含 row、column 和 index,分别指当前行数据,当前列数据,当前行索引,详见示例。 | Function | - |
| $attrs | 除了上述配置,其它el-table-column组件的属性和事件监听,可通过此属性传入。可用属性和事件查看官方文档。 | object | - |
