【Vue Element-ui el-table组件 实现跨分页全选 可全选中当前页 也可选中全量数据】

这篇具有很好参考价值的文章主要介绍了【Vue Element-ui el-table组件 实现跨分页全选 可全选中当前页 也可选中全量数据】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思路一 Vue Element-ui el-table组件 实现跨分页全选 可全选中当前页 也可选中全量数据

前端模拟数据示例,无需后台接口,复制粘贴即可看到效果。

<template>
  <div>
    <div class="common-wrapper">
      <!--列表-->
      <el-table :data="lists" ref="table" highlight-current-row v-loading="listLoading" style="width: 100%;"
        :row-key="getRowKeys" type="selection" @selection-change="handleSelectionChange">
        <el-table-column type="selection" :reserve-selection="true" :selectable="checkSelectable"></el-table-column>
        <el-table-column prop="id" label="id"> </el-table-column>
        <el-table-column prop="time" label="time"> </el-table-column>
      </el-table>
      <!--工具条-->
      <el-col :span="24" class="toolbar">
        &ensp;&nbsp;
        <el-checkbox v-model="allCheck" @change="allCheckEvent">全选所有</el-checkbox>&emsp;
        <el-pagination :current-page="this.page" layout="total , prev, pager, next"
          @current-change="handleCurrentChange" :page-size="10" :total="total" style="float:right;">
        </el-pagination>
      </el-col>
      <div class="clearfix"></div>
    </div>
  </div>
</template>
 
<script> 
import axios from 'axios';
export default {
  data () {
    return {
      lists: [
        { id: '1', time: '2019-09-09 12:12:12' },
        { id: '2', time: '2019-09-09 12:12:12' },
        { id: '3', time: '2019-09-09 12:12:12' },
        { id: '4', time: '2019-09-09 12:12:12' },
        { id: '5', time: '2019-09-09 12:12:12' },
        { id: '6', time: '2019-09-09 12:12:12' },
        { id: '7', time: '2019-09-09 12:12:12' },
        { id: '8', time: '2019-09-09 12:12:12' },
        { id: '9', time: '2019-09-09 12:12:12' },
        { id: '10', time: '2019-09-09 12:12:12' },
      ],
      total: 13,
      page: 1,
      listLoading: false,
      multipleSelectionAll: [],//所有选中的数据包含跨分页数据
      allCheck: false,
      getRowKeys (row) {
        return row.id;
      },
    };
  },
  methods: {
    // 分页全选-选中框改变事件
    handleSelectionChange (val) {
      // 数据去重
      this.multipleSelectionAll = this.reduceSame(val);
      // 选中所有选择框时勾选全选按钮
      if (this.multipleSelectionAll.length == this.total) {
        this.allCheck = true;
      }
      // 将row是对象数组数据转换为字符串
      this.multipleSelectionAll = this.multipleSelectionAll.map(function (val) {
        return val.id;
      }).toString();
      // 选中后的数据
      console.log(this.multipleSelectionAll)
    },
    // 分页全选-全选按钮change事件
    allCheckEvent () {
      let _this = this;
      if (_this.allCheck) {
        // 全选选中时当前页所有数据选中
        _this.lists.forEach(row => {
          if (row) {
            _this.$refs.table.toggleRowSelection(row, true);
          }
        });
      } else {
        _this.$refs.table.clearSelection();
      }
    },
    // 分页全选-全选时禁用选择框
    checkSelectable (row, index) {
      return !this.allCheck;
    },
    // 数组对象去重
    reduceSame: function (arr) {
      let obj = {};
      return arr.reduce(function (prev, item) {
        obj[item.id] ? "" : (obj[item.id] = 1 && prev.push(item))
        return prev
          ;
      }, []);
    },
    // 分页
    handleCurrentChange (val) {
      this.page = val;
      if (val == 1) {
        this.lists = [
          { id: '1', time: '2019-09-09 12:12:12' },
          { id: '2', time: '2019-09-09 12:12:12' },
          { id: '3', time: '2019-09-09 12:12:12' },
          { id: '4', time: '2019-09-09 12:12:12' },
          { id: '5', time: '2019-09-09 12:12:12' },
          { id: '6', time: '2019-09-09 12:12:12' },
          { id: '7', time: '2019-09-09 12:12:12' },
          { id: '8', time: '2019-09-09 12:12:12' },
          { id: '9', time: '2019-09-09 12:12:12' },
          { id: '10', time: '2019-09-09 12:12:12' },
        ]
      } else {
        this.lists = [
          { id: '11', time: '2019-09-09 12:12:12' },
          { id: '12', time: '2019-09-09 12:12:12' },
          { id: '13', time: '2019-09-09 12:12:12' },
        ]
      }
    },
  },
  mounted () {
 
  },
  watch: {
    // 分页全选-监听数据变化
    lists: {
      handler (value) {
        if (this.allCheck) {
          this.lists.forEach(row => {
            if (row) {
              this.$refs.table.toggleRowSelection(row, true)
            }
          });
        }
      },
      deep: true
    },
  }
}
 
