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 相关文章推荐
一个刚完成的layout(拖动流畅,不受iframe影响)
Aug 17 Javascript
javascript 面向对象全新理练之数据的封装
Dec 03 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
js工具方法弹出蒙版
May 08 Javascript
Jquery的hover方法让鼠标经过li时背景变色
Sep 06 Javascript
javascript常用功能汇总
Jul 05 Javascript
js电话号码验证方法
Sep 28 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
Jun 01 Javascript
深入浅析search 搜索框的写法
Aug 02 Javascript
webpack3+React 的配置全解
Aug 21 Javascript
vue3实现v-model原理详解
Oct 09 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
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
php之可变函数的实例详解
2017/09/13 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
教师推荐信范文
2013/11/24 职场文书
任课老师推荐信范文
2013/11/24 职场文书
党风廉政承诺书
2014/03/27 职场文书
创优争先心得体会
2014/09/11 职场文书
自书遗嘱范文
2015/08/07 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis