最近兴趣所致,打算使用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实现移动端列表筛选功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
© 版权声明
THE END
暂无评论内容