vue+elementUI-el-table實現動態顯示隱藏列方式
vue 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組件此處就做瞭序號,多選如果需要更多操作可以自定義擴展。
相關截圖
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- vue實現表格分頁功能
- Vue組件庫ElementUI實現表格列表分頁效果
- vue.js管理後臺table組件封裝的方法
- vue+element ui實現錨點定位
- vue+elementui實現動態添加行/可編輯的table