基于element ui封装table组件

效果图:

1.封装表格代码如下

复制代码
<template>
<div>
  <div class="TableList">
    <el-table
        v-loading="loading"
        @selection-change="selectionChange"
        class="table"
        :data="tableData"
        :border="hasBorder"
        :row-class-name="tableRowClassName"
        ref="multipleTable"
        :header-cell-style="{
				background: 'rgb(245 247 250)',
				color: 'rgb(51, 51, 51)',
			}"
    >
      <el-table-column type="selection" width="50" v-if="selectionShow"> </el-table-column>
      <!-- 序号 -->
      <el-table-column v-if="hasIndex" type="index" label="序号" header-align="center" align="center" width="80"> </el-table-column>
      <!-- 其他 -->
      <template v-for="item in tableColumnOptions">
        <!-- 插槽列 -->
        <el-table-column
            v-if="item.columnType"
            :key="item.label"
            :prop="item.prop"
            :label="item.label"
            :width="item.width"
            :header-align="item.headerAlign || 'center'"
            :align="item.align || 'center'"
        >
          <template slot-scope="{ row }">
            <slot :name="item.soltName" :data="row"></slot>
          </template>
        </el-table-column>
        <!-- 非插槽列 -->
        <el-table-column
            v-else
            :key="item.label"
            :prop="item.prop"
            :label="item.label"
            :width="item.width"
            :header-align="item.headerAlign || 'center'"
            :align="item.align || 'center'"
        >
          <!--          表头的特殊处理(eg:表头上加提示或图标等)-->
          <template slot="header" v-if="item.showIcon">
            <div class="tab-header">
              {{ item.label }}
              <el-tooltip :content="item.content" placement="top">
                <i  class="el-icon-warning-outline icon"></i>
              </el-tooltip>
            </div>
          </template>
        </el-table-column>
      </template>
      <el-table-column type="selection" width="50" v-if="selectionShow1" :selectable="checkboxT"> </el-table-column>
    </el-table>
  </div>
</div>
</template>
<script>
export default {
  props:{
    // 表格数据
    tableData: {
      type: Array,
      default() {
        return [];
      },
    },
    // 表格列项
    tableColumnOptions: {
      type: Array,
      require: true,
      default() {
        return [];
      },
    },
    // 是否具有索引
    hasIndex: {
      type: Boolean,
      default() {
        return true;
      },
    },
    // 是否显示边框
    hasBorder: {
      type: Boolean,
      default() {
        return false;
      },
    },
    // 是否显示选择框
    selectionShow: {
      type: Boolean,
      default() {
        return true;
      },
    },
    //加载
    loading: {
      type: Boolean,
      default: false,
    },
  },
  methods:{
    // 选择框改变
    selectionChange(e){
      this.$emit('selectionChange',e)
    },
    tableRowClassName({ row, rowIndex }) {},
  }
}
</script>
<style scoped lang="scss">

</style>

2.在页面上使用

复制代码
<template>
<div>
  <tableList
      :selection-show="true"
      :loading="loading"
      :has-index="false"
      :has-border="true"
      :table-data="tableData"
      :table-column-options="tableColumnOptions"
      @selectionChange="selectionChange"
  >
    <!-- 类型插槽 -->
    <template #tag="{ data }">
      <div class="tag">
        <el-tag type="success" v-if="data.type === 1">tag1</el-tag>
        <el-tag type="danger" v-if="data.type === 0">tag2</el-tag>
      </div>
    </template>
    <!-- 操作插槽 -->
    <template #operation="{ data }">
      <el-button type="text" @click="handleEdit(data)">编辑</el-button>
      <el-button type="text" @click="handleDelete(data)" id="delete">删除</el-button>
    </template>
  </tableList>
</div>
</template>
<script>
import tableList from '@/views/daily-examine/components/table/index.vue';
export default {
  components:{
    tableList
  },
  data(){
    return {
      loading:false,
      tableData:[
        { id: 202391074073, name: "张三", type: 1,special:'1'},
        { id: 202391074071, name: "李四", type: 0,special:'1'},
        { id: 202391074074, name: "王二", type: 0,special:'1'},
        { id: 202391074074, name: "马六", type: 0,special:'1'},
        { id: 202391074074, name: "李六", type: 1,special:'1'},
      ],
      tableColumnOptions:[
        { label: "账号", prop: "id" },
        { label: "姓名", prop: "name" },
        { label: "tag", prop: "type", columnType: true, soltName: "tag" },
        { label: "表头特殊处理",prop:'special',showIcon:true, content:'提示,提示,提示', },
        { label: "操作", width: "300", columnType: true, soltName: "operation"},
      ],

    }
  },
  methods:{
    selectionChange(){

    },
    //编辑
    handleEdit(data){},
    //删除
    handleDelete(data){},

  }
}
</script>
<style scoped lang="scss">

</style>

以上就是基于element ui封装table组件

相关推荐
信看34 分钟前
NMEA-GNSS-RTK 定位html小工具
前端·javascript·html
Tony Bai40 分钟前
【API 设计之道】04 字段掩码模式:让前端决定后端返回什么
前端
爱吃大芒果42 分钟前
Flutter 主题与深色模式:全局样式统一与动态切换
开发语言·javascript·flutter·ecmascript·gitcode
苏打水com1 小时前
第十四篇:Day40-42 前端架构设计入门——从“功能实现”到“架构思维”(对标职场“大型项目架构”需求)
前端·架构
king王一帅1 小时前
流式渲染 Incremark、ant-design-x markdown、streammarkdown-vue 全流程方案对比
前端·javascript·人工智能
苏打水com1 小时前
第十八篇:Day52-54 前端跨端开发进阶——从“多端适配”到“跨端统一”(对标职场“全栈化”需求)
前端
Bigger1 小时前
后端拒写接口?前端硬核自救:纯前端实现静态资源下载全链路解析
前端·浏览器·vite
BD_Marathon2 小时前
【JavaWeb】路径问题_前端绝对路径问题
前端
whyfail2 小时前
Vue原理(暴力版)
前端·vue.js