vue+iview Table表格多选切换分页保持勾选状态

本文实例为大家分享了vue+iview Table表格多选切换分页保持勾选状态的具体代码,供大家参考,具体内容如下

第一种情况(配合后端做选中数据处理)

定义三个参数,是否为全选(isSelectAll)、不是全选时选择的数据(selectObject: [])、反选数据(unSelectObject:[])

HTML

<Alert show-icon v-show="openTip">
                          已选择
              <span class="select-count" v-if="isSelectAll">{{ total-unSelectObject.length }}</span> 项
              <span class="select-count" v-if="!isSelectAll">{{ selectObject.length }}</span> 项
              <a class="select-clear" @click="clearSelectAll">清空</a>
              <span class="button">
                <Button @click="onSelectAll" type="primary">全选</Button>
              </span>
              <span class="button">
                <Button @click="selectAllcancel" type="primary">取消全选</Button>
              </span>
            </Alert>
            <Table
              :loading="loading"
              border
              :columns="columns"
              :data="data"
              @on-select-all="selectAll"
              @on-select-all-cancel="cancelAll"
              @on-select="TableSelectRow"
              @on-select-cancel="TableSelectCancelRow"
            >
            </Table>
            <Row type="flex" justify="end" class="page">
              <Page
                :current="searchForm.pageIndex"
                :total="total"
                :page-size="searchForm.pageSize"
                @on-change="changePage"
                @on-page-size-change="changePageSize"
                :page-size-opts="[10, 20, 50]"
                size="small"
                show-total
                show-elevator
                show-sizer
      ></Page>
</Row>

data

data: [],
isSelectAll: false,
condition: '',
selectObject: [],
unSelectObject: [],
selectEquipsIds: '0',

JS

// 全选
onSelectAll() {
this.isSelectAll = true
this.getDataList()
    },
    //取消全选
    selectAllcancel() {
      this.isSelectAll = false
      this.selectEquipsIds = '0'
      this.getDataList()
    },
    //全选当前页
    selectAll() {
      if (this.isSelectAll) {
        for (let i = this.data.length - 1; i >= 0; i--) {
          var _index = this.unSelectObject.indexOf(this.data[i].id)
          if (_index != -1) {
            this.unSelectObject.splice(_index, 1)
          }
        }
        console.log(this.unSelectObject)
      } else {
        for (let i = this.data.length - 1; i >= 0; i--) {
          this.selectObject.push(this.data[i].id)
        }
        console.log(this.selectObject)
      }
    },
    // 取消当前页
    cancelAll() {
      if (this.isSelectAll) {
        for (let i = this.data.length - 1; i >= 0; i--) {
          this.unSelectObject.push(this.data[i].id)
        }
         console.log(this.unSelectObject)
      } else {
        for (let i = this.data.length - 1; i >= 0; i--) {
          var _index = this.selectObject.indexOf(this.data[i].id)
          if (_index != -1) {
            this.selectObject.splice(_index, 1)
          }
        }
        console.log(this.selectObject)
      }
    },
    // 选中一行
    TableSelectRow(selection, row) {
      if (this.isSelectAll) {
        var _index = this.unSelectObject.indexOf(row.id)
        if (_index != -1) {
          this.unSelectObject.splice(_index, 1)
          console.log(this.unSelectObject)
        }
      } else {
        if (!this.selectObject.includes(row.id)) {
          this.selectObject.push(row.id)
          console.log(this.selectObject)
        }
      }
    },
    // 取消选中一行
    TableSelectCancelRow(selection, row) {
      if (this.isSelectAll) {
        this.unSelectObject.push(row.id)
      } else {
        var _index = this.selectObject.indexOf(row.id)
        if (_index != -1) {
          this.selectObject.splice(_index, 1)
          console.log(this.selectObject)
        }
      }
    },
    // 判断是否选中
    sortData() {
      if (this.isSelectAll) {
        for (let i = this.data.length - 1; i >= 0; i--) {
          if (!this.unSelectObject.includes(this.data[i].id)) {
            this.data[i]._checked = true
          }
        }
      } else {
        if (this.selectObject.length) {
          this.data.forEach((ele) => {
            if (this.selectObject.includes(ele.id)) ele._checked = true
          })
        }
      }
    },
    getDataList() {
      // 多条件搜索用户列表
      this.loading = true
      api().then((res) => {
        this.loading = false
        if (res.success) {
          this.data = res.result?.records
          this.sortData()  //分页时保留选中状态
          if (this.data.length == 0 && this.searchForm.pageIndex > 1) {
            this.searchForm.pageIndex -= 1
            this.getDataList()
          }
        }
      })
},

实现效果

全选效果

单独选择效果

整页全选选择效果

整页全选+单选

第二种情况(只给后端传需要传的数据)

定义一个参数,已选数据(selectObject:[])

HTML

<div class="table-div"> 
            <Table :columns="columns" 
                :data="tableList" 
                @on-select-all="selectAll" 
                @on-select-all-cancel="cancelAll" 
                @on-select="TableSelectRow" 
                @on-select-cancel="TableSelectCancelRow" />
        </div>
        <Row type="flex" justify="end" class="page">
              <Page
                :current="searchForm.pageIndex"
                :total="total"
                :page-size="searchForm.pageSize"
                @on-change="changePage"
                @on-page-size-change="changePageSize"
                :page-size-opts="[10, 20, 50]"
                size="small"
                show-total
                show-elevator
                show-sizer
      ></Page>
</Row>

data

data: [],
selectObject: [],

JS

//判断是否选中 
sortData() {
        if (this.selectEquipsIds.length) {
                    this.tableList.forEach(ele => {
                        if (this.selectEquipsIds.includes(ele.id)) ele._checked = true;
                    })
                }
            },
            // 选中一行
            TableSelectRow(selection, row) {
                if (!this.selectEquipsIds.includes(row.id)) {
                    this.selectEquipsIds.push(row.id);
                     
                }
            },
            // 取消选中一行
            TableSelectCancelRow(selection, row) {
                var _index = this.selectEquipsIds.indexOf(row.id);
                if (_index != -1) {
                    this.selectEquipsIds.splice(_index, 1);
                     
                }
            },
            // 选中所有
            selectAll() {
                for (let i = this.tableList.length - 1; i >= 0; i--) {
                    this.TableSelectRow(null, this.tableList[i]);
                }
            },
            // 取消选中所有
            cancelAll() {
                for (let i = this.tableList.length - 1; i >= 0; i--) {
                    this.TableSelectCancelRow(null, this.tableList[i]);
                }
            },
            // 翻页查询
            onChange(param) {
                this.page.PageIndex = param;
                this.getDataList();
            },
            // 选择分页数
            onPageSizeChange(param) {
                this.page.PageSize = param;
                this.getDataList();
            },
            // 查询表格数据 
            getDataList() {
              // 多条件搜索用户列表
              this.loading = true
              api().then((res) => {
                this.loading = false
                if (res.success) {
                  this.data = res.result?.records
                  this.sortData()
                  // this.total = res.result.total
                  if (this.data.length == 0 && this.searchForm.pageIndex > 1) {
                    this.searchForm.pageIndex -= 1
                    this.getDataList()
                  }
                }
              })
            },
},

以上均已实测可用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue iview实现分页功能

    本文实例为大家分享了vue iview实现分页功能的具体代码,供大家参考,具体内容如下 子组件 <template>   <div style="margin-top: 30px;">     <Page       :total="paginations.total"       show-elevator       show-sizer       :page-size="paginations.pageSize&quo

  • vue iview组件表格 render函数的使用方法详解

    如果要在标签中加入属性,例如img 中src属性   a标签中href属性  此时需要用到 attrs 来加入而不是props { title: '操作', key: 'action', align: 'center', render: function (h, params) { return h('div', [ h('Button', { props: { type: 'primary', size: 'small' }, style: { marginRight: '8px' }, on

  • vue+iview动态渲染表格详解

    本文实例为大家分享了vue+iview 动态渲染表格(iview插件table),供大家参考,具体内容如下 效果图 (表格头部和表格主体都是动态渲染) 重要代码 <template> <Table ref="selection" v-for="(item) in entities" :columns="item.columns" :data="item.data" :border="false&qu

  • vue+iview实现分页及查询功能

    vue+iview 分页及删.查功能实现 首先要想实现分页功能必须得知道 当前页码.每页大小.总数目. iview对分页的功能支持还是很强大的,有很多钩子函数 具体实现看后端返回的数据 <template> <div v-if="this.$store.state.user.userType == 0 || this.$store.state.user.userType == 1"> <Input type="text" search

  • vue+iview 实现可编辑表格的示例代码

    先简单说明一下,这个Demo引入的vue,iview的方式是标签引入的,没有用到webpack之类的构建工具... 毕竟公司还在用angularjs+jq. 这也是我第一次写文章,大家看看思路就行了,要是有大佬指点指点就更好了 话不多说,先来个效果图 我们再看下极为简单的目录结构 IViewEditTable ## vue+iview 实现的可编辑表格 └── index.html ## 首页 └── js └── editTable.js ## 首页JS └── ivew ## iview相关

  • vue+iview分页组件的封装

    vue+iview的分页组件封装 1.在components中创建pagination文件夹,接着创建src,index.js,index.less文件 2.index.less文件 //需要修改的样式 .ivu-page-options { margin-left: 10px; .ivu-page-options-sizer { margin-right: 0; } } 3.index.js文件 import "./index.less"; import component from

  • vue+iview Table表格多选切换分页保持勾选状态

    本文实例为大家分享了vue+iview Table表格多选切换分页保持勾选状态的具体代码,供大家参考,具体内容如下 第一种情况(配合后端做选中数据处理) 定义三个参数,是否为全选(isSelectAll).不是全选时选择的数据(selectObject: []).反选数据(unSelectObject:[]) HTML <Alert show-icon v-show="openTip">                           已选择              

  • layui表格分页 记录勾选的实例

    layui 分页之后没有记录之前勾选项的功能 , 自己写了一个 , 主要点就是表格的done 函数 ,每次渲染完成之后做表格勾选操作.然后需要一个全局变量记录所有已经勾选的项 .下面是自己的代码 . 首先,监听表格的复选框点击事件 , 将单选或全选全部记录下来 var checkArray = new Array(); // 当前页数据 var currentArray ; //监听行单击事件(单击事件为:rowDouble) table.on('checkbox(test)', functio

  • vue elementUI table表格数据 滚动懒加载的实现方法

    在项目中遇到了一个性能问题 vue+elementUI table表格展示数据,当数据很多的时候,不能一页显示完,同时一次请求数据量太大,会增加网页渲染的时间,影响体验, 这个时候常常有两种方法处理, 1.分页,如下 2.如果我不想分页,又想在一页显示全部数据呢?这个时候其实就可以用数据懒加载了 如下一开始表格只显示31行数据 当将滚动条拉到低的时候,就会再加载31条数据,如果剩下的数据不足31,那就加载剩下的 根据项目需求,这需要一页可以看到全部数据,所以我选择了第二中方式 那么第二种方式要怎

  • bootstrap table表格插件之服务器端分页实例代码

    Bootstrap Table是基于Bootstrap的轻量级表格插件,只需要简单的配置就可以实现强大的支持固定表头.单复选.排序.分页.搜索以及自定义表头等功能. 因公司的项目需要实现用户管理的表格实现,所以选用了bootstrap-table用于动态获取后台的用户数据显示到前台. 示例截图: 客户端代码: //引入的css文件 <link href="../public/static/css/bootstrap.min.css" rel="external nofo

  • vue+element table表格实现动态列筛选的示例代码

    需求:在用列表展示数据时,出现了很多项信息需要展示导致表格横向特别长,展示就不够明晰,用户使用起来可能会觉得抓不住自己的重点. 设想实现:用户手动选择表格的列隐藏还是展示,并且记录用户选择的状态,在下次进入该时仍保留选择的状态. 效果图如下: 原: 不需要的关掉默认的勾选: 实现代码: HTML部分就是用一个多选框组件展示列选项 用v-if="colData[i].istrue"控制显示隐藏,把列选项传到checkbox里再绑定勾选事件. <el-popover placemen

  • vue element-ui table表格滚动加载方法

    添加全局注册事件,用来监听滚动事件 window.Vue.directive('loadmore', { bind(el, binding) { const selectWrap = el.querySelector('.el-table__body-wrapper') selectWrap.addEventListener('scroll', function() { let sign = 100 const scrollDistance = this.scrollHeight - this.

  • vue element table 表格请求后台排序的方法

    1.ElementUi文档已经说了,如果需要后端排序,需将sortable设置为custom,同时在 Table 上监听sort-change事件,在事件回调中可以获取当前排序的字段名和排序顺序,从而向接口请求排序后的表格数据. <el-table :data="playerTableData" border style="width: 100%" :default-sort = "{prop: 'outlay', order: 'descendin

  • vue实现table表格里面数组多层嵌套取值

    目录 vue table表格里面数组多层嵌套取值 表格部分 methods里面定义方法 vue 多层数组嵌套循环,动态取值匹配 vue table表格里面数组多层嵌套取值 我现在是在表格里拿到级联选择器的多选的id,然后要根据这个id来匹配一个嵌套了三层的数组的第三层id,来拿名字渲染 表格部分 <tr style="height: 44px;line-height: 44px;">                 <td style="border: 1p

  • vue element table表格相同名称列合并方式

    目录 element table表格相同名称列合并 对table表格相同内容行的合并 element table表格相同名称列合并 <template> <div> <el-table show-summary :summary-method="getSummaries" :span-method="objectSpanMethod" :data="tableData" row-key="id"

随机推荐