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 相关文章推荐
基于jquery封装的一个js分页
Nov 15 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
Apr 26 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
浅谈Javascript的静态属性和原型属性
May 07 Javascript
跟我学习javascript的函数调用和构造函数调用
Nov 16 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
Jan 18 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
Jul 16 Javascript
node中的session的具体使用
Sep 14 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
Sep 21 Javascript
深入解析vue 源码目录及构建过程分析
Apr 24 Javascript
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
JavaScript文档对象模型DOM
Nov 20 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实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
php生成html文件方法总结
2014/12/01 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
Jquery getJSON方法详细分析
2013/12/26 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
Python实现批量转换文件编码的方法
2015/07/28 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
基于python的Tkinter编写登陆注册界面
2017/06/30 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
python tornado修改log输出方式
2019/11/18 Python
Python中实现输入一个整数的案例
2020/05/03 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
酒店前台接待岗位职责
2013/12/03 职场文书
主题实践活动总结
2014/05/08 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL