基于element-ui封装的table

在工作中经常会遇到需要数据以表格形式展示出来,但是一旦展示的数据过多,会导致table冗余,故通常需要自行封装table简化代码,提高复用性,如下:

<template>
  <div class="table-content">
    <el-table
      v-bind="$attrs"
      ref="eltable"
      @selection-change="selectionChange"
      @sort-change="sortChange"
    >
      <!-- 多选框 -->
      <el-table-column
        type="selection"
        v-if="showSelect"
        v-bind="selectionAttrs"
        width="55"
        align="center"
      />
      <!-- 序号 -->
      <el-table-column
        v-if="showIndex"
        type="index"
        label="序号"
        width="55"
        align="center"
        :index="indexMethod"
        fixed
      />
      <!-- 实际数据展示 -->
      <el-table-column
        v-for="(column, index) in tableTitles"
        :key="index"
        :label="column.tatle"
        :prop="column.key"
        :align="column.align || 'center'"
        :header-align="column.headerAlign || 'center'"
        :fixed="column.fixed ? column.fixed : false"
        :sortable="column.sortable"
        :width="column.width"
        :formatter="column.formatter"
        show-overflow-tooltip
      >
        <template slot-scope="scope">
          <slot
            v-if="column.render"
            :name="column.render"
            v-bind="{ row: scope.row, index, $index: scope.$index }"
          />
          <span v-else-if="column.formatter">
            {{
              column.formatter(
                scope.row,
                column,
                scope.row[column.key],
                scope.$index
              ) | handleColumn
            }}
          </span>
          <span v-else>{{
            String(scope.row[column.key] || '') | handleColumn
          }}</span>
        </template>
        <template slot="empty"
          >d
          <div>
            暂无数据...
          </div>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页部分 -->
    <div v-if="pageFlag">
      <div v-show="$attrs.data.length > 0" class="mypagination">
        <div v-if="pageSlots" class="total fl">
          共{{ pageInfo.total }}条记录 第{{ pageInfo.pageNum }}/{{
            Math.ceil(pageInfo.total / pageInfo.pageSize)
          }}页
        </div>
        <i v-else />
        <el-pagination
          prev-text="上一页"
          next-text="下一页"
          class="fr"
          backgound
          :layout="layout"
          :pager-count="$attrs.pagerCount"
          :page-sizes="[10, 20, 30, 40, 50]"
          :page-size="pageInfo.pageSize"
          :current-page="pageInfo.pageNum"
          :total="pageInfo.total"
          @size-change="$listeners['size-change']"
          @current-change="$listeners['current-change']"
        ></el-pagination>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'CommonTable',
  prop: {
    showSelect: {
      type: Boolean,
      default: false
    },
    showIndex: {
      type: Boolean,
      default: true
    },
    indexCustomze: {
      type: Boolean,
      default: false
    },
    pageFlag: {
      type: Boolean,
      default: true
    },
    tableTitles: {
      type: Array,
      default: () => []
    },
    selectionAttrs: {
      type: Object,
      default: () => ({})
    },
    pageInfo: {
      type: Object
    },
    layout: {
      type: String,
      default: 'sizes,prev,pager,next'
    }
  },
  filters: {
    handleColumn (val) {
      if (val) return val
      if (val + '' === '0') return '0'
      if (!val) return '-'
    }
  },
  data () {
    return {
      elTable: null,
      historyData: [],
      tmp: {},
      sortCount: 0
    }
  },
  mounted () {
    this.elTable = this.$refs.elTable
  },
  methods: {
    selectionChange (value) {
      this.$emit('selection-change', value)
    },
    // 如表格存在切换,必须给当前表格绑定ref,咋切换数据时触发该方法
    sortCountToZero () {
      this.sortCount = 0
    },

    //排序
    sortChange ({ column, prop, order }) {
      // 判断当前是否为第一次点击,历史数据值存留一次
      if (!this.sortCount && this.$attrs.data && this.$attrs.data.length > 0) {
        this.historyData = [...this.$attrs.data]
        this.tmp = this.$attrs.data[0]
        this.sortCount++
      }
      this.$emit(
        'sort-change',
        { column, prop, order },
        this.historyData,
        this.tmp
      )
    },
    sort ({ column, prop, order }) {
      this.$emit('sort', { column, prop, order })
    },
    indexMethod () {
      if (this.indexCustomze) {
        return indexed === 0 ? '' : index
      } else {
        return index + 1
      }
    }
  }
}
</script>
<style lang="less" scoped>
.table-content {
  background-color: #fff;
  /deep/ .el-table_header {
    tr {
      font-weight: 700;
      color: #262626;
      th {
        background-color: rgb(244, 245, 247);
      }
    }
  }
  .mypagination {
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 55px;
    padding: 15px 0 10px;
    .fl {
      float: left;
      font-size: 14px;
      color: #999;
      line-height: 14px;
    }
    .fr {
      float: right;
    }
    /deep/ .el-pagination {
      font-size: 14px;
      font-weight: normal;

      .btn-prev,
      .btn-next {
        padding: 0 16px;
        background-color: #fff;
        border: 1px solid #d9dce2;
        border-radius: 4px;
        height: 28px;
        line-height: 28px;
      }

      .el-pager {
        li {
          min-width: 36px;
          color: #262626;
          height: 28px;
          line-height: 28px;
          border: 1px solid #d9dce2;
          border-radius: 4px;
          background-color: #fff !important;

          &.active {
            border: 1px solid #368fff;
            color: #368fff;
          }
        }
      }
    }
  }
}
/deep/.el-table_body-wrapper::-webkit-scrollbar-thumb {
  background-color: #e6e6e6;
}
</style>

