暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

动态渲染表格,筛选列功能,单元格点击事件

小王学前端 2021-10-23
791

哈喽,大家好,最近碰到一个需求,实现动态表格渲染和列筛选的功能,还涉及到单元格点击事件,花了一些时间研究,积累,现在记录一下,做个总结,也分享给有需要的同学。

备注:代码可以直接复制到编辑器运行,显示效果,亲测。


<template>

  <div class="containClass">

    分类

    <h3 class="title">列动态展示table案例</h3>

    <el-popover placement="bottom" width="800" title="列筛选" v-model="visible" trigger="click">

      <!-- 默认展示全部列数据 -->

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

        <el-checkbox

          :label="item.label"

          :value="item.prop"

          v-for="(item, i) in columnList"

          :key="i"

          style="min-height:50px;"

        ></el-checkbox>

      </el-checkbox-group>

      <span class="filterFuncClass" @click="handlerFilterFunc('filter')"

        >筛选</span

      >

      <span class="filterFuncClass" @click="handlerFilterFunc('cancel')"

        >取消</span

      >

      <span></span>

      <span class="filterClass" slot="reference"

        >列设置

        <i class="fa fa-filter"></i>

      </span>

    </el-popover>

    <!-- 动态渲染表格 -->

    <el-table :data="tableData" border stripe :cell-class-name="tableCellClassName" @cell-click="cellClick">

      <el-table-column

        type="index"

        label="序号"

        width="100"

        align="center"

      ></el-table-column>

      <!-- 动态渲染列 -->

      <el-table-column

        v-for="(col, index) in tableHead"

        :key="index"

        align="center"

        sortable

        :prop="col.prop"

        :label="col.label"

      >

      </el-table-column>

    </el-table>

  </div>

</template>

<script>

export default {

  name: "Catelog",

  data() {

    return {

      tableData: [

        {

          date: "2016-05-02",

          name: "",

          address: "上海市普陀区金沙江路 1518 弄",

          salary: 10000

        },

        {

          date: "2016-05-04",

          name: "张小龙",

          address: "上海市普陀区金沙江路 1517 弄",

          salary: 12000

        },

        {

          date: "2016-05-01",

          name: "赵小牛",

          address: "上海市普陀区金沙江路 1519 弄",

          salary: 9000

        },

       

      ],

      visible:false,

      tableHead: [],//表头数据

      columnList: [],//筛选字段整体列表

      checkList: []//选中的复选框内容列表

    };

  },

 

  methods: {

    //js

    tableCellClassName({row, column, rowIndex, columnIndex}){//注意这里是解构

      //利用单元格的 className 的回调方法,给行列索引赋值

      row.index=rowIndex;

      column.index=columnIndex;

    },


    //点击单元格,拿到当前的单元格的内容,并打印是在第几行第几列

    cellClick(row, column, cell, event){

      console.log(row.index);//单元格的行数下标

      console.log(column.index);//单元格的列数下标

      console.log(row[column.property],'获取到的属性值内容')//通过这个属性值进行操作,如果为空,说明没有值

    },



    // 通过筛选列拿到的值进行赋值给表头数据tableHead渲染,进行表格列的实时显示与隐藏

    handlerFilterFunc(type) {

      // 点击筛选按钮

      if (type === "filter") {

        console.log(this.checkList);

        // 如果没有勾选任何值,进行提示勾选,否则不进行任何筛选

        if (this.checkList.length == 0) {

          return this.$message.warning("请勾选要展示的列");

        }

        // 设置一个存储表头数据的数组,用来替换之前的表头

        const newTableHead = [];

        // 循环复选框选中的值与列字段列表,通过label进行比对,找到相同的,将其对应的lable和prop值存进数组newtableHead

        for (const ch of this.checkList) {

          for (const lb of this.columnList) {

            if (ch == lb.label) {

              newTableHead.push({

                prop: lb.prop,

                label: lb.label

              });

            }

          }

        }

        // 将映射完的数组重新赋给tableData里动态循环列的tableHead

        this.tableHead = newTableHead;

        this.visible = false

      } else if (type === "cancel") {

        //取消功能让选中的值都清空

        this.checkList = [];

        this.visible = false

        console.log(this.tableHead, 1111);

      }

    }

  },

  created() {

    // 获取列筛选表格数据

    this.columnList.push(

      {

        prop: "date",

        label: "日期"

      },

      {

        prop: "name",

        label: "姓名"

      },

      {

        prop: "address",

        label: "地址"

      }

    );


    // 获取表头数据

    this.tableHead.push(

      {

        prop: "date",

        label: "日期"

      },

      {

        prop: "name",

        label: "姓名"

      },

      {

        prop: "address",

        label: "地址"

      }

    );

    console.log(this.tableHead);

    //  this.checkList =["日期"]


     // 设置默认选中值 this.checkList,从列筛选表格数据中循环获取文字label,进行设置默认值,全部显示勾选状态,不设置,即为空

    this.columnList.map(item => {

     this.checkList.push(

       item.label

     ) 

       return this.checkList

     })

    

  }

};

</script>


文章转载自小王学前端,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论