封装element中的table表格动态渲染(动态表头,可操控列)

vue+element实现动态表格:根据后台返回的属性名和字段动态生成表头可变表格

由于项目需求,需要有一个动态表格,可以根据配置或从后台获取表格属性列。并加上了某一行需要点击跳转和操作列里面的功能

子组件中的table封装,并接受父组件传递过来的数据

<el-table
      :data="tableData"
      id="el-table"
      style="width: 100%"
      :header-cell-style="headerCellStyle"
      :cell-style="cellStyle"
    >
      <!-- 是否显示序列号 -->
      <template v-if="indexColumn">
        <el-table-column
          type="index"
          width="50"
        >
        </el-table-column>
      </template>
      <!-- 动态循环的列表 -->
      <el-table-column
        v-for="(item, index) in tableLabel"
        :key="index"
        :prop="item.prop"
        :label="item.label"
        :width="item.width ? item.width : ''"
        :align="'left'"
        :show-overflow-tooltip="true"
      >
        <template slot-scope="scope">
          <el-button
            v-if="item.isJump"
            type="text"
            size="small"
            :key="index"
            @click="details(scope.row)"
          >
            {{ scope.row[item.prop] }}
          </el-button>

          <span v-else>{{ scope.row[item.prop] }}</span>
        </template>
      </el-table-column>
      <!-- 固定行 操作 -->
      <template>
        <el-table-column
          v-if="tableOption"
          :width="tableOption.width"
          :label="tableOption.label"
          fixed="right"
        >
          <template slot-scope="scope">
            <el-button
              type="text"
              size="small"
              v-for="(item, index) in tableOption.options"
              :key="index"
              @click="item.handle(scope.row)"
            >
              {{ item.label }}
            </el-button>
          </template>
        </el-table-column>
      </template>
    </el-table>

接受父组件的传值

props: {
    // 数据源
    tableData: {
      type: Array,
      default () {
        return []
      }
    },
    // 标题
    tableLabel: {
      type: Array,
      default () {
        return []
      }
    },
    // 处理常用查看,编辑
    tableOption: {
      type: Object,
      default () {
        return {}
      }
    },
    // 是否显示 序号
    indexColumn: {
      type: Boolean,
      default: () => { }
    }
  },

子组件向父组件发起调用

    // 改变默认样式
    headerCellStyle ({ row, rowIndex }) {
      return 'padding:5px 0'
    },
    // 改变默认样式
    cellStyle ({ row, column, rowIndex, columnIndex }) {
      return 'padding:5px 0'
    },
    // 点击可操作行 向父组件发起调用
    details (row) {
      this.$emit('cellClick', row)
    }

父组件

     <Table
        :table-data="tableData"
        :table-label="tableLabel"
        :table-option="tableOption"
        :selection-checked="false"
        :index-column="true"
        ref="Table"
        @cellClick="tableCellClick"
     ></Table>

父组件向子组件传递的参数 

    tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],

      tableOption: {
        label: '操作',
        width: '180',
        options: [
          {
            label: '添加',
            type: 'primary',
            fixed: 'right',
            handle: (row) => {
              this.add(row)
            }
          }
        ]
      },

     tableLabel: [
        { label: '日期', prop: 'date', width: '', isJump: true },
        { label: '姓名', prop: 'name', width: '' },
        { label: '地址', prop: 'address', width: '' },
      ]

父组件调用方法

    add(row) {
      console.log(row)
    },
    tableCellClick (row) {
      console.log(row)
    }

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我们可以封装一个函数来实现为elementtable表头绑定点击事件。具体实现参考如下代码: ```javascript function bindTableHeaderClickEvent(table, callback) { var thElements = table.getElementsByTagName("th"); for (var i = 0; i < thElements.length; i++) { thElements[i].addEventListener("click", function() { var index = Array.prototype.indexOf.call(thElements, this); callback(index); }); } } ``` 在上面的代码,我们定义了一个名为bindTableHeaderClickEvent的函数,该函数接受两个参数:一个是要绑定点击事件的table元素,另一个是点击表头时要执行的回调函数。在函数内部,我们首先获取了所有的表头单元格(即th元素),然后使用循环为每个单元格添加了一个click事件监听器。当用户点击表头单元格时,监听器会执行指定的处理函数,我们通过回调函数的方式来处理表头点击事件。在回调函数,我们使用Array.prototype.indexOf方法来获取当前点击的表头单元格在所有表头单元格的索引值,然后将该索引值作为参数传递给回调函数。 使用示例: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Table Header Click Event</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="https://unpkg.com/element-ui/lib/index.js"></script> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> </head> <body> <div id="app"> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="date" label="日期"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </div> <script> var app = new Vue({ el: '#app', data: { tableData: [ { date: '2019-09-01', name: '张三', address: '北京市' }, { date: '2019-09-02', name: '李四', address: '上海市' }, { date: '2019-09-03', name: '王五', address: '广州市' } ] }, mounted: function() { var table = this.$el.getElementsByTagName("table")[0]; bindTableHeaderClickEvent(table, function(index) { console.log("表头" + (index + 1) + "被点击了!"); }); } }); </script> </body> </html> ``` 在上面的代码,我们使用了Vue.jsElement UI来创建了一个带有表头表格。在mounted钩子函数,我们首先获取了表格元素,然后调用了bindTableHeaderClickEvent函数为表头单元格绑定了点击事件,并指定了一个回调函数来处理表头点击事件。在回调函数,我们使用console.log方法输出了当前点击的表头单元格的索引值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值