vue 通过多组复选框来过滤数据

该文章展示了如何在Vue.js应用中使用v-for指令和计算属性(computed)来实现多条件筛选数据的功能。用户可以通过勾选不同地区的复选框和价格范围,动态地过滤列表数据。文章还优化了数据结构,将筛选条件分为多个对象,实现了更灵活的筛选逻辑。
摘要由CSDN通过智能技术生成

1.通过if else 来筛选数据
在这里插入图片描述
在这里插入图片描述

<template>
<div>
	<div>
		<label><input type="checkbox" v-model="checkedNames" value="北京"> 北京</label>
		<label><input type="checkbox" v-model="checkedNames" value="上海"> 上海</label>
		<label><input type="checkbox" v-model="checkedNames" value="郑州"> 郑州</label>
	</div>
	<div>
		<label><input type="checkbox" v-model="checkedPrices" value="高"></label>
		<label><input type="checkbox" v-model="checkedPrices" value="低"></label>
	</div>
<ul>
  <li v-for="(item, index) in filteredList" :key="index">{{ item.name }} - {{ item.price }}</li>
</ul>
</div>
</template>

<script>
export default {
	data() {
		return {
			list: [
				{ name: '北京', price: '高' },
				{ name: '北京', price: '低' },
				{ name: '上海', price: '高' },
				{ name: '上海', price: '低' },
				{ name: '郑州', price: '高' },
				{ name: '郑州', price: '低' }
				],
				checkedNames: [],
				checkedPrices:[]
			}
	},
	computed: {
	  filteredList() {
	    // 如果两个勾选框都没有选中,则返回全部数据
	    if (this.checkedNames.length === 0 && this.checkedPrices.length === 0) {
	      return this.list;
	    }
	    // 只勾选了地区,没有勾选价格
	    else if (this.checkedNames.length > 0 && this.checkedPrices.length === 0) {
	      return this.list.filter(item => this.checkedNames.includes(item.name))
	    }
	    // 只勾选了价格,没有勾选地区
	    else if (this.checkedNames.length === 0 && this.checkedPrices.length > 0) {
	      if(this.checkedPrices.includes("高")) {
	        return this.list.filter(item => item.price === "高");
	      } else if(this.checkedPrices.includes("低")) {
	        return this.list.filter(item => item.price === "低");
	      }
	    }
	    // 同时勾选了地区和价格
	    else {
	      let areaFilter = this.list.filter(item => this.checkedNames.includes(item.name));
	      let priceFilter = [];
	      if(this.checkedPrices.includes("高")) {
	        priceFilter.push(...areaFilter.filter(item => item.price === "高"));
	      }
	      if(this.checkedPrices.includes("低")) {
	        priceFilter.push(...areaFilter.filter(item => item.price === "低"));
	      }
	      return priceFilter;
	    }
	  }
	}
}
</script>

2.优化:通过v-for来循环对象的模式+集合来过滤数据

<template>
	<div>
		<div v-for="(item, itemIndex) in searchArr" :key="itemIndex">
			<br>
			{{itemIndex}}:
			<label v-for="(li, liIndex) in item" :key="liIndex" :name="itemIndex">
				<input type="checkbox" v-model="checkedArr[itemIndex]" :value="li.name" :key="li.name">{{li.name}}
			</label>
		</div>
		<ul>
			<li v-for="(item, index) in listShow" :key="index">
				{{item.id}}. {{ item.name }} - {{ item.price }}
			</li>
		</ul>
	</div>
</template>

<script>
	export default {
		data() {
			return {
				searchArr: {
					address: [{
						"name": "北京"
					}, {
						"name": "上海"
					}, {
						"name": "郑州"
					}],
					type: [{
						"name": "历史遗迹"
					}, {
						"name": "自然风光"
					}, {
						"name": "主题公园"
					}],
					attr: [{
						"name": "儿童"
					}, {
						"name": "年轻人"
					}, {
						"name": "老年人"
					}],
					price: [{
						"name": "1800"
					}, {
						"name": "2000"
					}, {
						"name": "3000"
					}]
				},
				checkedArr: {},
				list: [{
					id: 0,
					name: "北京大学",
					address: "北京",
					type: "历史遗迹",
					attr: "儿童",
					price: "1800"
				}, {
					id: 1,
					name: "湖北11",
					address: "湖北",
					type: "自然风光",
					attr: "儿童",
					price: "1800"
				}, {
					id: 2,
					name: "南京大学",
					address: "北京",
					type: "主题公园",
					attr: "儿童",
					price: "1800"
				}, {
					id: 3,
					name: "周师",
					address: "郑州",
					type: "历史遗迹",
					attr: "儿童",
					price: "1800"
				}, {
					id: 4,
					name: "郑州大学",
					address: "郑州",
					type: "主题公园",
					attr: "年轻人",
					price: "1800"
				}, ]
			}
		},
		mounted() {
			this.initCheckedArr();
		},
		methods: {
			initCheckedArr() {
				for (var key in this.searchArr) {
					this.checkedArr[key] = []
				}
			},
			searchList(key) {
				var l = this.list.map(item => {
					if (this.checkedArr[key] != undefined &&
						this.checkedArr[key].length > 0 &&
						this.checkedArr[key].indexOf(item[key]) != -1)
						return item
				}).filter(item => item != undefined)
				return l
			}
		},
		computed: {
			listShow() {
				console.log(this.checkedArr);
				var arr = [];
				for (var key in this.checkedArr) {
					arr = arr.concat(this.searchList(key))
				}
				return [...new Set(arr)].sort((a, b) => a.id - b.id)
			}
		}
	}
</script>

初始化checkedArr的值如下图
在这里插入图片描述

只要每点击一个复选框就会往这个对象数组中对应的元素中添加对应的属性

在这里插入图片描述

通过循环这个对象当中的数组来过滤数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值