vue iview table实现动态自定义表头
一、前言
众所周知,iview中有一个表格组件Table,用于展示多条结构类似的数据。之前遇到过一个需求,要手动控制table的表头显示。就是假如table表格一共有10列数据,可以通过设置勾选,决定显示多少列
二、代码
为了代码的复用性,将配置页面单独抽成了组件,所以代码中会有组件之间传值
父组件(表格页面)
<template>
<div>
<!-- 渲染table表格 -->
<TableComponent :allColList='allColList' :tableData='tableData' :defaultCheckList='defaultCheckList' @confirm="handleConfirm"></TableComponent>
</div>
</template>
<script>
import TableComponent from '@/components/TableComponent.vue'
export default {
name:'tableShow',
components:{
TableComponent
},
data(){
return {
// 所有表格列
allColList: [
{
type: "selection",
key: "selection",
width: 60,
align: "center",
},
{
title: "入口ID",
key: "enterId",
minWidth: 120,
align: "center",
tooptip: true,
},
{
title: "渠道",
key: "channel",
minWidth: 120,
align: "center",
},
{
title: "品牌",
key: "brand",
minWidth: 120,
align: "center",
},
{
title: "入口名",
key: "enterName",
minWidth: 120,
align: "center",
tooptip: true,
},
{
title: "状态",
key: "status",
minWidth: 120,
align: "center",
},
{
title: "更新人",
key: "updatedBy",
minWidth: 120,
align: "center",
},
],
//默认列
defaultCheckList:["enterId","channel","enterName"],
tableData: [
{
enterId: "1234wert",
channel: "手机",
brand: "小米",
enterName: "个性化视频专辑",
status: "上线",
updatedBy: "admin",
},
],
}
},
methods:{
// 提交确定事件 实际工作中会调接口
handleConfirm(val) {
this.defaultCheckList = val;
},
}
}
</script>
子组件(配置页面)
<template>
<div>
<div class="dropdown">
<Dropdown trigger="custom" placement="bottom-end" :visible="visible">
<a href="javascript:void(0)" @click="handleOpen">
自定义Table列
<Icon type="ios-arrow-down"></Icon>
</a>
<DropdownMenu slot="list" style="width: 240px">
<div style="padding: 10px 15px;">
<div style="border-bottom: 1px solid #e9e9e9;padding-bottom:6px;margin-bottom:6px;">
<Checkbox
:indeterminate="indeterminate"
:value="checkAll"
@click.prevent.native="handleCheckAll"
>全选</Checkbox>
</div>
<CheckboxGroup
v-model="checkAllGroup"
@on-change="checkAllGroupChange"
>
<Checkbox v-for="item in allCheckList" :key='item.key' :label="item.key">{{item.title}}</Checkbox>
</CheckboxGroup>
</div>
<div class="btnGroup">
<Button type="primary" @click="confirm" :disabled="checkAllGroup.length < 1">确认</Button>
<Button @click="handleClose">关闭</Button>
</div>
</DropdownMenu>
</Dropdown>
</div>
<Table ref="table" border :columns="showColList" :data="tableData"> </Table>
</div>
</template>
<script>
export default {
name: "tableComponent",
data() {
return {
//实际显示的表格列
showColList: [],
//是否显示配置弹出窗
visible: false,
indeterminate: true,
checkAll: false,
// 选中表格列
checkAllGroup: [],
//所有供选择的项
allCheckList:[],
// 默认显示的列
defaultColCheckList: [],
};
},
props:{
//所有table列
allColList:{
type:Array,
require:true
},
//table数据
tableData:{
type:Array,
default:() => []
},
//默认被选择的项
defaultCheckList:{
type:Array,
default:() => []
}
},
computed: {},
created(){
console.log('我是生命钩子函数created');
this.init();
},
watch:{
defaultCheckList(newValue, oldValue){
console.log('我是监听器函数checkList');
console.log(newValue)
console.log(oldValue)
this.init();
}
},
methods: {
init(){
console.log('我是初始化方法init');
this.allCheckList = this.allColList.filter(item => {
if(!item.type){
return item
}
})
if(this.defaultCheckList.length > 0){
this.defaultColCheckList = this.defaultCheckList;
}else{
this.defaultColCheckList = this.allCheckList.map(item => {
return item.key
})
}
this.dealTableColumn(this.defaultColCheckList);
},
/**
* 重新渲染table表格
*/
dealTableColumn(arr) {
this.showColList = [];
this.allColList.forEach((item) => {
if (arr.indexOf(item.key) > -1) {
this.showColList.push(item);
}
});
},
/**
* 显示配置弹窗
*/
handleOpen() {
this.visible = true;
this.checkAllGroup = this.defaultColCheckList;
if(this.checkAllGroup.length == this.allCheckList.length){
this.indeterminate = false;
this.checkAll = true;
}
},
/**
* 隐藏配置弹窗
*/
handleClose() {
this.visible = false;
this.checkAllGroup = [];
},
/**
* 全选时处理逻辑
*/
handleCheckAll() {
if (this.indeterminate) {
this.checkAll = false;
} else {
this.checkAll = !this.checkAll;
}
this.indeterminate = false;
if (this.checkAll) {
this.checkAllGroup = this.allColList.map(item => {
return item.key
})
} else {
this.checkAllGroup = [];
}
},
/**
* 选项发生变化时处理逻辑
*/
checkAllGroupChange(data) {
if (data.length === this.allCheckList.length) {
this.indeterminate = false;
this.checkAll = true;
} else if (data.length > 0) {
this.indeterminate = true;
this.checkAll = false;
} else {
this.indeterminate = false;
this.checkAll = false;
}
},
/**
* 确认提交配置项
*/
confirm(){
// this.dealTableColumn(this.checkAllGroup);
// this.defaultColCheckList = this.checkAllGroup;
this.$emit('confirm', this.checkAllGroup)
this.visible = false;
}
},
};
</script>
<style scoped>
.dropdown {
display: flex;
justify-content: right;
margin:20px;
}
.ivu-checkbox-group-item{
display: block;
margin-top: 8px;
}
.btnGroup{
text-align: right;
margin-bottom: 10px;
}
.btnGroup button{
margin-right: 10px;
}
</style>
三、效果如下


浙公网安备 33010602011771号