给表格中的数据进行排序处理:

//  sort   el-table回传表格排序方式
// historyData 历史表格数据
// tmp 表格首行数据(固定)
// self 指针 (this指向)
// table 表格数据名(默认'tableData')

function sortCallBack(tmp, self, table, callback) {
	self[table].splice(0, 1)
	self[table] = self[table].sort(callback)
	self[table].unshift(tmp)
}
export function sortChange(sort, historyData, tmp, self, table = 'tableData') {
	if (sort.order === 'descending') {
		//降序
		sortCallBack(tmp, self, table, (a, b) => {
			return Number(b[sort.prop]) - Number(a[sort.prop])
		})
	} else if (sort.order === 'ascending') {
		// 升序
		sortCallBack(tmp, self, table, (a, b) => {
			return Number(a[sort.prop]) - Number(b[sort.prop])
		})
	} else {
		//还原  注意堆栈与引用变量是否采取深浅拷贝
		self[table] = [ ...historyData ]
	}
}

如何引用 如下:

<template>
  <div id="app">
    <!-- <router-view></router-view> -->
    <!-- <img src="./assets/logo.png" alt="" /> -->
    <Table
      :showIndex="true"
      :tableTitles="tableTitles"
      :data="tableData"
      :pageInfo="pageInfo"
      :index-customze="true"
      :pageFlag="true"
      @current-change="handlePageChange"
      @size-change="handlePageSizeChange"
      @sort-change="sortChange"
    >
      <!-- 自定义可编辑或者可点击部分 -->
      <template #areaName="{row,$index}">
        <span v-if="$index === 0">{{ row.areaName }}</span>
        <el-button v-else type="text" @click="clickFn(row)">{{
          row.areaName
        }}</el-button>
      </template>
    </Table>
  </div>
