表格的封装,可以直接复制使用

47 阅读4分钟

首先先安装elementUI

npm i element-ui -S

然后就是引用:

1.完整引入

/*在 main.js 中写入以下内容:*/
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';
Vue.use(ElementUI); 
new Vue({ 
    el: '#app', 
    render: h => h(App) 
 });
  1. 按需引入(按需引入就根据官网来进行引入,本篇文章就不多说了)

    Element - 网站快速成型工具(vue2)

    一个 Vue 3 UI 框架 | Element Plus (element-plus.org)(vue3)

  2. 接下来就是正题了,以下就是封装好的表格组件

<style type="text/css" scoped>
.system-table-box {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  /* height: 100%; */
}


.system-table-box .system-table {
  flex: 1;
  height: 100%;
  font-size: 12px;
  color: #222;
}

.system-table-box .system-page {
  margin-top: 20px;
}

.system-table-box .el-empty {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}

.system-table-box .elPagination {
  width: 100%;
  display: flex;
  flex-direction: row-reverse;
  position: relative;
}

.skip {
  position: absolute;
  right: 155px;
  top: 22px;
  display: flex;
}

</style>
<style>
  /* 表格右上角 */
  .system-table-box .theme-coustom .el-table--border th,
  .theme-coustom .el-table__fixed-right-patch {
    background: #f5f6fa;
    border-bottom: none !important;
    border-left: none !important;
  }

  /* 分页箭头 */
  .system-table-box .el-select
  .el-input .el-select__caret::before {
    content: "";
    background: url(../img/topArrow.png) center center no-repeat;
    /* background-size: 18px 15px; */
    position: absolute;
    width: 100%;
    height: 100%;
    appearance: none;
  }

  /* 分页一页显示几条div样式 */
  .system-table-box .el-pagination
  .el-select .el-input .el-input__inner {
    border-radius: 20px;
    font-size: 12px;
  }

  /* 分页箭头方向 */
  .system-table-box .el-select
  .el-input .el-select__caret.is-reverse {
    transform: rotateZ(180deg) !important;
  }

  /* 表格格子样式 */
  .system-table-box .theme-coustom .el-table td,
  .theme-coustom .el-table th.is-leaf {
    color: #222;
    font-size: 12px;
    padding: 0;
    height: 38px;
  }

  .system-table-box
  .el-table td, .el-table th {
    padding: 6px 0;
  }

  .system-table-box .blue {
    color: #0070cc !important;
    cursor: pointer !important;
    font-size: 14px;

  }

  .system-table-box .orange {
    color: orange !important;
    cursor: pointer !important;
    font-size: 14px;
  }

  .system-table-box .red {
    color: red !important;
    cursor: pointer !important;
    font-size: 14px;
  }

  .system-table-box .width100 {
    width: 100%;
  }

  .system-table-box .around {
    display: flex;
    justify-content: space-around;
    align-items: center;
    
    padding-right: 10px;
  }

  .system-table-box .el-table th .cell {
    white-space: nowrap !important;
    text-overflow: ellipsis;
    word-break: break-all;
  }

  .system-table-box .el-table .cell {
    padding-right: 0;
    line-height: normal;
  }

  .system-table-box .el-table__placeholder {
    width: 15px;
  }

  /* 表格  输入模式(输入框, 选择框... 样式调整) */
  .system-table-box .el-input__inner {
    height: 22px !important;
    border: 0 !important;
    font-size: 14px !important;
  }

  .system-table-box .sr {
    margin-right: 7px !important;
  }

  .system-table-box .el-select {
    width: 100% !important;
  }

  .system-table-box .el-input-group__append {
    border: 0 !important;
  }

  .system-table-box .el-input__icon {
    height: auto !important;
    line-height: 23px !important;
  }

  .system-table-box
  .el-date-editor .el-range-input, .el-date-editor .el-range-separator {
    height: auto !important;
  }

  .system-table-box
  .el-table--scrollable-x .el-table__body-wrapper {
    /* display: flex; */
    align-items: center;
    justify-content: center;
    flex-direction: column;
  }

  .system-table-box .el-table__empty-text {
    line-height: 25px;
  }


  /* 个性化跳转页面模块 */

  /* .system-table-box .cssExceed {
    white-space: normal !important;
    text-overflow: ellipsis !important;
    overflow: hidden !important;
  } */

  /* .system-table-box
  .el-pagination .el-select .el-input {
    margin-right: 135px;
  } */

  /* .system-table-box .is-scrolling-none {
    height: auto !important;
  } */

  /* 347  122  */
  /* .system-table-box .is-scrolling-none {
    height: 540px;
  } */
