赞
踩
columnSetting // 是否显示列设置按钮
// name="TtableColumnSet" // 区分储存本地表头数据(保证其唯一性)
无需name属性来确定唯一性(内置md5唯一,确保prop不可重复)
<template>
<el-dropdown trigger="click" placement="bottom">
<el-button v-bind="columnBind">{{columnBind.btnTxt||'列设置'}}</el-button>
<el-dropdown-menu divided slot="dropdown">
<span class="title">{{columnBind.title||'列设置'}}</span>
<draggable class="t_table_column_setting_dropdown" v-model="columnSet">
<el-checkbox
v-for="(col, index) in columnSet"
:key="col.prop"
@click.native.stop
:checked="!col.hidden"
@change="checked => checkChanged(checked, index)"
>{{ col.label }}</el-checkbox>
</draggable>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
import draggable from 'vuedraggable'
import md5 from 'blueimp-md5'
export default {
name: 'ColumnSet',
components: {
draggable
},
props: {
columns: {
type: Array,
default: () => []
},
columnSetBind: {
type: Object,
default: () => { }
}
},
data() {
return {
columnSet: null
}
},
mounted() {
this.columnSet = this.getColumnSetCache()
this.$emit('columnSetting', this.columnSet)
},
computed: {
columnBind() {
const columnSetBind = { btnTxt: '列设置', title: '列设置', ...this.columnSetBind }
return { size: 'small', icon: 'el-icon-s-operation', ...this.$attrs, ...columnSetBind }
},
localStorageKey() {
// 配置数据缓存唯一标记
return `t-ui:TTable.columnSet-${md5(
this.columns.map(({ prop }) => prop).join()
)}`
}
},
watch: {
columnSet(n) {
this.$emit('columnSetting', n)
localStorage.setItem(this.localStorageKey, JSON.stringify(n))
}
},
methods: {
// 获取缓存数据
getColumnSetCache() {
let value = localStorage.getItem(this.localStorageKey)
let columnOption = this.initColumnSet()
let valueArr = JSON.parse(value) || []
// 动态显示追加的列
columnOption.map(item => {
let findEle = valueArr.find(ele => ele.label === item.label && ele.prop === item.prop)
item.hidden = findEle ? findEle.hidden : false
})
// 动态默认勾选列选项
this.initColumnSet().map(val => {
columnOption.map(item => {
if (Object.hasOwn(val, 'isShowHidden')) {
if (val.label === item.label && val.prop === item.prop && val.isShowHidden) {
item.hidden = val.isShowHidden
}
if (val.label === item.label && val.prop === item.prop && !val.isShowHidden) {
item.hidden = val.isShowHidden
}
}
})
})
value = JSON.stringify(columnOption)
// console.log('最终--', value ? JSON.parse(value) : this.initColumnSet())
return value ? JSON.parse(value) : this.initColumnSet()
},
initColumnSet() {
const columnSet = this.columns.map((col, index) => (col.isShowHidden ? {
label: col.label,
prop: col.prop,
hidden: false,
isShowHidden: col.isShowHidden
} : {
label: col.label,
prop: col.prop,
hidden: false
}))
// console.log('initColumnSet---', columnSet)
return columnSet
},
checkChanged(checked, index) {
this.$set(this.columnSet, index, { ...this.columnSet[index], hidden: !checked })
let obj = {}
this.columnSet.map(val => {
val.hidden in obj || (obj[val.hidden] = [])
obj[val.hidden].push(val.hidden)
})
if (obj.false && obj.false.length < 2) {
this.columnSet.map((val, key) => {
if (!val.hidden) {
this.$set(this.columnSet, key, { ...this.columnSet[key] })
}
})
} else {
this.columnSet.map((val, key) => {
if (!val.hidden) {
this.$set(this.columnSet, key, { ...this.columnSet[key] })
}
})
}
}
}
}
</script>
<style lang="scss" scoped>
.el-dropdown-menu {
padding: 15px;
font-size: 14px;
.title {
font-weight: bold;
}
::v-deep .el-checkbox__input.is-checked + .el-checkbox__label {
color: #262626;
}
.t_table_column_setting_dropdown {
display: flex;
flex-direction: column;
max-height: 300px;
overflow-y: auto;
}
}
</style>
主要是:elementUI给了一个自定义节点的插槽,而antd没有,需要增加许多操作,才能满足
故:用了这个第三方插件
<!--列设置按钮-->
<column-set
v-if="columnSetting"
v-bind="$attrs"
:columns="columns"
@columnSetting="v => columnSet = v"
/>
计算属性中需要添加以下代码
computed: {
columnByProp () {
return this.columns.reduce((acc, cur) => {
acc[cur.prop] = cur
return acc
}, {})
},
renderColumns () {
return this.columnSet.length > 0 ? this.columnSet.reduce((acc, cur) => {
if (!cur.hidden) {
acc.push(this.columnByProp[cur.prop])
}
return acc
}, []) : this.columns
}
elementUi的columns配置是{prop: ‘name’, label: ‘姓名’}
antdUi的columns配置是{dataIndex: ‘name’, title: ‘姓名’}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。