基于element table二次封装

文章展示了如何在Vue.js中封装一个名为myTable的组件,该组件包含表格和分页功能。表格支持动态配置列,如宽度、对齐方式,以及自定义渲染。同时,提供了多选、边框、隔行换色等选项。分页功能允许用户更改每页条数并响应翻页事件。组件在子组件中使用,用于展示数据并处理表格操作,如查看功能。
摘要由CSDN通过智能技术生成

直接上代码
// 父组件

<!-- MyTable组件 -->
<template>
  <div class="myTable">
    <el-table
      :data="tableData"
      :border="page.isBorder"
      :stripe="page.isStripe"
      style="width: 100%"
      ref="multipleTable"
      tooltip-effect="dark"
      @selection-change="SelectionChange"
    >
      <el-table-column v-if="page.isMutiSelect" type="selection" style="width: 55px">
      </el-table-column>
      <el-table-column
        v-for="(item, i) in tableTitle"
        :key="i"
        :label="item.label"
        :prop="item.prop"
        :width="item.width"
        :max-height="item.height"
        :align="item.align"
      >
        <template slot-scope="scope">

          <template v-if="!item.render">
  
            <template v-if="item.formatter">
              <span v-html="item.formatter(scope.row, item)"></span>
            </template>

            <template v-else>
              {{ scope.row[item.prop] }}
            </template>
          </template>

        </template>
      </el-table-column>
      <slot name="handleColumn"></slot>
    </el-table>

    <el-pagination
      class="page_sty"
      style="text-align: right"
      background
      @size-change="getSize"
      hide-on-single-page
      @current-change="getCurChange"
      :page-size.sync="page.pageSize"
      :page-sizes="page.pageSizesArr"
      :current-page.sync="page.pageNum"
      layout="total, sizes, prev, pager, next,jumper"
      :total="page.total"
    >
    </el-pagination>
  </div>
</template>

<script>
export default {
  name: 'myTable',

  props: {
    // 表格数据
    tableData: {
      type: Array,
      default: () => {
        return []
      }
    },
    // 表格配置项
    tableTitle: {
      type: Array,
      default: () => {
        return []
      }
    },
    // 页码 每页条数 总数
    page: {
      type: Object,
      default: function () {
        return {
          pageNum: 1, // 分页-当前页
          pageSize: 10,
          total: 0,
          // 是否有边框 默认true
          isBorder: true,
          // 是否隔行换色 默认true
          isStripe: true,
          // 每页条数
          pageSizesArr: [5, 10, 20, 50, 100],
          // 是否多选
          isMutiSelect: false
        }
      }
    }
  },
  data() {
    return {

    }
  },
  methods: {
    SelectionChange(val) {
      //多行选中,暂时没用上
      console.log(val, 'ppo')
    },
    // 修改每页条数
    getSize(val) {
      this.$set(this.page, 'pageNum', 1)
      this.$emit('getPageTable', this.page.pageNum, val)
    },
    // 翻页
    getCurChange(val) {
      this.$emit('getPageTable', val, this.page.pageSize)
    }
  }
}
</script>
<style  scoped>
.page_sty {
  margin: 10px auto 0;
  text-align: center;
}
</style>

子组件

<template>
    <myTable
      :tableTitle="tableTitle"
      :tableData="tableData"
      :page="pages"
      @getPageTable="getTable"
      @getSize="getTable"
      v-loading="loadingTab"
    >
          <div slot="handleColumn">
        <el-table-column fixed="right" label="操作" width="120" align="center">
          <template slot-scope="scope">
            <el-button @click="seeFun(scope.row)" type="primary" round size="mini"
              >查看</el-button
            >
          </template>
        </el-table-column>
      </div>
    </myTable>
</template>
  
  <script>
import { videosList } from '@/request/api/videoPublishing/home'
import myTable from '@/components/myTable.vue'


export default {
  components: {
    //声明子组件
    myTable
  },
  props: {
    // 使用props接收参数
    dialogVisible: Boolean,
    dataPageId: Number
  },

  data() {
    return {
      // 加载
      loadingTab: false,

      // 表格配置项
      tableTitle: [
        //表头数据w
        { label: '序号', prop: 'index', width: '100px',align:'center'  },
        { label: 'id', prop: 'id',align:'center'  },

        {
          label: '是否完成',
          prop: 'isComplete',
          align:'center',
          formatter: (row, column) => {
            return row.isComplete== 1 ? '是' : '否'
          }
        },
        { label: '完成时间', prop: 'time',align:'center'  }
      ],
      tableData: [], //表格数据
      pages: {
        //分页数据
        pageNum: 1, // 分页-当前页
        pageSize: 10,
        total: 0,
        // 是否有边框 默认true
        isBorder: true,
        // 是否隔行换色 默认true
        isStripe: true,
        // 每页条数
        pageSizesArr: [5, 10, 20, 50, 100],
        // 是否多选
        isMutiSelect: false
      }
    }
  },
  created() {
 
    this.getTable(this.pages.pageNum, this.pages.pageSize)
  },
  methods: {
  //请求表格数据
    getTable(pageNum, pageSize) {
      let data = {
        pageid: this.dataPageId,
        pageNum: this.pageNum,
        pageSize: this.pageSize
      }
      this.loadingTab = true
      videosList(data)
        .then((res) => {
        // 表格复制
          this.tableData = res.data
          // 前端生成序号
          this.tableData.forEach((item, i) => {
            item.index = indexMethod(i, pageNum, pageSize)
          })

          // 总条数赋值
          this.pages.total = res.page.RecordCount
          this.loadingTab = false
        })
        .catch((err) => {
          this.loadingTab = false
        })
    },


  }
}
</script>
  

<style scoped>

</style>

简单封装了一下,后期如果有别的需求还会完善!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值