el-table 翻页后保留所勾选项

el-table 翻页后保留所勾选项

前言

在本周的开发中,碰到一个表格翻页之后,仍然保留所勾过的选项的功能。在原组件中,并没有这样的功能,所以经过查找分析,就有了下面的一个例子,分析给大家。


lAHPDiQ3QhLt3PbNAtzNA4k_905_732.gif

思路

查找资料后可得

  1. 为了实现保留的功能,所以需要存储勾选内容的数组(selectedItems

  2. 通过el-table中的toggleRowSelection方法,可以设置行的选中状态。

  3. 通过el-table中的selectselect-all获得勾选或者取消的内容

步骤

表格勾选

表格单选

因为翻页之后,点选时selection会出现undefined,所以这里需要进行判断 这里可以通过判断选择selection中有没有row,就可以判断出是增加还是删减

select (selection, row) {
  if (selection && selection.find(item => item && (item.id == row.id))) {
    this.addRows([row])
  } else {
    this.deleteRows([row])
  }
}

表格全选

通过selection数组长度判断是选中还是取消

selectAll (selection) {
  if (selection.length > 0) {
    this.addRows(this.tableData)
  } else {
    this.deleteRows(this.tableData)
  }
},

编辑勾选数组

添加选中

添加时判断selectedItems中是否存在当前row数据,存在则直接return

addRows (rows) {
  rows.forEach(row => {
    if (this.selectedItems.find(item => item.id == row.id)) { return }
    this.selectedItems.push(row)
  });
},

取消选中

selectedItems为空数组时,则直接 return

deleteRows (rows) {
  if (this.selectedItems.length == 0) { return }
  rows.forEach(row => {
    this.selectedItems = this.selectedItems.filter(item => item.id == row.id)
  })
}

设置选中状态

这里使用this.$nextTick是保证表格渲染完成之后,才添加选中效果。 selectedItem是筛选循环当前行row是否在当前表格tableData数据中。

rows.forEach(row => {
 this.$nextTick(() => {
    let selectedItem = this.tableData.find(item => item.id == row.id)
    this.$refs.multipleTable.toggleRowSelection(selectedItem);
  });
})

完整代码

<template>
  <div>
    <el-table ref="multipleTable"
              :data="tableData"
              tooltip-effect="dark"
              :key="randomKey"
              style="width: 100%"
              @select="select"
              @select-all="selectAll">
      <el-table-column type="selection"
                       width="55">
      </el-table-column>
      <el-table-column label="日期"
                       width="120">
        <template slot-scope="scope">{{ scope.row.date }}</template>
      </el-table-column>
      <el-table-column prop="name"
                       label="姓名"
                       width="120">
      </el-table-column>
      <el-table-column prop="id"
                       label="ID"
                       show-overflow-tooltip>
      </el-table-column>
    </el-table>
    <el-pagination layout="prev, pager, next,slot"
                   :current-page="pages.index"
                   @current-change="handleCurrentChange"
                   :total="pages.count"
                   :page-size="pages.size">
    </el-pagination>
  </div>
</template>

<script>
export default {
  data () {
    return {
      items: [
        { date: '2016-05-03', name: '王小虎', id: '0' },
        { date: '2016-05-03', name: '王小虎', id: '1' },
        { date: '2016-05-03', name: '王小虎', id: '2' },
        { date: '2016-05-03', name: '王小虎', id: '3' },
        { date: '2016-05-03', name: '王小虎', id: '4' },
        { date: '2016-05-03', name: '王小虎', id: '5' },
        { date: '2016-05-03', name: '王小虎', id: '6' },
        { date: '2016-05-03', name: '王小虎', id: '7' },
        { date: '2016-05-03', name: '王小虎', id: '8' },
        { date: '2016-05-03', name: '王小虎', id: '9' },
        { date: '2016-05-03', name: '王小虎', id: '10' },
        { date: '2016-05-03', name: '王小虎', id: '11' },
        { date: '2016-05-03', name: '王小虎', id: '12' },
        { date: '2016-05-03', name: '王小虎', id: '13' },
        { date: '2016-05-03', name: '王小虎', id: '14' },
        { date: '2016-05-03', name: '王小虎', id: '15' },
        { date: '2016-05-03', name: '王小虎', id: '16' },
        { date: '2016-05-03', name: '王小虎', id: '17' },
        { date: '2016-05-03', name: '王小虎', id: '18' },
        { date: '2016-05-03', name: '王小虎', id: '19' },
        { date: '2016-05-03', name: '王小虎', id: '20' }
      ],
      tableData: [],
      selectedItems: [],
      pages: { size: 10, index: 1, count: 50 },
      randomKey: Math.random(),
    }
  },
  mounted () {
    this.pages.count = this.items.length || 0
    this.setTabelData()
  },
  methods: {
    //设置页面数据
    setTabelData () {
      let { index, size } = this.pages
      this.tableData = this.items.slice((index - 1) * size, (index - 1) * size + size)
      //randomKey是table数据改动时,刷新table的
      this.randomKey = Math.random()
      this.selectedPreExisting(this.selectedItems)
    },
    //监听翻页
    handleCurrentChange (index) {
      this.pages.index = index
      this.setTabelData()
    },
    //选中table已有数据
    selectedPreExisting (rows) {
      if (rows.length > 0) {
        //这里使用this.$nextTick是防止表格未渲染完成就执行,导致无法添加选中效果
        this.$nextTick(() => {
          rows.forEach(row => {
            //判断row是存在当前tableData
            let selectedItem = this.tableData.find(item => item.id == row.id)
            this.$refs.multipleTable.toggleRowSelection(selectedItem);
          });
        })
      } else {
        this.$refs.multipleTable.clearSelection();
      }
    },
    //表格单选
    select (selection, row) {
      //因为翻页之后,点选时selection会出现undefined,所以这里需要进行判断
      //这里可以通过判断选择selection中有没有row,就可以判断出是增加还是删减
      if (selection && selection.find(item => item && (item.id == row.id))) {
        this.addRows([row])
      } else {
        this.deleteRows([row])
      }
    },
    //表格全选
    selectAll (selection) {
      //判断是选中还是取消
      if (selection.length > 0) {
        this.addRows(this.tableData)
      } else {
        this.deleteRows(this.tableData)
      }
    },
    //添加选中
    addRows (rows) {
      rows.forEach(row => {
        //过滤,当selectedItems有此条数据时,则直接返回,不执行添加
        if (this.selectedItems.find(item => item.id == row.id)) { return }
        this.selectedItems.push(row)
      });
    },
    //取消选中
    deleteRows (rows) {
      //当selectedItems为空数组时,不执行删除
      if (this.selectedItems.length == 0) { return }
      rows.forEach(row => {
        this.selectedItems = this.selectedItems.filter(item => item.id == row.id)
      })
    }
  }
}
</script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容