背景
对于一张el-table,有时候为了看到更多有用信息,会想要隐藏掉某些不重要的列,好让更多有用信息集中在一页中。这个时候我们需要动态控制部分列的显示与隐藏。
如何实现
定义一个控制按钮
1 2 3 4 5 6
| <el-popover width="60" trigger="click" placement="right-end"> <el-checkbox-group v-model="columnSelect"> <el-checkbox v-for="item in columnHeaders" :label="item.title" :key="item.title"></el-checkbox> </el-checkbox-group> <el-button slot="reference" icon="el-icon-more" circle style="margin-left: 100px;"></el-button> </el-popover>
|
其中,v-model
绑定了默认选择显示的列,v-for
对应了所有可选的列,定义如下:
1 2 3 4 5
| columnHeaders: [ {index: 0, title: "备注", isShow: true}, ],
columnSelect: ["备注"]
|
表格中选择需要控制的列
1
| <el-table-column v-if="columnHeaders[0].isShow" label="备注" align="center" prop="remark" width="150"/>
|
同时,给表格一个ref:ref="dataTable"
效果如下:
数据绑定与监听
定义watch
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| watch: {
columnSelect(newArrayVal) { const nonSelect = this.columnHeaders .filter(item => newArrayVal.indexOf(item.title) === -1) .map(item => item.title); this.columnHeaders.filter(item => { let isNonSelected = nonSelect.indexOf(item.title) !== -1 if (isNonSelected) { item.isShow = false this.$nextTick(() => { this.$refs.dataTable.doLayout() }) } else { item.isShow = true this.$nextTick(() => { this.$refs.dataTable.doLayout() }) } }) } },
|
监听到已选择和未选择的列,调用doLayout()
方法对表格进行重绘。
效果