elementUI多选框反选的实现代码


Posted in Javascript onApril 03, 2019

最近有一个需求,点击添加按钮,弹出窗口(窗口显示多选、可翻页、可检索列表),选中多条信息,当我点击确定按钮,把选中信息显示在页面上;点击取消,选中信息不显示在页面上。再次打开,把在页面上的信息显示选中状态。

思路:一开始选用elementUI官网例子,使用selection-change,但是它只显示当前改变的选择,不能满足我翻页及检索后还能选中数据的问题

toggleSelection(rows) {
    if (rows) {
     rows.forEach(row => {
      this.$refs.multipleTable.toggleRowSelection(row);
     });
    } else {
     this.$refs.multipleTable.clearSelection();
    }
   }

后来查询api,发现了另外2个api,页面上的存在本地字段 glht,列表上选中的存在本地字段 yglht.

每次要计算页面显示的数据是列表的第几条数据,直接把对象放里面并不会勾选我上传选中的数据。

emmm....知道有点蠢,但是我还没想到别的办法...

弹框:

<el-dialog class="contract_modal" title="信息" :visible.sync="glht_modal" width="80%" :modal="false" @close="cancel">
 <el-form :inline="true" :model="searchData" label-width="90px">
  <el-form-item label="名称:">
   <el-input v-model.trim="searchData.mc_" size="small" class="contract_input"></el-input>
  </el-form-item>
  <span class="list_btns">
   <el-button type="primary" size="small" @click="listSearch(page, 1)" class="con_btn">搜索</el-button>
   <el-button size="small" @click="searchData = {}" class="con_btn">清空</el-button>
  </span>
 </el-form>
 <div id="list_body" class="list-body" style="padding-left: 0;">
  <el-table :data="tableData" stripe border style="width: 100%" max-height="480" ref="multipleTable" @select-all="handleSelectionAll" @select="handleSelectionChange">
   <el-table-column type="selection" width="26" align="right"></el-table-column>
   <el-table-column type="index" width="50" label="序号" align="left" header-align="left"></el-table-column>
   <el-table-column prop="mc_" label="名称" width="180" show-overflow-tooltip align="left"></el-table-column>
   
  </el-table>
  <div class="list-pagination">
   <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
           :current-page.sync="page.page" :page-sizes="[10, 20, 50, 100]":page-size="page.pageCount"
           layout="total, sizes, prev, pager, next, jumper, ->"
           :total="page.total"></el-pagination>
  </div>
 </div>
 <div slot="footer" class="dialog-footer">
  <el-button type="primary" @click="save" size="small">确定</el-button>
  <el-button @click="cancel" size="small">取消</el-button>
 </div>
</el-dialog>

methods 里,全选时与选中单个时所做的操作:

// 全选  当val有数据,即为全选;为空数组,即为取消全选
handleSelectionAll (val) {
 // 获取所有选中的数据 
 this.records = JSON.parse(localStorage.getItem('glht'))
 if(val.length !== 0) {  
  //全选
  // this.records = Array.from(new Set(val.concat(this.records)))  发现去重不好用!只能手动push了
  // 全选选中的一定是本页所有数据,所以循环本页
  this.tableData.forEach((v) => {
   if(this.records.find((e,index) => { return v.id_ === e.id_})){}else {
    // 如果数组中没有就把选中的push进去
    this.records.push(v)
   }
  })
 } else {   
  // 取消全选,在选中的所有信息中把本页列表有的删除
  this.tableData.forEach((v) => {
   this.records.forEach((e,index) => {
    if (e.id_ === v.id_) {
     this.records.splice(index, 1)
    }
   })
  })
 }
 // 每次选的数据暂时存一下
 localStorage.setItem('glht', JSON.stringify(this.records))
},
// 单选 
handleSelectionChange(val, row) {
 // 获取所有选中的数据 
 this.records = JSON.parse(localStorage.getItem('glht'))
 if (this.records.length === 0) {
  // 还没有选中任何数据
  this.records = [row]
 } else {
  if (this.records.filter(i => { return i.id_ === row.id_ }).length === 0) {
    // 已选中的数据里没有本条(取消),把这条加进来
   this.records.push(row)
  } else {
    // 已选中的数据里有本条(取消选中),把这条删除
   this.records.forEach((e,index) => {
    if (e.id_ === row.id_) {
     this.records.splice(index, 1)
    }
   })
  }
 }
 // 每次选的数据暂时存一下
 localStorage.setItem('glht', JSON.stringify(this.records))
},

