vue+elementUI-el-table实现动态显示隐藏列方式

目录
  • elementUI-el-table动态显示隐藏列
  • 主要代码如下
  • 相关截图
  • 总结

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组件此处就做了序号,多选如果需要更多操作可以自定义扩展。

相关截图

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法

    在开发中,需要表格控件根据浏览器高度进行调整,固定表头,且然后多余的出滚动条,官方给出的: 只要在el-table元素中定义了height属性,即可实现固定表头的表格,而不需要额外的代码. 然后直接上template代码: <template> <el-table :data="tableData3" height="250" border style="width: 100%"> <el-table-column

  • VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解

    先看看ElementUI里关于el-table的template数据结构: <template> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-tabl

  • VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip

    ElementUI2.0的表格的扩展: elementUI表格table elementUI文字提示Tooltip 如果要实现鼠标移到表头有注释或者弹框该怎么添加呢? <el-table empty-text="正在加载中..." :data="contentList" style="width: 100%" @sort-change="sort" class="pro-table-item" too

  • Vue ElementUI在el-table中使用el-popover问题

    目录 ElementUI在el-table中使用el-popover el-popover在el-table中会出现不显示情况 以下属于个人猜测,为了解释给自己听的 总结 ElementUI在el-table中使用el-popover Vue ElementUI在el-table中使用el-popover,点击嵌套内容中的确定或取消来关闭el-popover. <el-table-column width="100" align="center" label=

  • vue elementui二次封装el-table带插槽问题

    目录 elementui二次封装el-table带插槽 element-ui table组件的二次封装(插槽的形式) 1.外层table组件封装 2.内层table组件代码 elementui二次封装el-table带插槽 子组件table封装 html部分 <template>   <div     v-loading="loading">     <el-table       ref="tableData"       :stri

  • vue element-ui中table合计指定列求和实例

    注意点: 1. <el-table> 中 加:summary-method="getSummaries" 2. <el-table-column> 中要加 prop // 房间号的合计去掉 getSummaries (param) { const { columns, data } = param const sums = [] columns.forEach((column, index) => { if (index === 0) { sums[ind

  • 解决vue elementUI中table里数字、字母、中文混合排序问题

    1.使用场景 使用elementUI中的table时,给包含数字字母中文的名称等字段排序 例如:数字(0->9)->大写字母(A->Z)->小写字母(a->z)->中文拼音(a->z) 2.代码解析 <el-table ref="multipleTable" border tooltip-effect="dark" class="xg-table" style="width: 100%&q

  • Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用

    render-header render-header在官方文档中的介绍是这样的: 参数 说明 类型 可选值 默认值 render-header 列标题 Label 区域渲染使用的 Function Function(h, { column, $index }) - - 修改列标题样式 1.在列标题后面加一个图标. 以element-ui官方文档一个table表格为例,我们在地址的后面加一个定位标志的图标,代码如下: <template> <el-table :data="ta

  • 基于Vue+element-ui 的Table二次封装的实现

    本人第一次写这个 写的不好还望指出来 作为一个由于公司产品的升级然促使我从一个后端人员自学变成前端的开发人员 ! 公司做的数据管理系统所以离不开表格了 然后表格样式统一啥的就想到封装一个element-ui 里面的table+Pagination了 效果图 表格组件的引入与使用 <com-table title="监测数据" v-model="tableData4" @selection-change="handleSelectionChange&q

  • vue+elementUI组件table实现前端分页功能

    前端分页和后端分页就是请求的差异,前端分页的话只请求一次,所以要在render table组件的时候控制下数据 :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)"   //不多解释 再就是设置分页器total等于table数据的长度 :total="tableData.length" 点击分页器的操作 methods: { handleSizeChange(val) { con

  • vue+elementUI封装一个根据后端变化的动态table(完整代码)

    实现了自动生成和插槽两个方式,主要把 el-table 和el-pagination封装在一起 效果图: 使用组件,启用自动生成 :auto="true" 自动生成-编辑 (包括请求已经实现了)新增和删除也是一样 ps:如有额外的按钮可以用插槽实现 查询的时候,只需要多返回下面数据,就可以自动生成列,和对应操作按钮 目录 table.vue <template> <div> <el-row v-if="auto"> <el-

  • vue+elementui实现动态控制表格列的显示和隐藏

    vue+elementui(table,多选框)实现动态控制表格列的显示和隐藏,供大家参考,具体内容如下 imdex.vue <template>   <div>     <div>       <el-table :data="tableData" border style="width: 100%" ref="table">         <el-table-column prop=&q

  • vue+elementUI配置表格的列显示与隐藏

    vue+elementUI配置表格的列显示与隐藏,供大家参考,具体内容如下 描述: 表格的列过多时,可以根据需要控制列的显示与隐藏,目前是采用Vue+elementUI(适配Vue3的Element Plus)实现的,具体效果与代码如下: 效果图: 完整代码: <template>   <div id="app">     <el-table :data="tableData" border style="width: 100

  • vue elementUI表格控制显示隐藏对应列的方法

    本文实例为大家分享了vue elementUI表格控制显示隐藏对应列的具体代码,供大家参考,具体内容如下 需求:后端返回全部列数据.前端根据选项来显示对应的列,如果不勾选,默认全部隐藏. 效果图 勾选后显示对应的列 上代码 html部分 这里用v-if来显示隐藏,因为这个elementul组件的原因,v-show不生效,要用v-if <el-table-column         v-if="lists[0].ispass"           label="Uppe

  • vue element-ui table表格滚动加载方法

    添加全局注册事件,用来监听滚动事件 window.Vue.directive('loadmore', { bind(el, binding) { const selectWrap = el.querySelector('.el-table__body-wrapper') selectWrap.addEventListener('scroll', function() { let sign = 100 const scrollDistance = this.scrollHeight - this.

随机推荐