el-table 实现隐藏列切换时引起列表重绘抖动

el-table 实现隐藏列切换时引起列表重绘抖动,第1张

工作中用到了elementui table 去实现列表显示数据。由于table的列数过多,产品要求可以让用户自己设置显示的列数。于是利用v-if 结合el-table-column实现了table的自定义列数显示。虽然功能实现了,但在 *** 作某一列数据由隐藏变为显示的瞬间,页面会有抖动的现象。经过一段时间的查找,发现elementui在重新渲染table时td内部的div高度被重新计算了(div高度=table容器高度/行数),进而导致整个table的高度变化,给人的感觉table在抖动。解决的版本就是给td内部的div固定一个高度。该div有自己的class属性.el-table .cell 。重写该属性的样式表.el-table .cell{height: 20px !important},问题得以解决。

效果如图:

表头标题是重复的、为了能看到滚动效果

v-if="lists[0].ispass" 来判断表格列的状态每一列是否显示或隐藏 勾选则展示、取消勾选隐藏、默认勾选

<el-dropdown :hide-on-click="false">

            <i class="iconfont icon-shaixuan" ></i>

            <el-dropdown-menu slot="dropdown" >

              <el-scrollbar style="height: 60vh">//作用是数据过多把表单数据的整体高度固定、多出的区域可以下拉展示

                <el-checkbox-group v-model="check">

                  <el-dropdown-item v-for="(item,index) in checkList" :key="index"><el-checkbox :label="item" :key="item"></el-checkbox>

                  </el-dropdown-item>

                </el-checkbox-group>

              </el-scrollbar>

            </el-dropdown-menu>

</el-dropdown>

<el-table :data="institutionalTypeList" border align="center" v-loading="listLoading" style="width: 100%" :header-cell-style="tableBg">

        <af-table-column type="index" :index="indexMethod" label="序号" width="90">

        </af-table-column>

        <af-table-column v-if="lists[0].ispass" prop="id" label="编码" >

        </af-table-column>

        <af-table-column v-if="lists[1].ispass" prop="name" label="名称" >

        </af-table-column>

        <af-table-column v-if="lists[2].ispass" prop="updatetime" label="更新时间" >

        </af-table-column>

</el-table>

lists是所有表头标题,check是多选框默认全选,checkList也是所有表头标题、跟多选框绑定的

data() {

      return {

        check:['编码','名称','更新时间'],

        checkList:['编码','名称','更新时间'],

        lists:[

          {label:'编码',ispass:true},

          {label:'名称',ispass:true},

          {label:'更新时间',ispass:true},

        ],

      }

    },

动态监听值选中的选项

watch:{

      check(newVal){

            if (newVal) {

              var arr = this.checkList.filter(i =>newVal.indexOf(i) <0) //未选中

              this.lists.map(i =>{

                if (arr.indexOf(i.label) !== -1) {

                  i.ispass = false

                } else {

                  i.ispass = true

                }

              })

            }

      }

    },

el-table内容过多的时候可以设置 show-overflow-tooltip为 true,这样可以设置实现超出隐藏功能。

但是这个方法有些问题:

先看下效果

如果拖动表头宽度,改变列的宽度,也可以适应。

能实现上述效果主要是能获取到列的width和realWidth 这2个字段的值(目前这个版本是可以获取到的),不拖动表头宽度的时候获取的是width字段,拖动表头后获取realWidth .


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11898730.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存