zoukankan      html  css  js  c++  java
  • 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{ 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>

      

  • 相关阅读:
    Asp.Net Core 轻松学-被低估的过滤器
    Asp.Net Core 轻松学-利用文件监视进行快速测试开发
    Asp.Net Core 轻松学-利用xUnit进行主机级别的网络集成测试
    Asp.Net Core 轻松学-HttpClient的演进和避坑
    Asp.Net Core 轻松学-基于微服务的后台任务调度管理器
    Asp.Net Core 轻松学-一行代码搞定文件上传
    .NET Core 2.2 新增部分功能使用尝鲜
    Asp.NetCore轻松学-业务重点-实现一个简单的手机号码验证
    Asp.Net Core 轻松学-实现跨平台的自定义Json数据包
    Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档
  • 原文地址:https://www.cnblogs.com/Godfather-twq/p/15273223.html
Copyright © 2011-2022 走看看