首页 > 编程 > JavaScript > 正文

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

2019-11-19 10:59:25
字体:
来源:转载
供稿:网友

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

效果如下:

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实现移动端列表筛选功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表