table table encapsulation

Effect:
Insert image description here

<!-- 表格组件  -->
<template>
  <div class="DbRecordTable">
    <el-table
      stripe
      ref="multipleTable"
      :cell-style="{ padding: '7px 0' }"
      border
      :data.sync="propdata.data"
      :row-key="rowKeys"
      :header-row-style="{ height: '66px' }"
      @row-click="singleClickChange"
      @selection-change="handleSelectionChange"
      :header-cell-style="{ 'text-align': 'center' }"
      highlight-current-row
      @select="onTableSelect"
      @sort-change="sortChange"
      @select-all="selectAll"
      :header-cell-class-name="handleHeaderCellClass"
      :key="isKey"
    >
      <el-table-column
        v-if="propdata.isIndex"
        label="序号"
        align="center"
        type="index"
        width="80"
      >
      </el-table-column>
      <!-- 多选 -->
      <el-table-column
        v-if="propdata.isCheck"
        type="selection"
        width="55"
        align="center"
        :reserve-selection="true"
        :selectable="checkSelect"
      ></el-table-column>
      <el-table-column
        :prop="item.prop"
        v-for="(item, index) in propdata.config"
        :label="item.label"
        :width="item.width"
        :key="index"
        :sortable="item.sortable"
        :align="item.align"
        show-overflow-tooltip
      >
        <template slot-scope="scope">
          <i
            :class="
              item.isView(scope.row) === true
                ? 'el-icon-view'
                : 'el-icon-search'
            "
            v-if="item.isIcon"
            style="color: #36a0f6; margin-right: 3px"
          ></i>
          <!-- string类型展示 -->
          <span>
            <el-tooltip
              v-if="item.emit"
              class="item"
              effect="dark"
              :content="item.content"
              :disabled="item.disabled"
              placement="top"
            >
              <span
                @click="operateFun(item.emit, scope.row)"
                style="color: #36a0f6"
              >
                {
    
    {
    
     scope.row[item.prop] }}
              </span>
            </el-tooltip>
            <span
              v-else-if="item.click"
              @click="operateFun(item.click, scope.row)"
              style="color: #36a0f6"
            >
              {
    
    {
    
     scope.row[item.prop] }}
            </span>
            <span v-else>
              {
    
    {
    
     scope.row[item.prop] }}
            </span>
          </span>
          <!--  操作按钮 -->
          <span v-if="item.type == 'button'">
            <template v-for="(buttonItems, btnInd) in item.child">
              <el-button
                :type="buttonItems.type"
                size="mini"
                v-if="buttonItems.isScope(scope.row)"
                :class="
                  buttonItems.isShow(scope.row) === true
                    ? 'textBackGround'
                    : 'disableTextBackGround'
                "
                :disabled="!buttonItems.isShow(scope.row)"
                @click="operateFun(buttonItems.emit, scope.row)"
                :key="btnInd + '1'"
              >
                <span> {
    
    {
    
     buttonItems.name }}</span>
              </el-button>
            </template>
            <!-- 图片按钮 -->
            <template v-for="(imgs, imgsIndex) in item.img">
              <img
                :key="imgsIndex"
                :src="scope.row.status !== '3' ? imgs.src : imgs.disabledSrc"
                alt=""
                :class="scope.row.status === '3' ? 'noClick' : ''"
                class="disabledImg"
                @click="operateFun(imgs.emit, scope.row)"
              />
            </template>
          </span>
        </template>
      </el-table-column>
    </el-table>

    <div class="pagination" v-if="propdata.isPaginationShow">
      <span v-if="search" class="totalItem"
        >共搜索 {
    
    {
    
     search }} 次,浏览 {
    
    {
    
     browse }}</span
      >
      <span v-if="marks" class="totalItem">共收藏档案 {
    
    {
    
     marks }}</span>
      <el-pagination
        @current-change="getdbRecordList"
        @size-change="handleSizeChange"
        :current-page="propdata.pagination.currentPage"
        :page-size="propdata.pagination.currentPageSize"
        :page-sizes="propdata.pagination.currentPageArr"
        :layout="propdata.pagination.layoutString"
        :total="propdata.pagination.total"
      >
      </el-pagination>
    </div>
  </div>
</template>
<script>
export default {
    
    
  name: "DbRecordTable",
  props: {
    
    
    propdata: {
    
    
      type: Object
    },
    height: {
    
    
      type: String,
      default: ""
    },
    rowKeys: {
    
    
      type: Function
    },
    isKey: {
    
    
      type: String
    },
    selectableSign: {
    
    
      type: String
    }, // 标识是哪部分的新增(挂失/销毁/借阅/移交/打印)
    search: Number,
    browse: Number,
    marks: Number
  },
  data() {
    
    
    return {
    
    
      multipleSelection: [], // 表格多选框的数据
      prevSort: "",
      prevProp: "",
      orderArray: []
    };
  },
  watch: {
    
    },
  methods: {
    
    
    checkSelect(row) {
    
    
      let isChecked = true;
      if (this.selectableSign === "sign_loss") {
    
    
        // 挂失新增
        if (row.status !== "正常" && row.status !== "借阅中") {
    
    
          isChecked = false;
        } else {
    
    
          isChecked = true;
        }
      } else if (this.selectableSign === "sign_destroy") {
    
    
        //销毁新增
        if (row.status === "挂失" || row.status === "借阅中") {
    
    
          isChecked = false;
        } else {
    
    
          isChecked = true;
        }
      } else {
    
    
        // status: 1 是没有封卷,2 是已经封卷, 3 是年度封档
        if (
          row.status === "2" ||
          row.status === "3" ||
          row.status === "已失效" ||
          row.status === "已解挂"
        ) {
    
    
          // 判断里面是否存在某个参数
          isChecked = false;
        } else {
    
    
          isChecked = true;
        }
      }
      return isChecked;
    },
    // 操作按钮
    operateFun(emit, row) {
    
    
      this.$emit("operateFun", emit, row);
    },
    handleHeaderCellClass({
     
      column }) {
    
    
      this.orderArray.forEach(element => {
    
    
        if (column.property === element.prop) {
    
    
          column.order = element.order;
        }
      });
    },
    // 排序操作
    sortChange(column, prop, order) {
    
    
      if (column.order) {
    
    
        //参与排序
        let flagIsHave = false;
        this.orderArray.forEach(element => {
    
    
          if (element.prop === column.prop) {
    
    
            element.order = column.order;
            flagIsHave = true;
          }
        });

        if (!flagIsHave) {
    
    
          this.orderArray.push({
    
    
            prop: column.prop,
            order: column.order
          });
        }
      } else {
    
    
        //不参与排序
        this.orderArray = this.orderArray.filter(element => {
    
    
          return element.prop !== prop;
        });
      }
      this.$emit("sortChange", column, prop, order);
    },

    // 是否选中
    onTableSelect(rows, row) {
    
    
      this.$emit("onTableSelect", rows, row);
      // let selected = rows.length && rows.indexOf(row) !== -1;
      // console.log(selected); // true就是选中,0或者false是取消选中
    },

    // 点击分页
    getdbRecordList(val) {
    
    
      this.$emit("getdbRecordList", val);
    },
    // 每页条数
    handleSizeChange(val) {
    
    
      this.$emit("handleSizeChange", val);
    },
    // 表格前面多选框
    handleSelectionChange(val) {
    
    
      this.$emit("multipleSelection", val);
      // this.multipleSelection = val;
    },
    // 鼠标单击
    singleClickChange(row) {
    
    
      this.$emit("singleClickChange", row);
    },
    selectAll(row) {
    
    
      this.$emit("selectAll", row);
    }
  },
  mounted() {
    
    
    this.$refs.multipleTable.columns.forEach(item => {
    
    
      if (item.property == "recordYear" || item.property == "studentYear") {
    
    
        item.order = "descending";
      } else {
    
    
        item.order = "ascending";
      }
    });
  }
};
</script>
<style>
.el-scrollbar__wrap {
    
    
  overflow: auto;
}
</style>
<style lang="less" scoped>
/* 修改 滚动条的 下面 的 样式 */
.main::-webkit-scrollbar-track {
    
    
  background-color: white;
  -webkit-border-radius: 2em;
  -moz-border-radius: 2em;
  border-radius: 2em;
}
/* 修改 滑块 */
.main::-webkit-scrollbar-thumb {
    
    
  background-color: #dcdfe6;
  -webkit-border-radius: 2em;
  -moz-border-radius: 2em;
  border-radius: 2em;
}
/deep/ .el-table__body-wrapper {
    
    
  cursor: pointer;
}
// 点击表格背景
/deep/ .el-table__body tr.current-row > td {
    
    
  background-color: #e4f1fe !important;
}
/deep/ .el-icon-refresh-right {
    
    
  font-weight: 600;
}
/deep/ .el-icon-search {
    
    
  font-weight: 600;
}
/deep/ .cell {
    
    
  font-size: 16px;
}
/deep/ .el-table {
    
    
  overflow: auto;
}
.disabledImg {
    
    
  vertical-align: middle;
  margin-left: 10px;
  cursor: pointer;
}
.noClick {
    
    
  pointer-events: none;
}
.DbRecordTable {
    
    
  height: 100%;
  display: flex;
  flex-direction: column;
  .textBackGround {
    
    
    color: #36a0f6;
    font-weight: 600;
  }
  .disableTextBackGround {
    
    
    color: #999;
    font-weight: 600;
  }
  /deep/ .el-button--primary.is-disabled {
    
    
    background-color: #fff;
    border-color: #999;
    color: #999;
  }
}
.pagination {
    
    
  height: 50px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.tabFooter {
    
    
  margin-top: 20px;
  display: flex;
  justify-content: space-between;
}
.totalItem {
    
    
  color: #606266;
  font-size: 13px;
  font-weight: 400;
  margin-right: 10px;
  // position: absolute;
  // left: 14%;
}
</style>

Guess you like

Origin blog.csdn.net/weixin_48300785/article/details/126643249