VUE实现移动端列表筛选功能


Posted in Javascript onAugust 23, 2019

最近兴趣所致,打算使用vant搭建一个webapp,由于需要使用列表筛选,没有找到合适组件,于是写了一个简单的功能,权当记录。

效果如下:

VUE实现移动端列表筛选功能VUE实现移动端列表筛选功能

HTML:

<div class="filterbar">
   <div class="filterbar-title">
    <ul class="title-ul">
     <li
      :class="{'title-li':true, 'current': item.isShow}"
      v-for="(item, index) in barMenus"
      :key="index"
     >
      <span @click="handerClickMenu(item)">
       {{item.name}}
       <van-icon :name="item.isShow ? 'arrow-up' :'arrow-down'" />
      </span>
      <div class="filterbar-content" v-on:click.stop v-if="item.isShow">
       <ul class="content-ul">
        <li
         v-for="(child, number) in item.data"
         :key="number"
         :class="{'current': child.selected}"
         @click="handerClickContent(item, child)"
        >
         {{child.name}}
         <van-icon v-if="child.selected" name="success" />
        </li>
       </ul>
       <div class="button-div" v-if="item.multiple">
        <van-button plain type="default" @click="handerClear(item)">清空</van-button>
        <van-button type="info" @click="search">确定</van-button>
       </div>
      </div>
     </li>
    </ul>
   </div>
   <div class="bg-filterbar" v-if="isBgFilterbarShow" @click="handerClickMenu"></div>
  </div>

CSS:

.filterbar {
  position: fixed;
  z-index: 2;
  left: 0;
  top: 3.1em;
  width: 100%;
  background-color: #fff;
  height: 2em;

  .bg-filterbar {
   position: fixed;
   width: 100%;
   height: 100%;
   background-color: black;
   opacity: 0.2;
   z-index: 1;
   left: 0;
   top: 4.2em;
  }
  .filterbar-title {
   width: 100%;
   .title-ul {
    height: 1.4em;
    margin-bottom: 0.5em;
    border-bottom: 1px solid #eee;
   }
   ul .title-li {
    width: 24%;
    float: left;
    text-align: center;
    font-size: 0.9em;

    .filterbar-content {
     position: absolute;
     left: 0;
     width: 100%;
     padding: 0.5em;
     background-color: #fff;
     z-index: 2;
     top: 1.24em;
    }
    .content-ul li {
     text-align: left;
     color: #111;
     font-weight: 400;
     padding-left: 1.5em;
     padding-top: 0.7em;
    }
    .content-ul .current {
     color: #1989fa;
    }
   }
   ul .current {
    color: #1989fa;
    font-weight: 600;
   }
   ul:after {
    content: "";
    display: block;
    clear: both;
   }
   .content-ul .van-icon {
    float: right;
    margin-right: 2.5em;
   }
   ul .van-icon {
    vertical-align: middle;
   }
  }
  .button-div {
   margin-top: 1.5em;
   text-align: center;

   button {
    width: 48%;
    float: left;
   }
   .van-button {
    height: 3em;
    line-height: 3em;
    font-size: 1em;
    font-weight: 400;
   }
  }
 }

JS:

