vue+Element UI Table表格动态渲染表头内容及操作按钮

循环表格头信息数组

   <el-table
      v-loading="loading"
      style="width: 100%"
      :data="tableData"
      @selection-change="selectionChange"
      @sort-change="sortChange"
    >
      <el-table-column
        v-for="(item, index) in tableHeaders"
        header-align="center"
        :label="item.label"
        :prop="item.prop"
        :align="item.align"
        :sortable="item.sortable"
        :key="index"
      >
        <template slot-scope="scope">
          <Render
            v-if="item.label == '操作'"
            :scope="scope"
            :render="item.render"
          />
          <span v-else>{{ scope.row[scope.column.property] }}</span>
        </template>
      </el-table-column>
    </el-table>

封装操作组件并引入表格文件内

<script>
export default {
  name: "LbRender",
  functional: true,
  props: {
    scope: Object,
    render: Function,
  },
  render: (h, ctx) => {
    return ctx.props.render ? ctx.props.render(h, ctx.props.scope) : "";
  },
};
</script>

配置表头信息数组及添加操作事件

 data() {
    return {
      tableHeaders: [
        { label: "商品名称", prop: "name", width: "380", align: "center" },
        {
          label: "价格(元)",
          prop: "a",
          width: "160",
          align: "center",
          sortable: true,
        },
        {
          label: "总库存",
          prop: "b",
          width: "260",
          align: "center",
          sortable: true,
        },
        {
          label: "销量",
          prop: "c",
          width: "160",
          align: "center",
          sortable: true,
        },
        {
          label: "是否上架",
          prop: "d",
          width: "160",
          align: "center",
        },
        { label: "操作结果", prop: "e", width: "160", align: "center" },
        { label: "审核", prop: "f", width: "160", align: "center" },
        {
          label: "操作",
          prop: "address",
          width: "160",
          align: "center",
          sortable: true,
          render: (h, scope) => {
            return (
              <div>
                <el-button
                  type="text"
                  onClick={() => {
                    this.edit(scope.row);
                  }}
                >
                  编辑
                </el-button>
                <el-button
                  type="text"
                  style="margin-left:10px"
                  onClick={() => {
                    this.delete(scope.row);
                  }}
                >
                  删除
                </el-button>
                <el-button
                  type="text"
                  style={scope.row.state ? "" : "margin-left:10px;display:none"}
                  onClick={() => {
                    this.delete(scope.row);
                  }}
                >
                  下架
                </el-button>
              </div>
            );
          },
        },
      ],
    };
  },
  methods: {
    edit(row) {
      console.log("edit");
    },
    delete(row) {
      console.log("delete");
    },
  },

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值