前端 基于Element-ui 二次封装el-table

 自己工作中封装的 el-table,包含了分页器和el-table 表格,保存起来

1、组件内容

<template>
  <div class="question-table">
    <template>
      <el-table :data="allDate.items" style="width: 100%">
        <el-table-column v-if="isSerialShow" type="index" label="序号" />
        <el-table-column
          v-for="(item,index) in tableDetails"
          :key="index"
          :label="item.title"
          :prop="item.key"
        >
          <!-- 过滤时间、前台是否显示 -> 插槽-->
          <template slot-scope="{row}">
            <span>
              {
   
   {
                item.formatDate && item.formatDate(row.addDate)
                  ||item.isFrontShow && item.isFrontShow(row.isFrontDisplay)
                  ||item.stateNow && item.stateNow(row.state)
                  ||item.aa && item.aa(row.state)
                  || row[item.key]
              }}
            </span>
          </template>
          <!-- 过滤插槽-->
        </el-table-column>

        <el-table-column label="操作" width="300">
          <template slot-scope="{row}">
            <slot :row="row" />
          </template>
        </el-table-column>

      </el-table>
      <!-- 分页器 -->
      <el-row type="flex" justify="end">
        <el-pagination
          background
          :current-page="parseInt(allDate.page)"
          :page-sizes="[5, 10, 20, 50]"
          :page-size="parseInt(allDate.pagesize)"
          layout="prev, pager, next,sizes, jumper"
          :total="parseInt(allDate.counts)"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
        />
      </el-row>
    </template>
  </div>
</template>

<script>

export default {
  name: 'QuestionTable',
  components: {},
  props: {
    allDate: { // 所有数据信息
      type: Object,
      required: true
    },
    tableDetails: { // 表格的标题和字段
      type: Array,
      required: true
    },
    listPage: { // axios 发送的页码信息
      type: Object,
      required: true
    },
    pagesize: { // 获得以前的页大小,规避BUG
      type: Number,
      required: true
    },
    isSerialShow: { // 是否显示最左侧序号
      type: Boolean,
      default: true
    }
  },
  data() {
    return {
    }
  },
  computed: {},
  watch: {},
  created() {
  },
  mounted() {},
  methods: {
    // 页码数量 改变
    handleSizeChange(pagesize) {
      this.$emit('update:listPage', {
        page: 1,
        pagesize: pagesize
      })
      this.$emit('updateList')
    },
    // 点击页码
    async handleCurrentChange(page) {
      this.$emit('update:listPage', {
        page: page,
        pagesize: this.pagesize
      })
      // 通知父组件刷新获取的数据
      this.$emit('updateList')
    }
  }
}
</script>
<style lang="scss">
.el-table th{
    background: #fafafa;
    border-bottom: 1px solid #e8e8e8 !important
}
.el-pagination{
  margin-top: 20px;;
}
.el-button--text{
  font-size: 12px;
}
</style>

 2、父组件进行使用

<subject-table
  :all-date="allDate"
  :table-details="tableDetails"
  :list-page.sync="listPage"
  :pagesize="listPage.pagesize"
  @updateList="getSubjectList()"
>
  <template slot-scope="{row}">
       // row 中可以获取到 当前行的值
  </template>
</subject-table>

3、各参数传递格式 与:

1、allDate:所有数据   -->   必传

        他是当前table 需要遍历的数组,也就是 组件中需要传递的 :data,他是组件中的每一列遍历的内容的基础数据

 2、tableDetails:标题和查询字段 -->   必传

表格的标题和字段,他是一个数组,包含两个必须的属性,和一个过滤器,用来过滤

   key:字段

        是el-table 要在刚才传递的allData 中遍历后获取他里面的字段的 key值,用于显示页面,他与 allData中要获取到的数据的字段是一致的

    title:标题

        是每一列的标题位置,通常这个是根据ui 来设置的,这是死的。

    过滤器:

        可以用import 来引入一个过滤器,并return 出过滤好的值,将他添加到对应的对象中,并在子组件的template 中设置好就可以过滤

举例:tableDeatils的实例格式

import { formatDate, isFrontShow } from '@/filters'

tableDetails: [
  {
    title: '学科名称',
    key: 'subjectName'
  },
  {
    title: '创建日期',
    key: 'addDate',
    formatDate:formatDate
  },
  {
    title: '前台是否显示',
    key: 'isFrontDisplay',
    isFrontShow: isFrontShow
  },
]

  注意:一定要在 子组件的template 中定义好,不然不起效果!

3、listPage:axios 发送的页码信息   -->   必传

我获取table 渲染的字段的内容,通常是传递的页码,当前页码和当前显示的多少页

 listPage 举例:

listPage: { // 传递页码
  page: 1,
  pagesize: 10
}

必须传递  list-page.sync   需要加.sync 修饰符,不然翻页不会重新发送axiox请求!

4、pagesize:  单独传递后端返回的页码    -->  必传

通常我们都是通过在 第三个字段 listPage 这个字段中 进行获取,内部逻辑必须需要重新进行传递!

传递内容通常是:listPage.pagesize

 5、isSerialShow:序号    ---> 非必传

传递一个布尔值,用来控制第一列 是否显示序号,非必传

 6、@updateList 方法  -->  必传

当点击页码

当页码数量 改变

子组件会触发 父组件的 updateList 方法,重新发送axiox 请求,来获取最新的数据

当更新后,他会修改子组件的 listPage ,然后父组件再次调用请求接口 并携带最新的listPage 来重新获取数据

字段内容都是需要 父组件和子组件进行配合使用,配合Element-ui + 子组件代码比较好理解,留下内容,防止以后忘记,很好用~

附带 el-table 文档地址:Element - The world's most popular Vue UI framework

猜你喜欢

转载自blog.csdn.net/Kerwin__li/article/details/129050380
今日推荐