</style>
<template>
  <!-- :style="{height: tableHeight}" -->
  <!-- :header-cell-style="{background: '#f5f6fa'}" -->
  <div class="system-table-box" ref="tableView" id="tableId" :style="{height: tableHeight != '100%' && tableHeight != 'all' ?  tableHeight + '!important' : tableHeight == 'all' ? '100% !important' : '100%'}">
    <el-table ref="table" v-bind="$attrs" class="system-table" height="100%" :data="data" @selection-change="handleSelectionChange" @select='onTableSelect' @select-all='selectAll' :border="true" v-loading="loading" element-loading-text="Loading..." element-loading-background="rgb(228 239 236 / 79%)" :highlight-current-row="tableRadio" @current-change="tableRadioChange" :span-method="spanMethod" :lazy="lazy" :row-key="rowKey" :load="handleLoad" :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
      <template #empty>
        <el-empty description="暂无数据" :image-size="emptySize"></el-empty>
      </template>
      <el-table-column type="selection" align="left" width="35" v-if="showSelection" :reserve-selection="reserveSelection" :selectable="selectable" />
      <el-table-column label="序号" width="60" align="center" v-if="showIndex">
        <template #default="scope">
          {{ (page.index - 1) * page.size + scope.$index + 1}}
        </template>
      </el-table-column>
      <slot></slot>
      <!-- <el-table-column label="操作demo" :width="150" fixed="right">
        <template #default="{row}">
          <el-button-group class="width100" >
            <div id="tableButtonId" ></div>
           <el-dropdown>
              <span class="el-dropdown-link">
                更多<i class="el-icon-arrow-down el-icon--right"></i>
              </span>
              <el-dropdown-menu slot="dropdown" id="tableButtonId" >
                <div></div>
              </el-dropdown-menu>
            </el-dropdown>
          </el-button-group>
        </template>
      </el-table-column> -->
    </el-table>
    <!-- 分页 -->
    <div class="elPagination" v-if="showPage">
      <!-- background -->
      <el-pagination :current-page="page.index" :layout="pageLayout" :total="page.total" :page-size="page.size" :page-sizes="pageSizes" @current-change="handleCurrentChange" @size-change="handleSizeChange" class="system-page">
      </el-pagination>
    </div>
  </div>
</template>
<script type="text/javascript">
export default {
  //复用组件
  components: {},
  //接收父组件数据
  props: {
    reserveSelection: { type: Boolean, default: false },
    lazy: { type: Boolean, default: false }, // 树形模式
    rowKey: { type: String, default: 'cId' }, // 设置树形模式key
    tableRadio: { type: Boolean, default: false }, // 是否单选
    emptySize: { type: Number, default: 120 },
    tableHeight: { type: String, default: '100%' },
    loading: { type: Boolean, default: false }, // 数据加载
    data: { type: Array, default: () => [] }, // 数据源
    select: { type: Array, default: () => [] }, // 已选择的数据,与selection结合使用
    showIndex: { type: Boolean, default: false }, // 是否展示index选择,默认否
    showSelection: { type: Boolean, default: false }, // 是否展示选择框,默认否
    selectable: {
      type: Function,
      default: () => {
        return true
      }
    },
    showPage: { type: Boolean, default: true }, // 是否展示页级组件,默认是
    pageLayout: { type: String, default: "sizes, prev, pager, next, jumper" }, // 分页需要显示的东西,默认全部 "显示总条数(total)"
    page: { // 分页参数
      type: Object,
      default: () => {
        return { index: 1, size: 10, total: 0 }
      }
    },
    pageSizes: {
      type: Array,
      default: () => {
        return [5, 10, 20, 50, 100]
      }
    },
    spanMethod: {
      type: Function,
      default: () => {}
    }
  },
  data() {
    return {
      timer: null,
      table: [],
      checkList: [],
    }
  },

  beforeDestroy() {},
  computed: {},
  watch: {},
  activied() {},
  mounted() {
    // window.addEventListener('resize', this.packResize)

    // this.$nextTick(() => {
    //   var node = document.getElementById("buttonId"); // 通过id选择器获取节点对象
    //   console.log(node);
    //   var htmlContent = node.innerHTML; // 获取节点的HTML内容
    //   // console.log( '<el-dropdown-item>' + htmlContent + '</el-dropdown-menu>');
    //   var tableId = document.getElementById("tableButtonId");
    //   tableId.innerHTML = htmlContent
    // })


  },
  beforeDestroy() {},
  methods: {
    // 页面尺寸改变时触发
    packResize(e) {},
    // 表格树形懒加载
    handleLoad(tree, treeNode, resolve) {
      this.$emit('handleLoad', tree, treeNode, resolve)
    },
    // 单选数据
    tableRadioChange(val) {
      this.$emit("tableRadioChange", val)
    },
    // 分页相关:监听页码切换事件
    handleCurrentChange(val) {
      this.$emit("currentChange", val)
    },
    // const vLoading = computed(() => props.loading)
    // 分页相关:监听单页显示数量切换事件
    handleSizeChange(val) {
      this.$emit("sizeChange", val)
    },
    // 表前复选框勾选事件
    handleSelectionChange(val) {
      this.$emit("selection-change", val)
    },
    onTableSelect(rowArr, row) {
      this.$emit("select", rowArr, row)
    },
    selectAll(selection) {
      this.$emit("select-all", selection)
    },
    // 多选勾选框回填 (自动勾选)
    // (checkList: 需勾选的数组)
    // (key: 与总数组对比的key)
    toggleRowSelection(checkList, key) {
      this.checkList = checkList
      this.$refs.table.clearSelection();
      if (checkList.length == 0) return

      this.$nextTick(() => {
        for (let item of this.data) {
          for (let val of this.checkList) {
            if (val[key] == item[key]) this.$refs.table.toggleRowSelection(item, true);
          }
        }
      })
    },
    clearSelection() {
      this.$refs.table.clearSelection();
    },
    // 单选回填 (自动高亮)
    separateSelection(val, key) {
      this.checkList = val
      //this.curRow之前选中的行
      let curIndex = this.data.findIndex(item => item[key] === this.checkList[0][key])
      //如果之前选中的行被删除,默认选中第一行
      this.$nextTick(() => {
        let rows = this.$refs.table.$el.querySelectorAll('tbody > tr.el-table__row')
        if (rows.length) {
          rows = Array.from(rows)
          rows.forEach(item => item.classList.remove('current-row'))

          // 直接更改样式
          curIndex === -1 ? rows[curIndex].classList.add('') : rows[curIndex].classList.add('current-row')
        }
      })
    },
    setCurrentRow(row) {
      if (this.$refs.table) {
        this.$refs.table.setCurrentRow(row);
      }
    },
    setToggleRowSelection(row, select) {
      if (row) {
        if (this.$refs.table) {
          this.$nextTick(() => {
            this.$refs.table.toggleRowSelection(row, select);
          });
        }
      }
    },
    /**
     * 获取表格store
     * */
    getStore() {
      return this.$refs.table.store;
    }
  }
}

</script>