目前avue提供的列顯隱並沒有保存的功能,也沒有提供相應的插槽等一些自定義修改方法,所以想要實現該功能需要寫一個自定義組件並插入在avue crud組件中。
原理改變option中column中字段順序來控制列的順序,通過hide屬性實現顯隱。

第一步
在對應的右邊按鈕插槽位置放一個自定義組件
<template slot="menuRight">
<showHidden :column.sync="option.column" :moduleType="102" >
</showHidden>
</template>
第二步
准備相應的數據,avue文檔中沒有寫的屬性,通過看源碼可以知道order 和searchOrder的作用。
{
order:19,//form表單排序
searchOrder:19,//搜索表單排序
showColumn:true,//參與自定義列顯隱
label: '項目名稱',
prop: 'projectId',
required: true,
rules: [
{
required: true,
message: '請選擇項目名稱'
}
]
},
第三步
寫自定義列組件
<template>
<span class="showHidden20210901">
<el-tooltip class="item" effect="dark" content="顯隱" placement="top">
<el-button size="small" icon="el-icon-s-operation" circle @click="openDrawer"
>
</el-button>
</el-tooltip>
<el-drawer
id="showHidden20210901drawer"
:visible.sync="showDrawer"
append-to-body
size="50%"
:before-close="handleClose">
<template slot="title">
<div>
<div>
自定義顯示列
</div>
</div>
</template>
<div class="flex-box">
<div style="flex-shrink: 1;
flex-grow: 1;overflow: hidden;">
<el-divider></el-divider>
<el-transfer
filterable
:titles="titles"
:filter-method="filterMethod"
filter-placeholder="請輸入搜索內容"
v-model="value"
@change="showColumnChange"
:data="transferData">
</el-transfer>
</div>
<div class="footer">
<el-button type="primary" @click="saveOption" style="margin-right:15px;padding:12px 35px;">保 存</el-button>
<el-button type="primary" @click="tableInitializeConfig">恢復默認</el-button>
</div>
</div>
</el-drawer>
</span>
</template>
<script>
import {tableSubmitConfig,tableInitializeConfig,getPersonalConfig} from "@/api/wel/home.js";
export default {
props:{
// 表格列配置
column:{
type:Array,
default:() => {
return [];
},
},
// 類型
moduleType:{
type:Number,
default:0,
}
},
data(){
return{
titles:['隱藏',"顯示"],
showDrawer:false,
transferData:[],
value: [],
}
},
created(){
//數組去除空元素方法,下面排序的時候會用到
Array.prototype.removeEmptyEle = function(arr){
for(var i = 0; i < arr.length; i++) {
if(arr[i] == undefined || arr[i] == "" || arr[i] == null) {
arr.splice(i,1);
i = i - 1; // i - 1 ,因為空元素在數組下標 2 位置,刪除空之后,后面的元素要向前補位,
// 這樣才能真正去掉空元素,覺得這句可以刪掉的連續為空試試,然后思考其中邏輯
}
}
return arr;
};
// 獲取配置 並修改列表設置
getPersonalConfig({moduleType:this.moduleType}).then(res=>{
let configColumn = res.data.personalConfig.split(",");
let topColumn = [];
let downColumn = [];
this.column.forEach(ele=>{
if(ele.showColumn){
let columnIndex = configColumn.indexOf(ele.prop);
if(columnIndex>-1){
ele.hide = false;
topColumn[columnIndex] = ele;
}else{
ele.hide = true;
downColumn.push(ele);
}
}
});
topColumn = topColumn.removeEmptyEle(topColumn);
let allColumn = topColumn.concat(downColumn);
this.column = allColumn;
this.$emit('update:column',allColumn);//給表格更新
this.generateData();
})
},
methods:{
// 顯示 右側的內容發生變化的時候
showColumnChange(e){
console.log(e)
let downData = [];
let topData = [];
this.transferData.forEach(ele=>{
if(this.value.indexOf(ele.key)>-1){
topData.push(ele);
}else{
downData.push(ele);
}
})
let allData = topData.concat(downData);
console.log(allData)
setTimeout(()=>{
this.transferData = allData;
},0)
},
// 處理可選擇數據
generateData(){
const data = [];//全部數據
let value = [];//顯示的數據
this.column.forEach(ele=>{
if(ele.showColumn){//參與選擇顯示的字段
data.push({
label: ele.label,
key: ele.prop,
pinyin: ele.prop,
});
if(!ele.hide){
value.push(ele.prop)
}
}
})
this.transferData = data;
this.value = value;
},
// 恢復默認配置
tableInitializeConfig(){
tableInitializeConfig({moduleType:this.moduleType}).then(res=>{
if(res.success){
let configColumn = res.data.split(",");//顯示的數據
let value = [];
let topData = [];
let downData = [];
let toptransferData = [];
let downtransferData = [];
let column = JSON.parse(JSON.stringify(this.column));
column.forEach(ele=>{
if(ele.showColumn){
let temObj = {
label: ele.label,
key: ele.prop,
pinyin: ele.prop,
};
let index = configColumn.indexOf(ele.prop);
if(index >-1 ){
toptransferData[index] = temObj;
value[index] = ele.prop;
ele.hide = false;
topData[index] = ele;
}else{
downtransferData.push(temObj);
ele.hide = true;
downData.push(ele);
}
}
})
topData = topData.removeEmptyEle(topData);
let allData = topData.concat(downData);
let allTransferData = toptransferData.concat(downtransferData);
setTimeout(()=>{
this.transferData = allTransferData;
this.value = value;//顯示的列
console.log(value)
this.$emit('update:column',allData);//給表格更新
},0)
this.$message({
message: '操作成功!',
type: 'success'
});
}
})
},
// 保存設置
saveOption(){
let topData = [];
let downData = [];
let column = JSON.parse(JSON.stringify(this.column))
column.forEach(ele=>{
let index = this.value.indexOf(ele.prop);
if(index >-1 ){
ele.hide = false;
topData[index] = ele;
}else{
ele.hide = true;
downData.push(ele);
}
})
topData = topData.removeEmptyEle(topData);
let allData = topData.concat(downData);
let personalConfig = this.value.join(',');
tableSubmitConfig({moduleType:this.moduleType,personalConfig:personalConfig}).then(res=>{
if(res.success){
this.$emit('update:column',allData);
this.$message({
message: '操作成功!',
type: 'success'
});
}
})
},
// 關閉彈窗
handleClose(){
this.showDrawer = false;
},
// 打開彈窗
openDrawer(){
this.generateData();
this.showDrawer = true;
},
// 模糊搜索
filterMethod(query, item) {
return item.label.indexOf(query) > -1;
}
}
}
</script>
<style lang="scss" >
.showHidden20210901{
}
#showHidden20210901drawer{
.el-drawer__header{
margin-bottom: 0px ;
}
.el-transfer__buttons{
display: flex;
flex-direction: column;
justify-content: center;
}
.el-button{
margin-left: 0;
}
.el-transfer-panel{
width: 50%;
}
.el-transfer-panel__body{
height: calc(100vh - 300px);
}
.el-transfer-panel__list.is-filterable{
height: calc(100vh - 400px);
}
// .avue-crud__dialog .el-transfer-panel__body, .avue-crud__dialog .el-transfer-panel__list.is-filterable{
// height: 100%;
// }
// .el-transfer-panel__list.is-filterable
.el-transfer{
position: relative;
padding: 0 20px;
height: calc(100vh - 300px);
}
.footer{
display: flex;
justify-content: center;
flex-shrink: 0;
flex-grow: 0;
height: 200px;
margin-top: 30px;
align-items: center;
// border: 1px solid #f00;
}
.flex-box{
// height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
}
</style>
