如何基于现有框架的table进行二次封装

Posted 2ming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何基于现有框架的table进行二次封装相关的知识,希望对你有一定的参考价值。

有时候大家肯定在想,我能不能直接一个columns,直接出来一个表格,我以前分享过类似表单的封装,今天给大家带来表格的封装,希望能帮助到需要的人,如果有帮助到你,可以点个赞

<template>
  <div>
    <v-table :data="tableData" :columns="columns"> </v-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      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 弄\',
        },
      ],
      columns: [
        {
          prop: \'date\',
          label: \'日期\',
        },
        {
          prop: \'name\',
          label: \'标题\',
        },
        {
          prop: \'address\',
          label: \'地址\',
        }
      ],
    };
  }
};
</script>

怎么实现呢?是不是可以在element-ui的基础上再封装一层呢?!!!上代码

<script type="text/jsx">
export default {
  name: \'VTable\',
  props: {
    columns: {
      required: true,
      type: Array,
      default: () => ([])
    },
    data: {
      type: Array,
      default: () => ([])
    },
  },
  render(h) {
    return <div>
      <el-table props={{ data: this.data }}>
        {
          this.columns.map(item => {
            return <el-table-column props={{ ...item }} > </el-table-column>
          })
        }
      </el-table>
    </div>
  }
}
</script>

非常的简单普通就达到的我们想要的目的,如果你以为到这就满足了需求你就错了。

  1. 能不能直接传一个异步接口?
  2. 能不能兼容slot?
  3. 能不能兼容element的el-table
    答案肯定是可以的嘛,不然我写出来干嘛,直接上菜
//list.vue
<template>
  <div>
    <v-table :table="{ size: \'medium\' }" :api="getData" :columns="columns">
      <template v-slot:name="scope">{{ scope.row.name }}</template>
      <template v-slot:action="scope">
        <el-button size="mini" @click="handleEdit(scope.$index, scope.row)"
          >编辑</el-button
        >
        <el-button
          size="mini"
          type="danger"
          @click="handleDelete(scope.$index, scope.row)"
          >删除</el-button
        >
      </template>
    </v-table>
  </div>
</template>

// VTable.vue
<script type="text/jsx">
export default {
  name: \'VTable\',
  props: {
    columns: {
      required: true,
      type: Array,
      default: () => ([])
    },
    table: {
      type: Object,
      default: () => {}
    },
    api: {
      required: true,
      type: Function,
      default: () => Promise.resolve({
        list: []
      })
    }
  },
  data() {
    return {
      data: []
    }
  },
  mounted() {
    this.getList()
  },
  methods: {
    getList(params){
      this.api({ ...params }).then(res => {
        let { list } = res
        this.data = list
      })
    }
  },
  render(h) {
    return <div>
      <el-table props={{ ...this.table, data: this.data }}>
        {
          this.columns.map(item => {
            return <el-table-column  props={{ ...item }} >
              {this.$scopedSlots[item.prop]}
            </el-table-column>
          })
        }
      </el-table>
    </div>
  }
}
</script>

后续

  • 封装分页
  • 封装表格筛选表单
    大家可以根据自己的需求在这个基础上去做扩展

以上是关于如何基于现有框架的table进行二次封装的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)

SpringBoot框架的权限管理系统

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

pyse基于selenium(webdriver)进行了简单的二次封装,比selenium所提供的方法操作更简洁。

vue-form-table(vuejs+element-ui的表格表单控件的二次封装插件)

vue + element ui table表格二次封装 常用功能