vue搜索功能实现

668 阅读1分钟

---原帖地址


	<style type="text/css">
		* {
			padding: 0;
			margin: 0;
			font-size: 14px;
			font-family: "微软雅黑";
		}
		#box {
			width: 500px;
			height: auto;
			border: 1px solid #ccc;
			margin: 50px auto;
			padding: 10px;
		}

		.search {
			width: 480px;
			height: 100px;
			text-align: center;
		}

		.searchBox {
			width: 230px;
			height: 40px;
			outline: none;
			text-indent: 10px;
			margin-right: 20px;
		}

		.btn {
			width: 100px;
			height: 50px;
			cursor: pointer;
			font-size: 18px;
		}

		.goodsheet {
			width: 500px;
			height: auto;
			border: 1px solid #eee;
		}

		.goodsheet tr td,
		.goodsheet tr th {
			width: 33%;
			border: 1px solid #eee;
			padding: 5px 10px;
			text-align: left;
		}

		.goodsheet tr th span {
			background: #ff9900;
			padding: 0 6px;
			color: #fff;
			cursor: pointer;
		}
	</style>
</head>
<body>
	<div id="box">
		<div class="search">
			<input type="text" class="searchBox" v-model="searchVal">
			<button class="btn">搜 索</button>
		</div>
		<table class="goodsheet">
			<tr>
				<th>商品名</th>
				<th>单价
					<span @click="orderFn('price', false)"></span>
					<span @click="orderFn('price', true)"></span>
				</th>
				<th>销量
					<span @click="orderFn('sales', false)"></span>
					<span @click="orderFn('sales', true)"></span>
				</th>
			</tr>
			<tr v-for='(item, key) in list'>
				<td>{{item.name}}</td>
				<td>{{item.price}}</td>
				<td>{{item.sales}}万</td>
			</tr>
		</table>
	</div>
	<script type="text/javascript">
		var myVueTest = new Vue({
			el: '#box',
			data: {
				goodsList: [
					//假数据
					{
						name: "三星Galaxy Note8",
						price: 5200,
						sales: 2.6
					},
					{
						name: "iphone5s",
						price: 2500,
						sales: 2.2
					},
					{
						name: "iphone6",
						price: 2800,
						sales: 1.6
					},
					{
						name: "iphone6s",
						price: 3200,
						sales: 2.9
					},
					{
						name: "iphone7",
						price: 3800,
						sales: 12.6
					},
					{
						name: "iphone7plus",
						price: 4200,
						sales: 2.1
					},
					{
						name: "iphone8",
						price: 5500,
						sales: 10.6
					},
					{
						name: "华为",
						price: 4600,
						sales: 7.6
					},
					{
						name: "小米",
						price: 1200,
						sales: 32.6
					},
					{
						name: "OPPOR11",
						price: 3000,
						sales: 1.2
					},
					{
						name: "vivoX20",
						price: 3250,
						sales: 2.9
					}
				],
				searchVal: '', //默认输入为空
				letter: '', //默认不排序
				original: false //默认从小到大排列
			},
			methods: {
				orderFn(letter, original) {
					this.letter = letter; //排序字段 price or sales
					this.original = original; //排序方式 up or down
				}
			},
			//通过计算属性过滤数据
			computed: {
				list: function() {
					var _this = this;
					//逻辑-->根据input的value值筛选goodsList中的数据
					var arrByZM = []; //声明一个空数组来存放数据
					for (var i = 0; i < this.goodsList.length; i++) {
						//for循环数据中的每一项(根据name值)
						if (this.goodsList[i].name.search(this.searchVal) != -1) {
							//判断输入框中的值是否可以匹配到数据,如果匹配成功
							arrByZM.push(this.goodsList[i]);
							//向空数组中添加数据
							console.log(arrByZM);
						}
					}
					//逻辑-->升序降序排列 false: 默认从小到大 true:默认从大到小
					//判断,如果要letter不为空,说明要进行排序
					if (this.letter != '') {
						arrByZM.sort(function(a, b) {
							if (_this.original) {
								return b[_this.letter] - a[_this.letter];
							} else {
								return a[_this.letter] - b[_this.letter];
							}
						});
					}
					//一定要记得返回筛选后的数据
					return arrByZM;
				}
			}
		});
	</script>
</body>