</template>
<script>
import Table from './components/HelloWorld.vue'
import { sortChange } from './components/customzeSort'
export default {
  name: 'App',
  components: {
    Table
  },
  data () {
    return {
      tableTitles: [
        {
          title: '地区',
          key: 'areaName',
          render: 'areaName',
          fiexed: 'left',
          width: '100px'
        },
        {
          title: '机构数量',
          key: 'organNum' //与接口获取的数据中字段一致
        },
        {
          title: '教师数量',
          key: 'teachers'
        },
        {
          title: '学生数量',
          key: 'students'
        }
      ],
      tableData: [
        { areaName: '北京', organNum: '123', teachers: '456', students: '789' }
      ],
      pageInfo: {
        pageNum: 1,
        pageSize: 10,
        total: 100
      }
    }
  },
  methods: {
    sortChange (sort, historyData, tmp) {
      sortChange(sort, historyData, tmp, this, 'tableData')
    },
    handlePageChange (pageNum) {
      this.pageInfo.pageNum = pageNum
      //修改分页参数 重新调取接口
    },
    handlePageSizeChange (pageSize) {
      this.pageInfo.pageSize = pageSize
      //修改分页参数 重新调取接口
    },
    clickFn (row) {
      //点击表格内容 进行处理
    }
  }
}
</script>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Element-UI 是一套基于 Vue.js 2.0 的 UI 组件库,提供了丰富的组件和模板,方便我们快速开发页面。其中,Table 组件是常用的数据展示组件之一,我们可以通过封装一个 TableList 组件来简化 Table 的使用。 以下是一个简单的 TableList 封装示例: ```vue <template> <div> <el-table :data="tableData" :height="height" :max-height="maxHeight" :stripe="stripe" :border="border" :default-sort="defaultSort" :show-header="showHeader" :highlight-current-row="highlightCurrentRow"> <el-table-column v-for="(column, index) in columns" :key="index" :label="column.label" :prop="column.prop" :width="column.width" :min-width="column.minWidth" :fixed="column.fixed" :resizable="column.resizable" :formatter="column.formatter" :show-overflow-tooltip="column.showOverflowTooltip"></el-table-column> </el-table> </div> </template> <script> export default { name: "TableList", props: { tableData: { type: Array, default: () => [] }, columns: { type: Array, default: () => [] }, height: { type: String, default: "" }, maxHeight: { type: String, default: "" }, stripe: { type: Boolean, default: true }, border: { type: Boolean, default: true }, defaultSort: { type: Object, default: () => {} }, showHeader: { type: Boolean, default: true }, highlightCurrentRow: { type: Boolean, default: true } } }; </script> ``` 在这个组件中,我们定义了以下 props: - `tableData`:表格数据,类型为 Array。 - `columns`:表格列的配置项,类型为 Array。每个配置项包含 `label`(列名)、`prop`(对应数据源的字段名)、`width`(列宽度)等属性。 - `height`:表格高度,类型为 String。 - `maxHeight`:表格最大高度,类型为 String。 - `stripe`:是否显示斑马纹,类型为 Boolean。 - `border`:是否显示边框,类型为 Boolean。 - `defaultSort`:默认排序规则,类型为 Object,包含 `prop`(排序字段名)和 `order`(排序方式)两个属性。 - `showHeader`:是否显示表头,类型为 Boolean。 - `highlightCurrentRow`:是否高亮当前行,类型为 Boolean。 通过封装这个 TableList 组件,我们可以在项目中更加方便地使用 Element-UITable 组件,同时也可以减少代码重复。 ### 回答2: element-ui是一款基于Vue.js的UI组件库,而tableList是element-ui中的一个组件封装tableList组件的主要作用是用于展示和管理数据表格。它提供了丰富的功能和选项,使得我们可以快速地构建出符合需求的数据表格界面。 首先,我们可以通过tableList组件来定义表格的列,包括列的名称、宽度、对齐方式等。可以根据实际需求设置不同的列,并且还可以对列进行排序、隐藏等操作。 其次,tableList组件还支持分页功能,可以根据数据的大小自动生成相应的分页器,方便用户浏览和查找数据。 另外,tableList还提供了搜索和筛选的功能,用户可以根据表格中的内容进行搜索和筛选操作,以方便快速找到想要的数据。 此外,tableList还支持多选、单选等操作,用户可以通过复选框或者单选按钮来选择需要的数据进行操作。 总的来说,tableList是element-ui中的一个封装组件,它简化了数据表格的开发和管理,提供了丰富的功能和选项,使得我们能够更加灵活和高效地展示和管理数据表格。 ### 回答3: element-ui封装中的tableList是对element-ui中的Table组件进行封装后的一个自定义组件。该组件可以方便地在项目中使用Table,减少重复代码的编写。 tableList的特点是具有高度的可定制性和扩展性。通过传入不同的参数和配置,可以实现不同的表格功能和样式。例如,可以通过指定columns来定义表格的列数和展示内容;通过指定data来传入数据源;通过设置pagination来实现分页等功能。 在tableList组件中,我们还可以通过插槽(slot)的方式来自定义表格的一些样式和功能。比如,可以使用slot="header"来自定义表头,使用slot-scope在插槽内部可以访问到每一行的数据。 除了基本的表格功能外,tableList还可以在数据源发生变化时进行自动刷新,通过设置@refresh事件来实现数据的实时更新。 总之,element-ui封装tableList组件可以帮助我们快速搭建出功能齐全、扩展性强的表格展示页面。它简化了我们对Table组件的使用,提高了开发效率,同时保留了element-ui原本的特性和优势。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值