vue 实现搜索的结果页面支持全选与取消全选功能


Posted in Javascript onMay 10, 2019

演示地址,打开、搜索、随便点

http://msisliao.github.io/dem...

npm i element-ui -S

// main.js
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)

demo功能概览

  • 默认没有全选,搜索时支持全选与取消全选,
  • 将选择的数据添加到已选中,已选删除时改变当前搜索列表的状态与全选按钮的状态
  • 全选时全部追加到已选,取消全选时从已选中删除当前搜索的列表

功能列表

1、搜索时展示相应的数据列表,支持全选与取消全选,(默认展示所有数据时不支持全选)

datas() {
 // 每次搜索的数据 根据下拉菜单的值的变化
 if (this.value !== "") {
 return this.listItem.list.filter(item => {
  return item.BrandNames.includes(this.value);
 });
 } else {
 return this.listItem.list; // 没有搜索的关键词时展示全部数据
 }
 },

2、搜索的下拉菜单去重

filDatas() {
 // 利用reduce 下拉菜单去重
 var obj = {};
 return this.listItem.list.reduce(function(item, next) {
 obj[next.BrandNames] ? "" : (obj[next.BrandNames] = true && item.push(next));
 return item;
 }, []);
 }

3、当前界面全选时添加到已选中,当前界面取消全选时,从已选的数据删除当前搜索出来的列表数据,

// 每次搜索列表的全选 与 取消全选
 ckAll() {
 this.allck = !this.allck; //点击全选 变 取消选择
 let arrys = []; //存放复选框为取消状态的数据
 if (this.allck) { // 将当前搜索的列表数据追加到已选中
 this.datas.forEach(item => {
  item.ck = true; 
  if (!this.arr.includes(item)) { // 追加复选框为false的数据
  this.arr.push(item);
  this.ckarr.push(item);
  }
 });
 } else {
 this.datas.forEach(item => { item.ck = false; }); //当前搜索的数据列表复选框设为取消状态
 arrys = this.datas.filter(item => { return !item.ck; }); //把复选框为false的数据 拿出来
 this.datas.forEach(items => { //已选那里删除当前搜索列表复选框为false的数据
  arrys.forEach(item => {
  if (item.BrandID == items.BrandID) { this.arr.splice(this.arr.indexOf(item), 1);}
  });
 });
 this.ckarr = []; //当前搜索列表为复选框的数据清空
 }
 },

4、列表选中时添加到已选,全部选中时改变全选状态(变取消全选)

// 监听当前搜索列表的勾选数据
 ckarr: function() {
 if (this.value !== "") {
 this.ckarr.length == this.datas.length ? this.allck = true : this.allck = false; //如果已选等于当前搜索列表 改变全选状态
 }
 }

5、在已选中操作删除时,如果删除的是当前搜索的列表,当前全选改变状态,如果删除的非当前搜索列表,当前全选状态不变(这里有点绕)

handleClose(tag) {
 this.arr.splice(this.arr.indexOf(tag), 1); // 点哪删哪
 this.ckarr.forEach(items => { // 判断删除的是否是当前搜索列表的数据 是的话改变全选状态
 if (items.BrandID == tag.BrandID) {
  this.ckarr.splice(this.ckarr.indexOf(tag), 1);
 }
 });
 this.listItem.list.forEach(items => { // 删除已选时改变数据列表状态
 if (items.BrandID == tag.BrandID) { items.ck = false; }
 });
 },

app.vue

<template>
 <div class='tpbox'>
 <el-select v-model="values" filterable placeholder="请选择" size="mini" clearable >
  <el-option v-for="item in filDatas" :key="item.BrandID" :label="item.BrandNames" :value="item.BrandNames" :value-key='item.BrandID'>
  </el-option>
 </el-select>
 <!-- 搜索的列表 -->
 <div v-if="values!=='' && values!==null ">
  <p class='ck-btn-box'>
  <el-button size="mini" @click="ckAll">{{allck?'取消全选':'全选'}}</el-button>
  </p>
  <ul>
  <li v-for="item in datas" :key="item.BrandID">
   <span>AA{{item.BrandTypeName}}</span>
   <span>BB{{item.BrandCName}}</span>
   <span>CC{{item.BrandName}}</span>
   <span>
   <el-checkbox v-model="item.ck" @change="handItem(item)">{{item.BrandNames}}</el-checkbox>
   </span>
  </li>
  </ul>

 </div>
 <!-- 默认列表 -->
 <ul v-else>
  <li v-for="item in datas" :key="item.BrandID">
  <span>AA{{item.BrandTypeName}}</span>
  <span>BB{{item.BrandCName}}</span>
  <span>CC{{item.BrandName}}</span>
  <span>
   <el-checkbox v-model="item.ck" @change="handItem(item)">{{item.BrandNames}}</el-checkbox>
  </span>
  </li>
 </ul>
 <p class='checked-box' v-if="this.arr.length>0">
  已选:
  <span @click="clearAll" class='clearll-txt'>清空</span>
  <el-tag v-for="tag in this.arr" :key="tag.BrandID" closable @close="handleClose(tag)" :disable-transitions=true>
  {{tag.BrandName}} / {{tag.BrandNames}}
  </el-tag>
 </p>
 </div>
</template>
<script>
export default {
 data() {
 return {
 allck: false, //控制全选 当没有任何操作时每次默认为 true
 ckarr: [], //每次搜索出来点击了复选框
 arr: [], //点击了input的数据 存放所有的已选
 values: "",
 listItem:{
 list: [
  {
  BrandTypeName: "大类1 建材/家居 ", //品牌正常
  BrandTypeID: 1,
  BrandCName: "中类1 建筑材料",
  BrandCID: 1,
  BrandName: "小类1 水泥",
  BransID: 1,
  BrandNames: "红水泥",
  BrandID: 1,
  ck: false
  },
  {
  BrandTypeName: "大类1 建材/家居 ", //品牌在多个小类里
  BrandTypeID: 1,
  BrandCName: "中类2 家私定制",
  BrandCID: 2,
  BrandName: "小类2 电饭煲",
  BransID: 2,
  BrandNames: "松下",
  BrandID: 2,
  ck: false
  },
  {
  BrandTypeName: "大类1 建材/家居 ",
  BrandTypeID: 1,
  BrandCName: "中类2 家私定制",
  BrandCID: 2,
  BrandName: "小类3 电压力锅",
  BransID: 3,
  BrandNames: "松下",
  BrandID: 3,
  ck: false
  },
  {
  BrandTypeName: "大类1 建材/家居 ", //品牌在多个中类小类里
  BrandTypeID: 1,
  BrandCName: "中类2 高档家具",
  BrandCID: 3,
  BrandName: "小类2 家具类",
  BransID: 4,
  BrandNames: "品牌",
  BrandID: 4,
  ck: false
  },
  {
  BrandTypeName: "大类1 建材/家居 ",
  BrandTypeID: 1,
  BrandCName: "中类2 豪华家具",
  BrandCID: 4,
  BrandName: "小类3 厨具类",
  BransID: 5,
  BrandNames: "品牌2",
  BrandID: 5,
  ck: false
  },
  {
  BrandTypeName: "大类1 装修/房产 ",
  BrandTypeID: 2,
  BrandCName: "中类2 豪华家具",
  BrandCID: 5,
  BrandName: "小类3 沙发类",
  BransID: 6,
  BrandNames: "品牌3",
  BrandID: 6,
  ck: false
  }
 ]
 }
 };
 },
 computed: {
 datas(){
 if(!this.values){
 return this.listItem.list
 }
 //每次搜索的数据
 if (this.values !== "") {
 return this.listItem.list.filter(item => {
  return item.BrandNames.includes(this.values);
 });
 } 
 },
 filDatas() {
 //select下拉菜单去重 相同名字的子选项会存放在多个类别里
 var obj = {};
 return this.listItem.list.reduce(function(item, next) {
 obj[next.BrandNames] ? "" : (obj[next.BrandNames] = true && item.push(next));
 return item;
 }, []);
 }
 },
 watch: {
 // 监听每次搜索时的数据变化
 datas: function(ary) {
 //搜索数据变化时 如果搜的结果全部是已选 第二次搜这个关键词就变成 取消选择
 if (this.values !== "") {
 this.allck = false; //默认每次搜索时是全选状态 需判断之前是否全选中的 有的话就是取消全选
  ary.every( item => { item.ck ? !this.allck : this.allck });
 // 将当前搜索列表的已选拿出来
 this.ckarr = this.datas.filter(item => {
  if (item.ck) { return item; }
 });
 }
 },
 // 监听每次搜索列表的数据是否全部为选中 判断已选的数据是不是等于当前搜索列表的数据
 ckarr: function() {
 if (this.values !== "") {
 this.ckarr.length == this.datas.length ? this.allck = true : this.allck = false; //如果已选等于当前搜索列表 改变全选状态
 }
 },

 },
 methods: {
 // 数据列表的复选框点击
 handItem(item) {
 if (item.ck) {
 this.arr.push(item); //arr是所有复选框的数据 存放在已选中
 this.ckarr.push(item); //ckarr是每次搜索列表点了复选框的数据 当取消全选时 在已选的大数组中删除 ckarr的数据
 } else {
 this.arr.splice(this.arr.indexOf(item), 1);
 this.ckarr.splice(this.arr.indexOf(item), 1);
 }
 },
 // 已选中的 单个删除
 handleClose(tag) {
 this.arr.splice(this.arr.indexOf(tag), 1); // 点哪删哪
 this.ckarr.forEach(items => { // 判断删除的是否是当前搜索列表的数据 是的话改变全选状态
 if (items.BrandID == tag.BrandID) {
  this.ckarr.splice(this.ckarr.indexOf(tag), 1);
 }
 });
 this.listItem.list.forEach(items => { // 删除已选时改变数据列表状态
 if (items.BrandID == tag.BrandID) { items.ck = false; }
 });
 },
 // 清空操作
 clearAll() {
 this.listItem.list.forEach(item => { item.ck = false; }); // 数据列表状态恢复
 this.arr = []; //已选全部清空 
 this.ckarr = [] // 当前搜索列表存放的已选全部清空
 this.allck = false; //全选状态恢复
 this.values='' //回到默认数据 
 },
 // 每次搜索列表的全选
 ckAll() {
 this.allck = !this.allck; //点击全选 变 取消选择
 let arrys = []; //存放复选框为取消状态的数据
 if (this.allck) { // 将当前搜索的列表数据追加到已选中
 this.datas.forEach(item => {
  item.ck = true; 
  if (!this.arr.includes(item)) { // 追加复选框为false的数据
  this.arr.push(item);
  this.ckarr.push(item);
  }
 });
 } else {
 this.datas.forEach(item => { item.ck = false; }); //当前搜索的数据列表复选框设为取消状态
 arrys = this.datas.filter(item => { return !item.ck; }); //把复选框为false的数据 拿出来
 this.datas.forEach(items => { //已选那里删除当前搜索列表复选框为false的数据
  arrys.forEach(item => {
  if (item.BrandID == items.BrandID) { this.arr.splice(this.arr.indexOf(item), 1);}
  });
 });
 this.ckarr = []; //当前搜索列表为复选框的数据清空
 }
 },
 }
};
</script>
<style scoped>
.tpbox {
 background: #fff;
 padding: 30px;
 height: 500px;
}
 ul {
 margin-top: 15px;
 }
 li {
 justify-content: space-around;
 display: flex;
 line-height: 50px;
 color: #666;
 border-bottom: 1px solid #eee;

 }
 span {
 flex: 1;
 text-align: left;
 padding-left: 10px;
 }
 .checked-box {
 margin-top: 20px;
 
 }
 .el-tag {
 margin-left: 10px;
 }
 .clearll-txt {
 color: red;
 cursor: pointer;
 }
 .ck-btn-box {
 margin-top: 30px;
 }
</style>

总结

以上所述是小编给大家介绍的vue 实现搜索的结果页面支持全选与取消全选功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
JS获取浏览器语言动态加载JS文件示例代码
Oct 31 Javascript
JavaScript中的变量作用域介绍
Dec 31 Javascript
JavaScript设置body高度为浏览器高度的方法
Feb 09 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
Feb 28 Javascript
bootstrap使用validate实现简单校验功能
Dec 02 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
详解Vue单元测试Karma+Mocha学习笔记
Jan 31 Javascript
layui时间控件选择时间范围的实现方法
Sep 28 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
Oct 31 Javascript
three.js中多线程的使用及性能测试详解
Jan 07 Javascript
Vue项目中配置pug解析支持
May 10 #Javascript
Angular2实现的秒表及改良版示例
May 10 #Javascript
node中IO以及定时器优先级详解
May 10 #Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 #Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
May 10 #jQuery
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 #Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 #Javascript
You might like
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
PHP中header用法小结
2016/05/23 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
Python补齐字符串长度的实例
2018/11/15 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
原生python实现knn分类算法
2019/10/24 Python
pytorch构建多模型实例
2020/01/15 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
Overload和Override的区别
2012/09/02 面试题
社会实践心得体会
2014/01/03 职场文书
房地产还款计划书
2014/01/10 职场文书
酒吧创业计划书
2014/01/18 职场文书
高中学生评语大全
2014/04/25 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
2016新年年会主持词
2015/07/06 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers