element ui 中使用table組件實(shí)現(xiàn)分頁記憶選中,全部選中數(shù)據(jù)獲取

實(shí)現(xiàn)效果:

image.png

只需要給el-table添加row-key el-table-column添加:reserve-selection="true"
代碼如下:

  <el-table :data="tableList" border class="table" ref="recordTable" header-cell-class-name="table-header"
                :row-key="getRowKey"  @selection-change="handleSelectionChange"
                >
        <el-table-column
          type="selection"
          width="55"
          :reserve-selection="true"
          align="center"
        >
        </el-table-column>
</el-table>

表格上方需單獨(dú)加全選按鈕,可參考下面代碼。

      <el-checkbox
        :indeterminate="indeterminate"
        @change="handleCheck"
        label="所有商品"
        v-model="allCheck">
      </el-checkbox>
      <el-table :data="tableList" border  ref="recordTable" 
                :row-key="getRowKey" @select="handleSelectRow" @selection-change="handleSelectionChange"
                @select-all="handleSelectAll">
        <el-table-column
          type="selection"
          width="55"
          :reserve-selection="true"
          align="center"
        >
        </el-table-column>
      </el-table>

js

data(){
   return:{
      multipleSelectionAll: [],//所有選中的數(shù)據(jù)包含跨頁數(shù)據(jù)
      allCheck: false,
      indeterminate: false,
      tableList: [],//列表數(shù)據(jù)-請求得到或自定義
      total: 0,//得到的列表總數(shù)
      checkedList: [],//選中列表
      uncheckedList: [],//未選中列表
  }
},
 watch: {
      //監(jiān)聽列表,如果為所有全選,翻頁時保持狀態(tài)
      tableList: {
        handler(value) {
          if (this.allCheck) {
            if (this.uncheckedList.length === 0) {
              this.$nextTick(() => {//這里一定要用$nextTick
                value.forEach(row => {
                  this.$refs.recordTable.toggleRowSelection(row, true)
                })
              })
            } else {
              this.$nextTick(() => {
                value.forEach(row => {
                  for (let i = 0; i < this.uncheckedList.length; i++) {
                    if (row.id === this.uncheckedList[i].id) {
                      this.$refs.recordTable.toggleRowSelection(row, false)
                      break
                    } else {
                      this.$refs.recordTable.toggleRowSelection(row, true)
                    }
                  }
                })
              })
            }
          }
        },
        deep: true
      },
      //監(jiān)聽未選中的數(shù)組
      uncheckedList: {
        handler(value) {
          //1.未選中數(shù)組長度和總數(shù)相等,取消選中狀態(tài),取消樣式
          if (value.length === this.total) {
            this.allCheck = false
            this.indeterminate = false
          }
          //2.未選中數(shù)組長度為0,取消樣式
          if (value.length === 0) {
            this.indeterminate = false
          }
        },
        deep: true
      },
      //監(jiān)聽選中數(shù)組
      checkedList: {
        handler(value) {
          //選中數(shù)組長度等于總數(shù),代表全部選中,取消樣式
          if (value.length === this.total) {
            this.allCheck = true
            this.indeterminate = false
          }
        }
      }
    },
  methods: {
        getRowKey(row) {
        return row.id;
      },
      handleSelectRow(rows, row) { //單行選擇
        if (this.allCheck) {
          // 多選框樣式改變,allCheck依然為true,為了保持翻頁狀態(tài)
          this.indeterminate = true
          // 判斷勾選數(shù)據(jù)行是選中還是取消
          let selected = rows.length && rows.indexOf(row) !== -1
          let lenFalse = this.uncheckedList.length
          if (selected) {
            // 選中,從未選中數(shù)組中去掉
            if (lenFalse !== 0) {//
              for (let i = 0; i < lenFalse; i++) {
                if (this.uncheckedList[i].id === row.id) {
                  this.uncheckedList.splice(i, 1)
                  break
                }
              }
            }
          } else {
            // 取消,當(dāng)前取消的行push進(jìn)去
            this.uncheckedList.push(row)
          }
        } else {
          this.checkedList = rows
        }
      },
      handleSelectAll(rows) {
        if (this.allCheck) {
          this.indeterminate = true
          let lenNow = this.tableList.length
          // 判斷全選本頁,是選中還是取消
          console.log(this.tableList[0]);
          if (rows.indexOf(this.tableList[0]) !== -1) {
            //如果選中所有rows存在于tableList,或者判斷rows長度不為0  證明是選中狀態(tài)
            //uncheckedList要刪除當(dāng)前頁tableList
            for (let i = 0; i < lenNow; i++) {
              for (let n = 0; n < this.uncheckedList.length; n++) {
                if (this.uncheckedList[n].id === this.tableList[i].id) {
                  this.uncheckedList.splice(n, 1)
                }
              }
            }
          } else {
            // 取消 如果rows為空,當(dāng)頁是取消狀態(tài)
            for (let j = 0; j < lenNow; j++) {
              if (this.uncheckedList.length !== 0) {//如果uncheckedList已經(jīng)有值
                if (this.uncheckedList.indexOf(this.tableList[j]) === -1) {
                  //就把uncheckedList中沒有的當(dāng)前頁tableList,push進(jìn)去
                  this.uncheckedList.push(this.tableList[j])
                }
              } else {//如果為空,直接全部push
                this.uncheckedList.push(this.tableList[j])
              }
            }
          }
        } else {
          this.checkedList = rows
        }
      },
      handleCheck() {
        if (this.indeterminate) {//當(dāng)不為全選樣式時,點(diǎn)擊變?yōu)槿x
          this.allCheck = true
        }
        //只要點(diǎn)擊了全選所有,這兩個數(shù)組清空
        this.uncheckedList = []
        this.checkedList = []
        if (this.allCheck) {//全選所有,列表全部選中,包括翻頁
          this.tableList.forEach(row => {
            this.$refs.recordTable.toggleRowSelection(row, true)
          })
        } else {//取消列表全選狀態(tài),包括翻頁
          this.$refs.recordTable.clearSelection()
        }
      },
  //選中數(shù)據(jù)
      handleSelectionChange(val) {
//選中的數(shù)據(jù)獲取地方
        this.multipleSelectionAll = val;
      },
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝎宇,一起剝皮案震驚了整個濱河市凝危,隨后出現(xiàn)的幾起案子侥衬,更是在濱河造成了極大的恐慌势篡,老刑警劉巖饶辙,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乾戏,死亡現(xiàn)場離奇詭異迂苛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鼓择,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門三幻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呐能,你說我怎么就攤上這事念搬。” “怎么了摆出?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵朗徊,是天一觀的道長。 經(jīng)常有香客問我偎漫,道長爷恳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任骑丸,我火速辦了婚禮舌仍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘通危。我一直安慰自己铸豁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布菊碟。 她就那樣靜靜地躺著节芥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逆害。 梳的紋絲不亂的頭發(fā)上头镊,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音魄幕,去河邊找鬼相艇。 笑死,一個胖子當(dāng)著我的面吹牛纯陨,可吹牛的內(nèi)容都是我干的坛芽。 我是一名探鬼主播留储,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咙轩!你這毒婦竟也來了获讳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤活喊,失蹤者是張志新(化名)和其女友劉穎丐膝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钾菊,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帅矗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了煞烫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损晤。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖红竭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喘落,我是刑警寧澤茵宪,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站瘦棋,受9級特大地震影響稀火,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赌朋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一凰狞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沛慢,春花似錦赡若、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躺苦,卻和暖如春身腻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匹厘。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工嘀趟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愈诚。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓她按,卻偏偏與公主長得像牛隅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尤溜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容