avue 實現自定義列顯隱並保存,並且搜索表單、form表單、crud列順序互不影響。


目前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>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM