温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用VUE实现移动端列表筛选功能的案例

发布时间:2021-04-02 10:53:08 阅读:832 作者:小新 栏目:web开发
Vue开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

小编给大家分享一下使用VUE实现移动端列表筛选功能的案例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

效果如下:

使用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-index2;
  left0;
  top3.1em;
  width100%;
  background-color#fff;
  height2em;

  .bg-filterbar {
   position: fixed;
   width100%;
   height100%;
   background-color: black;
   opacity0.2;
   z-index1;
   left0;
   top4.2em;
  }
  .filterbar-title {
   width100%;
   .title-ul {
    height1.4em;
    margin-bottom0.5em;
    border-bottom1px solid #eee;
   }
   ul .title-li {
    width24%;
    float: left;
    text-align: center;
    font-size0.9em;

    .filterbar-content {
     position: absolute;
     left0;
     width100%;
     padding0.5em;
     background-color#fff;
     z-index2;
     top1.24em;
    }
    .content-ul li {
     text-align: left;
     color#111;
     font-weight400;
     padding-left1.5em;
     padding-top0.7em;
    }
    .content-ul .current {
     color#1989fa;
    }
   }
   ul .current {
    color#1989fa;
    font-weight600;
   }
   ul:after {
    content"";
    display: block;
    clear: both;
   }
   .content-ul .van-icon {
    float: right;
    margin-right2.5em;
   }
   ul .van-icon {
    vertical-align: middle;
   }
  }
  .button-div {
   margin-top1.5em;
   text-align: center;

   button {
    width48%;
    float: left;
   }
   .van-button {
    height3em;
    line-height3em;
    font-size1em;
    font-weight400;
   }
  }
 }

JS:

<script>
export default {
 data() {
  return {
   barMenus: [
    {
     name"菜系",
     value1,
     isShowfalse,
     multipletrue,
     data: [
      { name"川菜"value1selectedfalse },
      { name"粤菜"value2selectedfalse },
      { name"湘菜"value3selectedfalse },
      { name"苏菜"value4selectedfalse },
      { name"闽菜"value5selectedfalse },
      { name"徽菜"value6selectedfalse },
      { name"浙菜"value7selectedfalse },
      { name"鲁菜"value8selectedfalse }
     ]
    },
    {
     name"口味",
     value2,
     isShowfalse,
     multipletrue,
     data: [
      { name"清淡"value1selectedfalse },
      { name"麻辣"value2selectedfalse },
      { name"养生"value3selectedfalse }
     ]
    },
    {
     name"适合人群",
     value3,
     isShowfalse,
     multipletrue,
     data: [
      { name"老人"value1selectedfalse },
      { name"婴儿"value2selectedfalse },
      { name"小孩"value2selectedfalse },
      { name"病人"value2selectedfalse }
     ]
    },
    {
     name"排序",
     value4,
     isShowfalse,
     multiplefalse,
     data: [
      { name"做过最多"value1selectedfalse },
      { name"点赞最多"value2selectedfalse }
     ]
    }
   ]
  };
 },

 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实现移动端列表筛选功能的案例”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue
AI

开发者交流群×