methods 里,获取弹出框列表与选中数据:

listGet() {
  this.$axios.post("interface", {}, { params: searchData }).then(res => {
   if (res.data.success) {
    this.tableData = res.data.data.rows;
    this.page.total = res.data.data.total;
    this.records = JSON.parse(localStorage.getItem('yglht'))
    this.toggleSelection(JSON.parse(localStorage.getItem('yglht')));  // 反选操作
   } else {
    this.$message.error(res.data.message)
   }
  })
 .catch(err => console.log(err));
},
// 反选处理
toggleSelection(rows) {
 let arr =[]
 this.tableData.forEach((e, index) => {
  rows.forEach((i, ind) => {
   if (e.id_ === i.id_) {
     arr.push(this.tableData[index])
   }
  })
 })
 if (arr) {
  this.$nextTick(() => {
   arr.forEach(row => {
    this.$refs.multipleTable.toggleRowSelection(row);
   });
  })
 } else {
  this.$refs.multipleTable.clearSelection();
 }
},

methods 里,保存与取消单个时所做的操作:

save () {
 this.glht_modal = false
 localStorage.setItem('yglht', localStorage.getItem('glht'))
 this.yglht()
},
cancel () {
 this.glht_modal = false
 // 取消时 取在页面上的值
 localStorage.setItem('glht', localStorage.getItem('yglht'))
 // this.toggleSelection(JSON.parse(localStorage.getItem('yglht')));  直接写不好用
 this.listGet({})  // 获取弹出框列表数据,这里调用一次是因为防止再次打开弹出框闪现之前选择的内容
 this.yglht()
},
yglht() {
  this.list = JSON.parse(localStorage.getItem('yglht'))
  // 处理this.list中地址、时间等页面显示问题
}

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

Javascript 相关文章推荐
JS 对象介绍
Jan 20 Javascript
JavaScript 一道字符串分解的题目
Aug 03 Javascript
javascript一元操作符(递增、递减)使用示例
Aug 07 Javascript
纯javascript代码实现计算器功能(三种方法)
Sep 07 Javascript
JavaScript实现页面跳转的几种常用方式
Nov 28 Javascript
bootstrapValidator自定验证方法写法
Dec 01 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
Feb 11 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 Javascript
基于vue的换肤功能的示例代码
Oct 10 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
Mar 26 Javascript
JS实现的视频弹幕效果示例
Aug 17 Javascript
VUE.CLI4.0配置多页面入口的实现
Nov 25 Javascript
vue生命周期的探索
Apr 03 #Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 #Javascript
详释JavaScript执行环境与执行栈
Apr 02 #Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 #Javascript
koa大型web项目中使用路由装饰器的方法示例
Apr 02 #Javascript
vue中v-text / v-html使用实例代码详解
Apr 02 #Javascript
Seajs源码详解分析
Apr 02 #Javascript
You might like
总结对比php中的多种序列化
2016/08/28 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
小程序实现多选框功能
2018/10/30 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
浅谈flask源码之请求过程
2018/07/26 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
Python实现代码块儿折叠
2020/04/15 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
一份Java笔试题
2012/02/21 面试题
聚网科技C++面试笔试题
2015/09/01 面试题
一套带网友答案的.NET笔试题
2016/12/06 面试题
教师求职推荐信范文
2013/11/20 职场文书
销售副总经理岗位职责
2013/12/11 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
法院授权委托书范文
2014/08/02 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS