el-table多選分頁與全選分頁

一抖僵、el-table多選分頁時边琉,記住其他頁的選中狀態(tài)

實現方法:
核心是el-table-column的reserve-selection屬性

image.png

1.通過type="selection"設置復選框列逊躁,重點在于 reserve-selection 屬性斑举,設置為true時筹煮,數據更新之后保留之前選中的數據贮泞。
2.需要表格屬性“row-key”的配合,在使用 reserve-selection 功能的情況下酬土,該屬性是必填的荆忍。將row-key設置為表格中唯一的字段名稱(例如programId)。這樣就實現了后端分頁在翻頁或切換條數時撤缴,記住之前的復選框選項刹枉。

<el-table
        :data="tableData"
        :row-key="getRowKey"
        @selection-change="handleSelectionChange"
      >
        <el-table-column
          type="selection"
          width="55"
          :reserve-selection="true"
        />
        ...
</el-table>
getRowKey(row) {
      //唯一標識
      return row.id
},
handleSelectionChange(selected) {
      console.log('選中的數據list---', selected)
},

二、el-table在ajax分頁時支持單頁全選和所有頁全選

image.png
image.png

界面代碼:

  <el-table :data="tableData"
                    :height="tableHeight"
                    border
                    style=" 100%"
                    ref="table"
                    @selection-change="handleSelectionChange"
                    >
            <el-table-column prop="id"
                             fixed
                             align="center">
              <el-table-column type="selection"
                               width="75">
              </el-table-column>
              <template slot="header"  slot-scope="scope">
                <div>
                  <el-checkbox v-model="checkedAll"
                               @change="changeCheckAll">所有</el-checkbox>
                </div>
              </template>
            </el-table-column>
    ......
  </el-table>
          <pager :pager="pager"
                 @query="getList"
                 @setPager="onChangePage"></pager>

table上使用了ref屬性腹泌,因為全選和反選時要用到dom操作方法toggleRowSelection嘶卧,同樣,表格自動鋪滿縱向屏幕時凉袱,也需要進行dom操作芥吟,這并非本節(jié)所講內容,只是簡單提一下专甩,el-table并沒有像layui中的table那樣提供百分比-固定像素的方式響應式制定表格高度钟鸵,我們得手動用js計算瀏覽器屏幕高度。
 js部分代碼如下:

import pager from "@/components/table/Pager.vue";

 export default {
 components: {pager},
  data () {
    return {
   checkedAll: false, //全選所有
 }
 },
  methods: {
   // 全選操作
    handleSelectionChange (val) {
      this.loading = val.length > 0 ? false : true;
        this.multipleSelection = val;
    },
    // 選擇需要的/取消選中
    toggleSelection (rows) {
      if (rows) {
        rows.forEach(row => {
          this.$refs.table.toggleRowSelection(row);
        });
      } else {
        this.$refs.table.clearSelection();
      }
    },
    //改變全選所有復選框
    changeCheckAll (val) {
      if (val) {
        // 全選選中時當前頁所有數據選中
        this.tableData.forEach(row => {
          if (row) {
            this.$refs.table.toggleRowSelection(row, true);
          }
        });
      } else {
        this.$refs.table.clearSelection();
      }
    },
 }
}

在每次點擊“頁碼“之后涤躲,會自動執(zhí)行查詢方法棺耍,此時,如果點擊了全選所有按鈕种樱,要在數據執(zhí)行查詢之后蒙袍,再選中當前頁面所有項,代碼如下所示:
由于所有的dom操作要在dom渲染之后執(zhí)行嫩挤,所以使用了this.$nextTick()方法害幅。

//執(zhí)行查詢方法getList后回調函數當中編寫如下代碼:
if(this.checkedAll){
           this.$nextTick(()=>{
            this.changeCheckAll(this.checkedAll);
           })
    }

在element-ui的Table組件當中,并沒有提供給表頭當中的復選框設置文本的屬性和方法岂昭,我們可以通過使用css偽類來創(chuàng)建文本以现。
/deep/用于在css作用域當中進行樣式透傳,覆蓋子組件的樣式约啊。

/deep/ .el-table__header .el-table-column--selection .cell .el-checkbox:after {
  content: "當頁";
  color: #606266;
  font-weight: 500;
  margin-left: 10px;
  font-size: 14px;
}

分頁組件Pager.vue是對el-pagination組件的二次封裝邑遏,其代碼如下:
最重要的一點,就是所有頁全選時的id集合恰矩,是每次查詢時傳遞過來的记盒,將其臨時存儲在data中,這樣的話需要進行批量操作時外傅,可以直接將這些id集合傳遞過去孽鸡。當然蹂午,如果查詢接口不把這些id集合帶過來,我們也可以傳一個所有頁全選的標識給到后端彬碱,后端根據這個標識,重新去查詢數據奥洼。

<!-- 分頁查詢
<pager :pager=[分頁對象] @query=[列表查詢方法] />
-->
<template>
  <div class="pagination-box clear">
    <span class="page-total fl">
      共有記錄:
      <span>{{ pager.total }}</span>條
    </span>
    <el-pagination
      :small="small"
      :layout="layout"
      background
      :pager-count="7"
      :total="pager.total"
      :current-page.sync="pager.pageNum"
      :page-size="pager.pageSize"
      :page-sizes="pageSize"
      @size-change="onChangeSize"
      @current-change="onChangePage"
    ></el-pagination>
    <span v-if="refresh" class="btn-refresh fn-right" title="刷新" @click="$emit('query')">
      <i class="fas fa-redo"></i>
    </span>
  </div>
</template>

<script>
export default {
  name: "Pager",
  props: {
    small: {
      type: Boolean,
      default: false
    },
    layout: {
      type: String,
      default: "sizes,jumper, prev, pager, next"
    },
    pager: {
      type: Object,
      required: true
    },
    refresh: {
      type: Boolean
    },
    pageSize: {
      type: Array,
      default: () => {
        return [10, 15, 20, 50, 100, 200];
      }
    },
    props: {
      type: Object,
      required: false,
      default: () => ({
        pageNum: "pageNum", // 第幾頁
        pageSize: "pageSize", // 顯示條數
        total: "total" // 總記錄條數
      })
    }
  },
  // 設置綁定參數
  model: {
    prop: "pager",
    event: "setPager"
  },
  computed: {
    total() {
      return this.pager[this.props.total] || 0;
    },
    // 檢測獲取到的數據是否為空
    isEmptyList() {
      return (
        Math.ceil(
          this.pager[this.props.total] / this.pager[this.props.pageSize]
        ) < this.pager[this.props.pageNum]
      );
    }
  },
  watch: {
    total() {
      // 存在記錄但未獲取到數據時, 重新請求
      if (this.pager[this.props.pageNum] > 1 && this.isEmptyList) {
        this.$emit(
          "setPager",
          Object.assign(this.pager, {
            [this.props.pageNum]: this.pager[this.props.pageNum] - 1
          })
        );
        this.$emit("query");
      }
    }
  },
  methods: {
    // 每頁條數
    onChangeSize(pageSize) {
      const temp = {
        [this.props.pageSize]: pageSize,
        // 當顯示條數小于或等于總條數時巷疼,重置頁數
        [this.props.pageNum]:
          pageSize <= this.total ? 1 : this.pager[this.props.pageNum]
      };
      this.$emit("setPager", Object.assign(this.pager, temp));
      // 觸發(fā)父組件查詢請求
      this.$emit("query");
    },
    // 翻頁
    onChangePage(pageNum) {
      this.$emit(
        "setPager",
        Object.assign(this.pager, { [this.props.pageNum]: pageNum })
      );
      this.$emit("query");
    }
  }
};
</script>
<style lang="scss" scoped>
.pagination-box {
   100%;
  padding-top: 14px;
  position: relative;
  .el-pagination {
    float: right;
  }
  /deep/ .el-pagination__sizes {
    position: absolute;
    top: 14px;
    left: 150px !important;
  }
}
.page-total {
  padding-left: 20px;
  height: 31px;
  line-height: 31px;
  font-size: 14px;
  color: #838383;
}

.page-total span {
  color: #3a3a3a;
}

.closeBtn {
  text-align: center;
  margin-top: 10px;
}

.el-input--small .el-input__inner {
  height: 25px;
  line-height: 25px;
}

.el-input__inner {
  border-color: #838383;
}
.el-pagination .btn-next .el-icon,
.el-pagination .btn-prev .el-icon {
  font-size: 19px;
  position: relative;
  top: -3px;
}
.el-pager li {
  margin: 0 8px;
  border-radius: 3px;
  height: 24px;
  line-height: 24px;
  min- 20px;
}

.el-pager li.active {
  background: #1881bf !important;
}

.el-pagination__jump {
  margin-right: 20px;
  font-size: 14px;
  color: #838383;
}

.el-pagination__jump .pagination__editor {
  margin-right: 20px;
}

.el-pagination__jump .el-pagination__editor.el-input {
   28px;
}
.el-pagination__jump .el-input__inner {
  box-sizing: border-box;
   100%;
  color: #3a3a3a;
  font-size: 14px;
  border-color: #838383 !important;
  height: 24px;
  line-height: 24px;
  border-radius: 3px;
  background: #fff !important;
}

.el-pagination .el-select .el-input .el-input__inner {
  border-radius: 15px !important;
  font-size: 14px;
  border-color: #838383 !important;
  background: #fff !important;
}
.el-button--text > span > span {
  color: #1881bf;
  font-size: 12px;
  text-decoration: underline;
}
</style>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灵奖,隨后出現的幾起案子嚼沿,更是在濱河造成了極大的恐慌,老刑警劉巖瓷患,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骡尽,死亡現場離奇詭異,居然都是意外死亡擅编,警方通過查閱死者的電腦和手機攀细,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱态,“玉大人谭贪,你說我怎么就攤上這事〗醯#” “怎么了俭识?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洞渔。 經常有香客問我套媚,道長,這世上最難降的妖魔是什么磁椒? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任堤瘤,我火速辦了婚禮,結果婚禮上衷快,老公的妹妹穿的比我還像新娘宙橱。我一直安慰自己,他們只是感情好蘸拔,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布师郑。 她就那樣靜靜地躺著,像睡著了一般调窍。 火紅的嫁衣襯著肌膚如雪宝冕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天邓萨,我揣著相機與錄音地梨,去河邊找鬼菊卷。 笑死,一個胖子當著我的面吹牛宝剖,可吹牛的內容都是我干的洁闰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼万细,長吁一口氣:“原來是場噩夢啊……” “哼扑眉!你這毒婦竟也來了?” 一聲冷哼從身側響起赖钞,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腰素,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雪营,有當地人在樹林里發(fā)現了一具尸體弓千,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年献起,在試婚紗的時候發(fā)現自己被綠了洋访。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡征唬,死狀恐怖捌显,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情总寒,我是刑警寧澤扶歪,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站摄闸,受9級特大地震影響善镰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜年枕,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一炫欺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熏兄,春花似錦品洛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硝清,卻和暖如春辅斟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芦拿。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工士飒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留查邢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓酵幕,卻偏偏與公主長得像扰藕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裙盾,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容