<script>
export default {
 data() {
  return {
   barMenus: [
    {
     name: "菜系",
     value: 1,
     isShow: false,
     multiple: true,
     data: [
      { name: "川菜", value: 1, selected: false },
      { name: "粤菜", value: 2, selected: false },
      { name: "湘菜", value: 3, selected: false },
      { name: "苏菜", value: 4, selected: false },
      { name: "闽菜", value: 5, selected: false },
      { name: "徽菜", value: 6, selected: false },
      { name: "浙菜", value: 7, selected: false },
      { name: "鲁菜", value: 8, selected: false }
     ]
    },
    {
     name: "口味",
     value: 2,
     isShow: false,
     multiple: true,
     data: [
      { name: "清淡", value: 1, selected: false },
      { name: "麻辣", value: 2, selected: false },
      { name: "养生", value: 3, selected: false }
     ]
    },
    {
     name: "适合人群",
     value: 3,
     isShow: false,
     multiple: true,
     data: [
      { name: "老人", value: 1, selected: false },
      { name: "婴儿", value: 2, selected: false },
      { name: "小孩", value: 2, selected: false },
      { name: "病人", value: 2, selected: false }
     ]
    },
    {
     name: "排序",
     value: 4,
     isShow: false,
     multiple: false,
     data: [
      { name: "做过最多", value: 1, selected: false },
      { name: "点赞最多", value: 2, selected: false }
     ]
    }
   ]
  };
 },

 computed: {
  isBgFilterbarShow: {
   get() {
    let isBgShow = false;
    this.barMenus.forEach(function(currentValue, index, arr) {
     if (currentValue.isShow) {
      isBgShow = true;
     }
    });
    return isBgShow;
   }
  }
 },

 methods: {
  search() {
   this.handerClose();
  },

  handerClose() {
   this.barMenus.forEach(function(currentValue, index, arr) {
    currentValue.isShow = false;
   });
  },

  handerClickMenu(item) {
   if (!item) {
    return;
   }

   this.barMenus.forEach(function(currentValue, index, arr) {
    if (currentValue.value == item.value) {
     currentValue.isShow = !currentValue.isShow;
    } else {
     currentValue.isShow = false;
    }
   });
  },

  handerClickContent(item, child) {
   if (!item.multiple) {
    this.handerClear(item);
    this.handerClose(item);
   }

   child.selected = !child.selected;
  },

  handerClear(item) {
   item.data.forEach(function(currentValue, index, arr) {
    currentValue.selected = false;
   });
  }
 }
};
</script>

参数说明:

name:筛选项显示名称
value:筛选项code
isShow:是否显示
multiple: 是否多选,为true时会有清空和确定功能按钮
data: 筛选列表项

总结

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

Javascript 相关文章推荐
JS中setTimeout()的用法详解
Apr 14 Javascript
jquery获取复选框checkbox的值实现方法
May 30 Javascript
浅析$(function) ready和onload 的区别
Sep 03 Javascript
微信小程序 PHP生成带参数二维码
Feb 21 Javascript
jQuery zTree树插件动态加载实例代码
May 11 jQuery
解决option标签selected=&quot;selected&quot;属性失效的问题
Nov 06 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
js中的深浅拷贝问题简析
May 10 Javascript
重学JS之显示强制类型转换详解
Jun 30 Javascript
layui点击弹框页面 表单请求的方法
Sep 21 Javascript
微信小程序收藏功能的实现代码
Jun 19 Javascript
JavaScript实现简单验证码
Aug 24 Javascript
简述ES6新增关键字let与var的区别
Aug 23 #Javascript
微信小程序后台持续定位功能使用详解
Aug 23 #Javascript
详解基于Vue/React项目的移动端适配方案
Aug 23 #Javascript
详解vue-video-player使用心得(兼容m3u8)
Aug 23 #Javascript
使用vue实现多规格选择实例(SKU)
Aug 23 #Javascript
jquery分页优化操作实例分析
Aug 23 #jQuery
jquery实现的分页显示功能示例
Aug 23 #jQuery
You might like
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
python检查指定文件是否存在的方法
2015/07/06 Python
python简单分割文件的方法
2015/07/30 Python
Python字符串处理实现单词反转
2017/06/14 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
python pygame模块编写飞机大战
2018/11/20 Python
pymysql 开启调试模式的实现
2019/09/24 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Python configparser模块应用过程解析
2020/08/14 Python
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
大学生就业策划书范文
2014/04/04 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
个人授权委托书范文
2014/09/21 职场文书
幼儿园教师求职信
2015/03/20 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
python缺失值的解决方法总结
2021/06/09 Python
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL