vue项目中创建一个表格的公共组件

分享下项目中封装的表格组件,使用的element-ui里面的Table 表格进行的二次封装,里面加入了表格宽度自适应,自定义分页样式添加了首尾页的跳转

<template>
    <div style="height: 100%; display: flex; flex-direction: column">
        <div style="flex: 1; height: 0">
            <el-table
                ref="table"
                element-loading-text="Loading"
                stripe
                :data="tableData"
                :row-style="rowStyle"
                :cell-class-name="cellClassName"
                @cell-click="cellClick"
                border
                :span-method="objectSpanMethod"
                tooltip-effect="dark"
                style="font-size: 14px"
                height="100%"
            >
                <!-- 复选框前面有序号 -->
                <el-table-column
                    v-if="showSelection"
                    :selectable="checkSelectable"
                    width="80"
                    type="selection"
                    min-width="350"
                    max-width="100000"
                    align="center"
                ></el-table-column>
                <!-- 只是序号 -->
                <el-table-column type="index" label="序号" width="60" align="center" :index="indexMethod" v-if="indexShow">
                </el-table-column>
                <el-table-column
                    v-for="(item, index) in tableLabel"
                    :key="index"
                    :prop="item.field"
                    align="center"
                    :label="item.title"
                    :min-width="flexColumnWidth(item.field, item.title, tableData)"
                >
                    <!-- :width="flexColumnWidth(item.field,item.title, tableData)" -->
                </el-table-column>
            </el-table>
        </div>

        <!-- 分页 -->
        <div class="page-box">
          <el-pagination
            v-show="showPagination"
            style="text-align: center"
            :page-sizes="[5, 10, 15, 20]"
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page.sync="pager.currentPage"
            :page-size.sync="pager.pageSize"
            :hide-on-single-page="false"
            layout="slot, prev, pager, next"
            :total="pager.total"
            background
          >
            <el-button type="text" @click="jumpPage('0')" class="firstPage"></el-button>
          </el-pagination>
          <el-pagination
            v-show="showPagination"
            style="text-align: center"
            :page-sizes="[5, 10, 15, 20]"
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page.sync="pager.currentPage"
            :page-size.sync="pager.pageSize"
            :hide-on-single-page="false"
            layout=" slot, sizes, total"
            :total="pager.total"
            background
          >
            <el-button type="text" @click="jumpPage('1')" class="lastPage"></el-button>
          </el-pagination>
        </div>
    </div>
</template>

这个组件的分页,在element组件pagination分页的基础上加入插槽修改其原本的样式,添加了首页和尾页的跳转。如图所示:

js部分

<script>
export default {
    data() {
        return {};
    },
    props: {
        indexInfoList: {
            type: Array,
            default: () => {
                return [];
            }
        },
        tableData: {
            // 表格数据
            type: Array,
            default: () => {
                return [];
            }
        },
        tableLabel: {
            // label信息
            type: Array,
            default: () => {
                return [];
            }
        },
        tableOption: {
            // 操作数据
            type: Object,
            default: () => {
                return {};
            }
        },
        showSelection: {
            // 是否显示复选框
            type: Boolean,
            default: true
        },
        showPagination: {
            // 是否显示分页插件
            type: Boolean,
            default: true
        },
        indexShow: {
            type: Boolean,
            default: false
        },
        pager: {
            // 分页信息
            type: Object,
            default: function () {
                return {
                    currentPage: 1,
                    pageSize: 5,
                    total: 0
                };
            }
        }
    },
    created() {
     
    },
    mounted() {
      // this.UpdatePage()
    },
    updated() {
      // dom添加序列号
      this.UpdateTableHeader()
      this.UpdateTableBody()
    },
    methods: {
        checkSelectable(row) {
            return true;
            // console.log(row)
            // return row.isDelete != '0';
        },
        // 触发自定义按钮操作
        handleButton(method, row) {
            this.$emit('handleButton', method, row);
        },
        // 获取所有的复选框选项
        getAllSelections() {
            return this.$refs.table.selection;
        },
        // size发生变化时,令currentPgae为1,并发送自定义事件
        handleSizeChange(val) {
            this.pager.currentPage = 1;
            this.$emit('sizeChange', val);
        },
        // currentPage发生变化时,发送自定义事件
        handleCurrentChange(val) {
            this.$emit('currentPageChange', val);
        },
        cellClick(row, column, cell, event) {
            this.$emit('cellClick', row, column, cell, event);
        },
        cellClassName({ row, column, rowIndex, columnIndex }) {
            this.$emit('cellClassName', { row, column, rowIndex, columnIndex });
        },
        //列表序号修改
        indexMethod(index) {
            index = index + 1 + (this.pager.currentPage - 1) * this.pager.pageSize;
            return index;
        },
        // 自适应表格列宽
        flexColumnWidth(str, title, tableData) {
            // console.log(str);
            // console.log(title);
            // console.log(this.tableData);
            this.tableData.forEach((item) => {
                for (let j in item) {
                    item[j] = item[j].toString();
                }
            });
            // if (!tableData || !tableData.length || tableData.length === 0 || tableData === undefined) return false;
            if (!str || !str.length || str.length === 0 || str === undefined) return false;
            let columnLength = 0,
                temp = 0;
            for (let i = 0; i < tableData.length; i++) {
                if (!tableData[i][str]) {
                    tableData[i][str] = '';
                }
                let tCount = 0,
                    lCount = 0;
                for (let j = 0; j < tableData[i][str].length; j++) {
                    if (/^[\u4e00-\u9fa5]{0,}$/.test(tableData[i][str][j])) {
                        tCount += 4;
                    } else if (/^[A-Za-z0-9]+$/.test(tableData[i][str][j])) {
                        tCount += 2;
                    } else {
                        tCount += 0.5;
                    }
                }
                for (let k = 0; k < title.length; k++) {
                    if (/^[\u4e00-\u9fa5]{0,}$/.test(title[k])) {
                        lCount += 4;
                    } else if (/^[A-Za-z0-9]+$/.test(title[k])) {
                        lCount += 2;
                    } else {
                        tCount += 0.5;
                    }
                }
                temp = columnLength > tCount ? columnLength : tCount;
                columnLength = lCount > temp ? lCount : temp;
            }
            if (columnLength < 25) {
                columnLength = 25;
            }
            return columnLength * 6.2 + 'px';
        },

        // 给表头复选框添加序号
        UpdateTableHeader() {
          let tableHeader = document.querySelector(".el-table__header-wrapper")
          let tableHeaderSelect = tableHeader.querySelector(".el-table-column--selection")
          if (tableHeaderSelect) {
            let tableHeaderSelectCell = tableHeaderSelect.getElementsByClassName("cell")
            if (tableHeaderSelectCell[0].childNodes.length == 1) {
              // console.log(tableHeader);
              let span = document.createElement("span")
              span.innerHTML = `<span style="padding-left: 5px">序号</span>`
              // console.log(span);
              tableHeaderSelectCell[0].appendChild(span);
            }
          }
        },

        // 添加序列号
        UpdateTableBody() {
          let tableBody = document.querySelector(".el-table__body-wrapper")
          let tableBodySelect = tableBody.getElementsByClassName("el-table-column--selection")
          if (tableBodySelect) {
            var arr = Array.from(tableBodySelect)
            arr.forEach((item, index) => {
            let tableSelectCell = item.getElementsByClassName("cell")
            if (tableSelectCell[0].childNodes.length == 2) {
              tableSelectCell[0].removeChild(tableSelectCell[0].lastChild);
            }
            let span = document.createElement("span")
            span.innerHTML =`<span style="flex:1; padding-left: 5px">${this.indexMethod(index)}</span>` 
            tableSelectCell[0].appendChild(span);
          })
          }
        },

        // 首页尾页跳转
        jumpPage(value) {
          if (value === '0') {
            this.pager.currentPage = 1
            this.handleCurrentChange(this.pager.currentPage)
          } else {
            this.pager.currentPage = Math.ceil(this.pager.total/this.pager.pageSize)
            console.log(this.pager.currentPage);
            this.handleCurrentChange(this.pager.currentPage)
          }
        }
    }
};
</script>

 css部分

<style scoped>
div /deep/.location {
    color: #0000ee ;
    text-decoration: underline;
}
div /deep/.location:hover {
  cursor: pointer;
}
div /deep/.el-table,
.el-table__expanded-cell {
    background-color: rgb(255, 255, 255);
}
div /deep/.el-table th {
    background-color: #01c9db !important;
    color: #fff;
}
div /deep/.el-table--enable-row-hover .el-table__body tr:hover > td {
    background-color: rgba(217, 219, 223, 0.904);
}
div /deep/.el-pagination__total {
    color: #fff;
}
div /deep/.el-table--striped .el-table__body tr.el-table__row--striped.el-table__row--striped.el-table__row--striped td {
    background-color: #bfebed; /*替换为你需要的颜色,觉得优先级不够就加!important*/
}
div /deep/.el-pagination {
    padding: 10px 0;
}
div /deep/ .el-table-column--selection .cell{
    display: flex;
    justify-content:center;
    align-items: center;
}


div /deep/ .el-icon-arrow-left:before,
div /deep/ .el-icon-arrow-right:before{
  content: '';
}
div /deep/ .el-icon-arrow-left {
  background: url('../../assets/img/pageBreaks/advance.png') center center no-repeat;  /* 项目中的icon */
  width: 100%;
  height: 100%;
}
div /deep/ .el-icon-arrow-right {
  background: url('../../assets/img/pageBreaks/retreat.png') center center no-repeat; /* 项目中的icon */
  width: 100%;
  height: 100%;
}
div /deep/ .el-pager li:not(.disabled).active {
  background-color:transparent !important;
  color: #409eff !important;
}
div /deep/ .el-pagination.is-background .btn-next, 
div /deep/ .el-pagination.is-background .btn-prev, 
div /deep/ .el-pagination.is-background .el-pager li {
    margin: 0 5px;
    background-color:transparent;
    color: #fff;
    min-width: 30px;
    border-radius: 2px;
}
div /deep/ .el-pagination.is-background .el-pager li {
    border: 1px #fff solid;
}

.page-box {
  display: flex;
  justify-content: center;
}
.firstPage {
  padding: 0;
  background: url('../../assets/img/pageBreaks/firstPage.png') right center no-repeat; /* 项目中的icon */
}
.lastPage {
  padding: 0;
  background: url('../../assets/img/pageBreaks/lastPage.png') left center no-repeat; /* 项目中的icon */
}
</style>

以上就是组件的所有代码。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值