vue element-ui动态生成table表头和数据

html块

<div class="comtable">
        <!-- <div v-if="total == 0" class="common-animate">
        <lottie class="inner" :options="{
            animationData: AnimNoDataNew,
            loop: true,
            speed: 5,
            autoplay: true,
            renderer: 'svg',
          }" />
        <span class="noDataText">暂无数据</span>
      </div> -->
      <span class="deviceIds-icon">
        <span class="split-line"></span>
        <span @click="showSelection" id="deviceIds">
          <svg-icon icon-class="shezhi" class="device-icon"></svg-icon>
        </span>
      </span>
      <el-table class="fixedtableHeight" v-loading="listLoading" ref="table" :data="showList"  stripe tooltip-effect="dark" style="width: 100% !important;margin-top:1%;" :header-cell-style="{background:'#e6e6e6'}" border>
        <el-table-column :label="item.propName" :property="item.prop" v-if= "tableft" v-for="item in tableColumnList" :key="item.prop" align="center">
              <template slot-scope="scope">
                    <span>{{scope.row[scope.column.property]}}</span>
              </template>
          </el-table-column>
      </el-table>
    </div>

js块

  //动态添加表头
    queryFn() {
      // 调用后台接口获取tableColumnList和dataList的方法写在这里
      // getData().then(response =>{
      //   this.tableColumnList = response.data.tableColumnList
      //   this.dataList = response.data.dataList
      // })
      this.showList = this.dataList;
    },
    clearQuery() {
      this.query.name = "";
      this.queryFn();
    },
    menuChange(item) {
      this.tableft = false;
      // 注意  我这里都用的假数据,要从后台获取tableColumnList和dataList的时候
      //,每一次调用menuChange都要重新获取tableColumnList和dataList,保证属性和数据是对应的
      let flag = true;
      for (var i = 0; i < this.checkArr.length; i++) {
        if (this.checkArr[i] === item.propName) {
          flag = false;
          this.$nextTick(function () {
            setTimeout((_) => {
              this.tableft = true;
              this.$refs.table.doLayout();
            }, 100);
          });
          break;
        }
      }
      if (!flag) {
        this.tableColumnList.push(item);
        this.$nextTick((_) => {
          this.tableft = true;
        });
      }
      if (flag) {
        Array.prototype.contains = function (obj) {
          var j = this.length;
          while (j--) {
            if (this[j] === obj) {
              return j; // 返回的这个 i 就是元素的索引下标,
            }
          }
          return false;
        };
        this.tableColumnList.splice(this.tableColumnList.contains(item), 1);
        this.$nextTick((_) => {
          this.tableft = true;
        });
      }
    },

造数据:

 // 这里为了简便我就没有调用后台接口获取数据,直接写的假数据  你要用的话可以调用后台接口获取tableColumnList,注意数据格式
      tableColumnList: [
        { prop: "id", propName: "编号" },
        { prop: "name", propName: "名字" },
        { prop: "age", propName: "保质期" },
        { prop: "remark", propName: "特点" },
      ],
      // 这里为了简便我就没有调用后台接口获取数据,直接写的假数据
      dataList: [
        {
          id: "100001",
          name: "小红萝卜",
          age: "2年",
          remark: "适合油炸",
          country: "中国",
          address: "广东省深圳市",
        },
        {
          id: "100002",
          name: "萝卜妹",
          age: "2年",
          remark: "适合水煮",
          country: "美国",
          address: "硅谷",
        },
        {
          id: "100003",
          name: "胖萝卜头",
          age: "1年",
          remark: "适合玩儿",
          country: "泰国",
          address: "清迈",
        },
        {
          id: "100004",
          name: "萝卜酱",
          age: "4年",
          remark: "适合吃火锅",
          country: "韩国",
          address: "首尔",
        },
      ],
      optionalColumnList: [
        { prop: "country", propName: "出口国家" },
        { prop: "address", propName: "零售点" },
      ],

      checkArr: [],
      list: [],
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过自定义合并规则来实现vue element-ui table单元格的动态合并。以下是一个简单的示例代码: ``` <template> <el-table :data="tableData" ref="multiTable" border> <el-table-column prop="name" label="Name" width="180"> </el-table-column> <el-table-column prop="age" label="Age" width="180"> </el-table-column> <el-table-column prop="gender" label="Gender" width="180" :cell-style="{padding: '0px'}" :render-header="renderHeader" :render-cell="renderCell"> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: 'Tom', age: 18, gender: 'M' }, { name: 'Jane', age: 22, gender: 'F' }, { name: 'John', age: 28, gender: 'M' }, { name: 'Lisa', age: 24, gender: 'F' } ] } }, methods: { // 自定义表头渲染函数 renderHeader(h, { column }) { if (column.property === 'gender') { return h('div', [ h('span', 'Gender'), h('el-checkbox', { on: { change: this.handleMultiHeaderChange } }) ]) } else { return h('div', column.label) } }, // 自定义单元格渲染函数 renderCell(h, { row, column }, index) { const rowspan = this.getMultiRowspan(row, column) if (rowspan === 0) { return '' } else { return h('div', { style: { lineHeight: `${80 * rowspan}px` }, attrs: { rowspan: rowspan } }, row.gender) } }, // 计算单元格跨行数 getMultiRowspan(row, column) { const data = this.tableData let rowspan = 1 let currentIndex = data.indexOf(row) for (let i = currentIndex + 1; i < data.length; i++) { if (data[i][column.property] === row[column.property]) { rowspan++ } else { break } } return rowspan }, // 表头复选框改变事件 handleMultiHeaderChange(value) { const table = this.$refs.multiTable const columns = table.columns columns.forEach((column) => { if (column.property === 'gender') { column.filteredValue = value ? ['M', 'F'] : [] table.store.commit('filterChange', { column: column }) } }) } } } </script> ``` 在这个示例代码中,我们使用了自定义渲染函数来渲染表格,其中: - `renderHeader` 函数用于渲染表头,其中包含一个复选框来控制表格的动态合并; - `renderCell` 函数用于渲染单元格,其中通过 `getMultiRowspan` 函数计算出单元格需要跨越的行数。 需要注意的是,这里的示例代码仅供参考,具体实现可能会因为表格数据结构和合并规则的不同而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值