vue2.0使用render函数对el-table表格再封装

在用el-table的时候, 用一个数组进行循环就可以了,但是当我们需要对某一列的数据进行二次处理就会用,那么就不能进行循环了,就需要在模版中一个一个的写,造成模版的代码量大,所以我就对el-table进行了二次封装

// 这是table.vue文件
<script>
export default {
  name: "GTable",
  props: {
    serialNumber: { type: Boolean, default: true }, // 是否展示序号列
    columns: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      dataList: [],
      pageInfo: {
        total: 0,
        pageNum: 1,
        pageSize: 10,
        pages: 1
      }
    };
  },
  methods: {
    setIndex(index) {
      const { pageNum, pageSize } = this.pageInfo;
      return index + 1 + (pageNum - 1) * pageSize;
    }
  },
  render() {
    const { dataList } = this.$data;
    const { serialNumber, columns } = this.$props;
    // 渲染序号
    const columnNumber = serialNumber ? (
      <el-table-column
        type="index"
        width="120"
        label="序号"
        index={this.setIndex}
        align="center"
      />
    ) : null;
    // 渲染列的
    const renderColumn = () => {
      return columns.map(item => {
        const attribute = {
          key: item.label,
          attrs: { ...item }
        };
        // 这里使用的就是作用域插槽
        if (item.customRender) {
          attribute.scopedSlots = {
            default: this.$scopedSlots[item.customRender]
          };
        }
        return <el-table-column {...attribute} />;
      });
    };
    const rendeRempty = (
      <template slot="empty">
        <no-data></no-data>
      </template>
    );

    // 渲染表格
    const renderTable = (
      <el-table data={dataList} style="width: 100%">
        {columnNumber}
        {renderColumn()}
        {rendeRempty} //这个是无数据时表格的显示组件
      </el-table>
    );
    return <div class="g-table">{renderTable}</div>;
  }
};
</script>

在页面中使用table组件,table组件我全局注册了。

<template>
  <g-table :columns="columns">
    <template slot="operation" slot-scope="scope">
    	<!--可以对列的内容就行处理  -->
        {{ scope.row }}
      </template>
  </g-table>```
</template>
<script>
export default {
  data() {
    return {
      columns: [
        {
          label: "姓名",
          prop: "name"
        },
        {
          label: "手机号",
          prop: "mobile"
        },
        {
          label: "用户名",
          prop: "username"
        },
        {
          label: "操作",
          customRender: "operation" // 这里就和上面的slot属性一样。
        }
      ],
      dialogFormVisible: false
    };
  },
}
</script>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值