- element-ui使用的是插槽的方式,默认是不支持render。
下面将对表格进行二次封装,支持render。 - 1. 创建myTable.vue文件
<template>
<div>
<el-table
v-loading="data.loading"
:element-loading-text="data.loadingText"
ref="table"
:height="height"
:size="middleSize ? 'medium' : 'small'"
:data="data.list"
:max-height="680"
:row-class-name="rowClassName"
:stripe="stripe"
:show-header="showHeader"
:header-cell-style="{ background: '#F5F5F5' }"
@selection-change="handleSelectionChange"
:style="{ opacity: hasTableData }"
>
<!-- 多选框 -->
<el-table-column v-if="isCheckbox" type="selection"></el-table-column>
<el-table-column
v-for="item in data.columns"
:key="item.index"
:type="item.type"
:index="item.index"
:column-key="item.columnKey"
:label="item.label"
:prop="item.prop"
:width="item.width"
:min-width="item.minWidth"
:fixed="item.fixed"
:header-align="item.headerAlign"
:align="item.align"
:show-overflow-tooltip="item.showOverflowTooltip"
>
<template slot="header">
<span>{{ item.label }}</span>
</template>
<template slot-scope="scope">
<expand-dom v-if="item.render" :render="item.render" :row="scope.row" :index="scope.$index" :column="item"></expand-dom>
<span v-else>{{ scope.row[item.prop] || '' }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
props: {
data: {
type: Object,
},
isCheckbox: {
type: Boolean,
default: false,
},
height: {
type: Number,
default: 660,
},
stripe: {
type: Boolean,
default: false,
},
showHeader: {
type: Boolean,
default: false,
},
middleSize: {
type: Boolean,
default: false,
},
hasTableData: {
type: Number,
default: 1,
},
},
components: {
expandDom: {
functional: true,
props: {
row: Object,
render: Function,
index: Number,
column: {
type: Object,
default: null,
},
},
render: (h, context) => {
const params = {
row: context.props.row,
index: context.props.index,
};
if (context.props.column) params.column = context.props.column;
return context.props.render(h, params);
},
},
},
methods: {
// 选中方法回调
handleSelectionChange(selection) {
// 选中事件
this.$emit('select-change', selection);
},
// 可以根据表格数据的某个字段,修改某行的样式
rowClassName(row, index) {
return 'table-content';
},
},
};
</script>
上面对table进行了封装,这里没有加入分页,有需要的可以自己添加。
- 2. 创建ColumnConfig.js文件,进行表格列的配置
const userColumn = [
{
index: 0,
label: '姓名',
prop: 'name',
fixed: 'left',
},
{
index: 1,
label: '年龄',
prop: 'age',
fixed: 'left',
},
{
index: 2,
label: '性别',
prop: 'gender',
fixed: 'left',
}
];
export { userColumn }
- 使用, test.vue
<template>
<div>
<my-table :data="data" :isCheckbox="true" showHeader stripe @select-change="handleSelectChange"> </my-table>
</div>
</template>
<script>
import { userColumn } from '../../config/ColumnConfig';
export default {
components: {
MyTable: () => import('@/components/common/MyTable.vue')
},
data() {
return {
data: {
loading: false,
loadingText: '正在加载...',
list: [],
// 这里最好使用深拷贝
columns: userColumn
},
// 多选项
selection: []
}
},
created() {
this.getList();
},
mounted() {
this.initHandleColumn();
},
methods: {
getList() {
// 这里请求数据
this.data.list = [
{
name: '张三',
age: 18,
},
{
name: '李四',
age: 18,
}
]
},
handleSelectChange(selection) {
this.selection = selection;
},
initHandleColumn() {
const that = this;
this.data.columns.push({
label: '操作',
prop: 'action',
render: (h, { row, index, column }) => [
h(
'a',
{
style: {
padding: '0 8px',
fontSize: '12px',
borderRight: 'none'
},
on: {
click() {
that.doDelete(row);
}
}
},
'删除'
)
]
});
},
doDelete(row){
// 删除操作
}
}
}
</script>
<style>
</style>
-
效果
以上就是对表格的封装和使用,只是一个简单的例子。可以根据需求进行扩展。