</script>
 <template>
  <div>
    <div class="common-wrapper">
      <!--列表-->
      <el-table :data="lists" ref="table" highlight-current-row v-loading="listLoading" style="width: 100%;"
        :row-key="getRowKeys" type="selection" @selection-change="handleSelectionChange">
        <el-table-column type="selection" :reserve-selection="true" :selectable="checkSelectable"></el-table-column>
        <el-table-column prop="id" label="id"> </el-table-column>
        <el-table-column prop="time" label="time"> </el-table-column>
      </el-table>
      <!--工具条-->
      <el-col :span="24" class="toolbar">
        &ensp;&nbsp;
        <el-checkbox v-model="allCheck" @change="allCheckEvent">全选所有</el-checkbox>&emsp;
        <el-pagination :current-page="this.page" layout="total , prev, pager, next"
          @current-change="handleCurrentChange" :page-size="10" :total="total" style="float:right;">
        </el-pagination>
      </el-col>
      <div class="clearfix"></div>
    </div>
  </div>
</template>
 
<script> 
import axios from 'axios';
export default {
  data () {
    return {
      lists: [
        { id: '1', time: '2019-09-09 12:12:12' },
        { id: '2', time: '2019-09-09 12:12:12' },
        { id: '3', time: '2019-09-09 12:12:12' },
        { id: '4', time: '2019-09-09 12:12:12' },
        { id: '5', time: '2019-09-09 12:12:12' },
        { id: '6', time: '2019-09-09 12:12:12' },
        { id: '7', time: '2019-09-09 12:12:12' },
        { id: '8', time: '2019-09-09 12:12:12' },
        { id: '9', time: '2019-09-09 12:12:12' },
        { id: '10', time: '2019-09-09 12:12:12' },
      ],
      total: 13,
      page: 1,
      listLoading: false,
      multipleSelectionAll: [],//所有选中的数据包含跨分页数据
      allCheck: false,
      getRowKeys (row) {
        return row.id;
      },
    };
  },
  methods: {
    // 分页全选-选中框改变事件
    handleSelectionChange (val) {
      // 数据去重
      this.multipleSelectionAll = this.reduceSame(val);
      // 选中所有选择框时勾选全选按钮
      if (this.multipleSelectionAll.length == this.total) {
        this.allCheck = true;
      }
      // 将row是对象数组数据转换为字符串
      this.multipleSelectionAll = this.multipleSelectionAll.map(function (val) {
        return val.id;
      }).toString();
      // 选中后的数据
      console.log(this.multipleSelectionAll)
    },
    // 分页全选-全选按钮change事件
    allCheckEvent () {
      let _this = this;
      if (_this.allCheck) {
        // 全选选中时当前页所有数据选中
        _this.lists.forEach(row => {
          if (row) {
            _this.$refs.table.toggleRowSelection(row, true);
          }
        });
      } else {
        _this.$refs.table.clearSelection();
      }
    },
    // 分页全选-全选时禁用选择框
    checkSelectable (row, index) {
      return !this.allCheck;
    },
    // 数组对象去重
    reduceSame: function (arr) {
      let obj = {};
      return arr.reduce(function (prev, item) {
        obj[item.id] ? "" : (obj[item.id] = 1 && prev.push(item))
        return prev
          ;
      }, []);
    },
    // 分页
    handleCurrentChange (val) {
      this.page = val;
      if (val == 1) {
        this.lists = [
          { id: '1', time: '2019-09-09 12:12:12' },
          { id: '2', time: '2019-09-09 12:12:12' },
          { id: '3', time: '2019-09-09 12:12:12' },
          { id: '4', time: '2019-09-09 12:12:12' },
          { id: '5', time: '2019-09-09 12:12:12' },
          { id: '6', time: '2019-09-09 12:12:12' },
          { id: '7', time: '2019-09-09 12:12:12' },
          { id: '8', time: '2019-09-09 12:12:12' },
          { id: '9', time: '2019-09-09 12:12:12' },
          { id: '10', time: '2019-09-09 12:12:12' },
        ]
      } else {
        this.lists = [
          { id: '11', time: '2019-09-09 12:12:12' },
          { id: '12', time: '2019-09-09 12:12:12' },
          { id: '13', time: '2019-09-09 12:12:12' },
        ]
      }
    },
  },
  mounted () {
 
  },
  watch: {
    // 分页全选-监听数据变化
    lists: {
      handler (value) {
        if (this.allCheck) {
          this.lists.forEach(row => {
            if (row) {
              this.$refs.table.toggleRowSelection(row, true)
            }
          });
        }
      },
      deep: true
    },
  }
}
 
</script>
 

思路二 element-ui table跨页全选

element-ui table里的全选功能只会全选当前页的所有数据
当table有分页功能的时候实现跨页全选

①为table添加select方法(当用户手动勾选数据行的 Checkbox 时触发的事件)

两个参数 selection,row 选中的数据 最后一个选中的数据

定义一个变量用来保存选中的数据 将selection赋值给变量

checkAdmittance(selection, row) {

this.selectedList = selection;

},

②为table添加select-all方法(当用户手动勾选全选 Checkbox 时触发的事件)
this.allCheck为true时



     if (!this.allCheck) {
                   // 全选选中时当前页所有数据选中,使用后台所有数据进行遍历.
      // 把所有数据赋值给当前选中变量,遍历所有数据
                   this.selectedList = this.pointData;
                   this.pointData.forEach((row) => {
                          if (row) {
           //为table添加ref属性 table
                               this.$refs.table.toggleRowSelection(row, true);this.selectedList = [];
                          }
                   });
      this.allCheck = true;
     }else{ 
        this.$refs.table.clearSelection();
                             this.allCheck = false;
        this.selectedList = [];
		}

思路三 Element分页跨页全选操作(跨页记住已经勾选)

1.HTLM 添加按钮全选,要有一个全选标识状态

<el-button
        type="success"
              @click="selectAll"
            >
              {{ sign === 1 ? '全 选' : '取 消 全 选' }}
    </el-button>

    Table
     <el-table
              v-loading="loading"
              ref="accessControlTable"
              :data="tableData"
              :max-height="tableHeight"
              :span-method="arraySpanMethod"
              header-cell-class-name="custom-table"
              @selection-change="handleSelectionChange"
              @select="selectExceptCardIds"
              @select-all="selecetAll"
            >
              <el-table-column
                type="selection"
                width="30"
              />
              <el-table-column
                prop="id"
                type="index"
                align="center"
                width="50"
                label="序号"/>
            ...
        </el-table>

2.JS相关代码如下:

// 数据
  data() {
    return {
            tableData: [],
            sign: 1, // 是否点击全选,1未点击全选,2,点击全选
            checkedArr: [], // 勾选的行数组
            uncheckedArr: [], // 取消勾选的行数组
    }

相关操作方法如下:

// 选中事件
    handleSelectionChange(val) {
      console.log('多选id===handleSelectionChange', val)
    },
// 合并表格最后三列
    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 6) {
        return [0, 0]
      } else if (columnIndex === 5) {
        return [1, 2]
      }
    },
// 全选切换
    selectAll() {
      this.sign = this.sign === 1 ? 2 : 1
      console.log('sign', this.sign)
      this.chooseAllPages()
      this.checkedArr = []
      this.uncheckedArr = []
    },
    // 全选所有页面
    chooseAllPages() {
      if (this.sign === 2) {
        // 全选
        this.$nextTick(() => {
          this.tableData.forEach(row => {
            // 没有取消过的勾选
            if (this.uncheckedArr.map(v => v.id).indexOf(row.id) < 0) {
              this.$refs.accessControlTable.toggleRowSelection(row, true)
            }
          })
        })
      } else {
        // 取消全选
        this.$nextTick(() => {
          this.$refs.accessControlTable.clearSelection()
        })
      }
    },
// 切换分页时选择之前选中
    checkedSelected() {
      console.log('切换分页时选择之前选中')
      this.$nextTick(() => {
        if (this.checkedArr.length === 0) return
        this.tableData.forEach(row => {
          if (this.checkedArr.map(v => v.id).indexOf(row.id) >= 0) {
            this.$refs.accessControlTable.toggleRowSelection(row, true)
          }
        })
      })
    },
// 全选后取消单个选择事件,当用户手动勾选数据行的 Checkbox 时触发的事件
    selectExceptCardIds(selection, row) {
      // selection 当前页面所有选中的项
      // row 当前点击操作的项
      console.log('全选后取消单个选择事件,当用户手动勾选数据行的 Checkbox 时触发的事件', selection, row)
      // 所有页面不全选
      if (this.sign === 1) {
        if (selection.indexOf(row) >= 0) {
          // 新增(勾选上)
          selection.map(el => {
            if (this.checkedArr.map(v => v.id).indexOf(el.id) === -1) {
              this.checkedArr.push(el)
            }
          })
          console.log('所有选中的', this.checkedArr)
        } else {
          // 取消勾选
          this.checkedArr.map((el2, index) => {
            if (el2.id === row.id) {
              this.checkedArr.splice(index, 1)
            }
          })
          console.log('删除后选中的', this.checkedArr)
        }
      } else {
        // 所有页面全选
        if (selection.indexOf(row) >= 0) {
          // 重新勾选上
          this.uncheckedArr.map((el, index) => {
            if (el.id === row.id) {
              this.uncheckedArr.splice(index, 1)
            }
          })
        } else {
          // 取消勾选
          this.uncheckedArr.push(row)
        }
        console.log('剔除的id集合', this.uncheckedArr)
      }
    },
// 当前页面全选
    selecetAll(selection) {
      console.log('当前页面全选', selection)
      if (this.sign === 1) {
        // 不是全选按钮状态下-考虑选中哪些
        if (selection.length > 0) {
          // 选中
          selection.map(row => {
            if (this.checkedArr.map(v => v.id).indexOf(row.id) < 0) {
              this.checkedArr.push(row)
            }
          })
        } else {
          // 取消选中
          this.tableData.map(row => {
            this.checkedArr.map((el2, index) => {
              if (el2.id === row.id) {
                this.checkedArr.splice(index, 1)
              }
            })
          })
        }
        console.log('不是全选按钮状态下-考虑选中哪些', this.checkedArr)
      } else {
        // 全选按钮状态下-考虑不选中哪里
        if (selection.length === 0) {
          this.tableData.map(row => {
            this.uncheckedArr.push(row)
          })
        } else {
          selection.map(row => {
            this.uncheckedArr.map((el, index) => {
              if (el.id === row.id) {
                this.uncheckedArr.splice(index, 1)
              }
            })
          })
        }
        console.log('全选按钮状态下-考虑不选中哪里', this.uncheckedArr)
      }
    },

备注:其中id是每条记录的唯一标识,当全选按钮点击后,按钮变成取消全选,切换标识sign的值,接口传参带入全选标识和剔除行id数组uncheckedArr,若是默认状态非全选,则带入非全选标识和选中行id数组checkedArr。

作者:欧_991e 链接:https://www.jianshu.com/p/8415a0c416ed 来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章来源地址https://www.toymoban.com/news/detail-782544.html

到了这里,关于【Vue Element-ui el-table组件 实现跨分页全选 可全选中当前页 也可选中全量数据】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue中数据滚动显示 实现Element-UI中el-table内数据的懒加载

    工作中我们经常会用到element-ui组件库中的le-table组件来展示数据,但当table的数据源数量过大的时候统一展示可能会出现页面卡顿,且会影响用户体验,为此我们可以尝试对el-table中的数据做懒加载的效果展示: 1. 挂在阶段监听el-table的scroll滚动事件 2. 当table表格滚动条的位置

    2023年04月08日
    浏览(45)
  • Vue 中 Element UI 的 el-table 组件实现动态表头和内容

    在 Vue 中使用 Element UI 的 el-table 组件时,为了实现动态表头(包括第一层表头及其下的嵌套表头或子表头)。需要后端返回的数据结构能够体现表头层级关系以及对应的数据结构相匹配。这样的数据通常是一个嵌套数组,每个表头单元可能包含自身的列信息以及它的子表头和

    2024年01月20日
    浏览(44)
  • vue使用element-ui,el-table不显示

    例如:新增了一个表格,按官网代码贴过来的,结果一直不显示 代码如下一模一样,其他数据正常显示,就表格不显示 其实版本库不一致导致的,贼坑,又不提示 先卸载element-ui安装一个低版本的element-ui就可以解决``

    2024年02月11日
    浏览(47)
  • vue element-ui表格(el-table)数据导出execl文件

    功能实现:element UI 的el-table数据导出为execl文件 使用到插件:xlsx、file-saver exportExecl.js 代码如下: 页面代码如下:

    2024年02月14日
    浏览(42)
  • element-ui el-table 如何实现合并单元格

    el-table的组件的可以合并单元格,先定义参数span-method 方法objectSpanMethod。在方法内控制当前单元格渲染成几个单元格或者删除掉当前单元格。 比如:代码中定义:span-method=\\\"objectSpanMethod\\\" objectSpanMethod实现是在方法区,具体内容是根据变量rowSpanList 去决定当前单元格是展示还是删

    2024年02月03日
    浏览(33)
  • 解决vue-electron element-UI中el-table表格不显示

    问题:element-UI官网上el-table组件,引入自己项目的时候表格不显示。 解决方案: 修改.electron-vuewebpack.renderer.config.js 将 修改为 即可解决。

    2024年02月16日
    浏览(38)
  • Element-ui中表格el-table图片预览效果实现(非常实用)

    🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅  文末获取源码联系 🏆先展示效果:   🏆使用的是下面这个插

    2024年02月11日
    浏览(43)
  • element-ui中的el-table实现分页多选功能

    selection-change事件:当选择项发生变化时会触发该事件(当分页切换时,选中的数据都会自动清空) 链接: https://blog.csdn.net/qq_36157085/article/details/122922678

    2024年02月17日
    浏览(34)
  • Vue+Element-UI 中 el-table 动态合并单元格 :span-method 方法

    记录一下工作时遇到的 el-table 合并单元格的需求,超详细😊 el-table官方提供了合并单元格的方法与返回格式 如下: 根据叙述有了如下思路: 因为后端返回的数据非统一, 可能不是按照类别排好的😨, 所以官网的例子满足不了所有的需求所以我们通过遍历table的数据比较前后两

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包