首頁 > 軟體

vue+elementUI-el-table實現動態顯示隱藏列方式

2023-01-14 14:00:54

elementUI-el-table動態顯示隱藏列

在實際工作場景中,我們在展示資料時,會遇到展示資料過多此時會將資料分頁展示,但是如果資料列展示過多,會造成每列資料相對比較擁擠,並且所有的列資料不一定都是必須展示的。

可以將其先隱藏,使用者需要時才將其顯示在列表之中。所以本文章結合vue+elementUI--中的el-table以及分頁實現表格列的動態隱藏與顯示。

實現思路:將表格展示+分頁+顯示/隱藏列  元件化,其中利用slot動態展示不同的表格資料,父元件參照此元件傳遞相應切必須的引數,當分頁或顯示/隱藏列動態變化時將資料再返回父元件,父元件中的列根據回傳的資料利用v-if實現列的顯示與隱藏(此程式碼為第一版!)

主要程式碼如下

子元件(trendsTable.vue)主要程式碼:

<!-- create by crystalSong 分頁+table+動態設定表格列的隱藏與顯示 -->
<template>
  <div class='trends_container'>
      <div class="table_container">
            <el-table ref="trendsTable" :data="tableList" fit stripe style="width: 100%" border
            @selection-change="handleSelectionChange">
                <slot></slot>//此處用於列表靈活展示
            </el-table>
      </div>
      <div class="pagination_trends_wrap">
            <div class="trends_oprt_wrap">
//將所有列展示在此,可以點選進行隱藏與顯示
                <el-popover placement="top-start" width="280" trigger="click">
                    <div class="trends_btn_wrap">
                        <el-checkbox-group v-model="visibleList" size="small" @change="visibleListChange">
                            <el-checkbox 
                            v-for="(col, index) in columnList" :key="index"
                            :label="col.label"
                            border
                            >{{col.value}}</el-checkbox>
                        </el-checkbox-group>
                    </div>
                    <el-button slot="reference" size="small">隱藏/顯示列</el-button>
                </el-popover>
            </div>
            <div class="pagination_wrap" v-if="total > 0">
//分頁區域
                <template>
                    <el-pagination style="text-align: right;" @size-change="handleSizeChange"
                    @current-change="handleCurrentChange" :current-page.sync="currentPage"
                    :page-sizes="[10,25,50,100]" :page-size.sync="currentSize"
                    layout="total, sizes, prev, pager, next, jumper" :total="total" background>
                    </el-pagination>
                </template>
            </div>
      </div>
  </div>
</template>

<script>
  export default {
    name: 'trendsTable',
    props: {
        tableList:{//列表資料
            type: Array,
            require: true,
            default: _ => []
        },
        hideColumnIndexs:{//需要隱藏的列的下標即表格資料的序號從0開始
            type: Array,
            default: _ => []
        },
        pageSize:{//每頁幾條資料
            type:Number,
            default:10,
        },
        pageNumber:{//當前頁碼
            type:Number,
            default:1,
        },
        total:{//總資料條數
            required: true,
            type:Number,
            default:0,
        },
    },
    components: {},
    data() {
        return {
            visibleList:[],//顯示/隱藏列的選中下標資料集合
            columnList:[],//表格所有列名稱資料列表
        };
    },
    created() {
        
    },
    mounted() {
        let _this = this;
        var curHideList = [];
//頁面初始化:動態獲取表格有用的所有列生成並放入複選列表並記錄初始隱藏列
        this.$refs.trendsTable.$children.forEach((obj,index) => { 
            if(obj.type){
                _this.columnList.push(
                    {
                        'label':index,
                        'value':obj.type == 'selection' ? '選擇' : obj.label,
                    }
                );
                // 記錄初始展示的列
                if (_this.hideColumnIndexs.indexOf(index) === -1) {
                    _this.visibleList.push(index)
                    curHideList[index] = false;
                }else{
                    curHideList.push(true);
                }              
            }
        });
//此向父元件傳遞列是否隱藏的陣列
        _this.$emit('getHideColist',curHideList);
    },
    methods: {
       visibleListChange(item){
            // console.log('change',item)
            var curHideList = [];
            this.columnList.forEach((obj,index) => { 
                curHideList[index] = false;
                // 更改顯示隱藏列
                if (item.indexOf(index) === -1) {
                    curHideList[index] = true;
                } 
            });
            this.$emit('getHideColist',curHideList);
        },
    },
    computed: {
 
    },
    watch: {},
  }
</script>
<style lang='less' scoped>
    .trends_container{
        .pagination_trends_wrap{
            margin: 20px 0;
            position: relative;
        }
        .trends_oprt_wrap{
            display: inline-block;
            vertical-align: top;
            width: 100px;
        }
        .pagination_wrap{
            display: inline-block;
            vertical-align: top;
            width: calc(100% - 105px);
            margin: 0 !important;
        }
    }
</style>
<style lang="less">
    .trends_btn_wrap{
        .el-checkbox-group{
            label{
                margin: 0 !important;
                margin: 0 10px !important;
                margin-bottom: 15px !important;
            }
        }
    }
    .table_container .el-table .cell{
        text-overflow: initial !important;
    }
</style>

參照此元件時主要程式碼:

// 引入-table-元件
import TrendsTable from "@/components/trendsTable.vue";

主要程式碼就是根據子元件返回的陣列利用v-if進行判斷 

<trends-table :tableList="onrenewalTableList"
                    :hideColumnIndexs='[]' ref="trendtable"
                    :pageSize.sync="onrenewalForm.pageSize"
                    :pageNumber.sync="onrenewalForm.pageNumber"
                    :total="mbePageTotal"
                    @getHideColist="getHideColist"
                    @pagination = "paginationHadle"
                    @selection-change="handleSelectionChange"
                    >
                      <el-table-column
                       v-if="!columnHideList[0]"
                        type="selection"
                        width="55">
                      </el-table-column>
                      <el-table-column
                        v-if="!columnHideList[1]"
                        type="index"
                        label="序號"
                        width="50">
                        <template slot-scope="scope">
                          {{ (onrenewalForm.pageNumber - 1) * onrenewalForm.pageSize + (scope.$index + 1)}}
                        </template>
                      </el-table-column>
                      
                      <el-table-column prop="codeNo" label="序列號" v-if="!columnHideList[2]"> </el-table-column>
                     
                      <el-table-column prop="proName" label="產品" v-if="!columnHideList[3]"> </el-table-column>
                      <el-table-column prop="proPrice" label="產品定價" width="100px" v-if="!columnHideList[4]">
                        <template slot-scope="{row}">
                          <span >{{row.proPrice / 100 | numFormat(2)}}</span>
                        </template>
                      </el-table-column>
                      
                      <el-table-column prop="activeTime" label="啟用時間" v-if="!columnHideList[5]">
                        <template slot-scope="{row}">
                          <span >{{ row.activeTime | parseTime('{y}-{m}-{d} {h}:{i}:{s}') }}</span>
                        </template>
                      </el-table-column>
                      
                      
                    </trends-table>

主要就是利用el-table元件此處就做了序號,多選如果需要更多操作可以自定義擴充套件。

相關截圖

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com