vue学习之交换布局以及模糊查询

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

交换布局

vue框架是典型的MVVM前端框架,不提倡程序猿通过操作dom元素来达到效果。并且操纵dom元素不利于性能优化消耗较多内存。
交换布局的核心其实就是满足条件的一方展示。用到的是v-if指令,

		<div id="search">
			<!-- 查询 -->
			<input type="text" name="" id="find" placeholder="请输入搜索内容" v-model="search_content"/>
			<img src="../image/搜索.png">	
			<img src="../image/详情.png" :class="{'active':layout=='list'}" @click="layout='list'">
			<img src="../image/网格化.png" :class="{'active':layout=='grid'}" @click="layout='grid'">
			
		</div>	
		<ul>
	<!-- 展示 -->
		<div class="flex" v-if="layout=='list'">
			<li v-for="item in find">
			{{item.title}}
			<div id="img">
				<img :src=item.img />	
			</div>
			</li>
		</div>
		</ul>

首先给两个按钮绑定对应事件,第一个是形式是带标题的展示,第二格式网格式的图片展示。@click=“layout=‘list’” 显然这段代码的意思是点击之后data中的layout变量变为了list。所以我们应该在data中提前声明变量layout,并且默认值设为list。
实现交换布局核心就是当layout为list时候展示lsit格式,为grid展示grid格式,所以直接v-if=“layout == ‘list’” 即可
然后为img添加active样式。用到的是v-bind指令,他能够更改属性值,:class意思是要更改的属性为class,active则是如果满足条件就把属性class的值改成active即使用active样式。两种写法:

<img src="../image/详情.png" :class="{'active':layout=='list'}" >
<img src="../image/网格化.png" :class="layout=='grid'?'active':''">

此时就可以做到通过点击图标来实现布局的交换。

模糊查询

作为前端 如果拿到了所有数据进行模糊查询功能的编写也是不难的。本例使用计算属性(响应式数据),同步渲染。因为vue是典型的MVVM框架不需要控制器处理数据,是双向绑定的,通过vm(调度者)实现。
想要实现模糊查询用到的是数组的方法filter();
eg:

	var aaa=['asv','dsad','www'];
			var ccc=aaa.filter(function(item){
			return item.indexOf('a')!=-1
			})
			console.log(ccc)//['asv','dsad']

所以我们在计算属性中也是用这样的方法

computed:{
			
find:function(){
			let that = this;
			if(this.search_content==''){ return this.example;}		
			return this.example.filter(function(item){
				return item.title.indexOf(that.search_content)!=-1
			//	return item.title.includes(that.search_content)
			})
		}
	},

search_content就是用v-model进行绑定的input框里面的值。
也可以使用es6中提供的方法includes,如果包括输入的数据,则返回。

代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>模糊查询</title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
	</head>
	<body>
	<div id="app">
		<div id="search">
			<!-- 查询 -->
			<input type="text" name="" id="find" placeholder="请输入搜索内容" v-model="search_content"/>
			<img src="../image/搜索.png">	
			<img src="../image/详情.png" :class="{'active':layout=='list'}" @click="layout='list'">
			<img src="../image/网格化.png" :class="layout=='grid'?'active':''" @click="layout='grid'">
			
		</div>	
		<div id="show">
			<div id="detail">
				<ul>
				<!-- 展示 -->
				<div class="flex" v-if="layout=='list'">
					<li v-for="item in find">
					{{item.title}}
					<div id="img">
						<img :src=item.img />	
					</div>
					</li>
				</div>
				</ul>
				<ul>
				<!-- 展示 -->
				<div class="flex2" v-if="layout=='grid'">
					<li v-for="item in example">
					<div id="img2">
						<img :src=item.img />	
					</div>
					</li>
				</div>
				</ul>
			</div>
			
		</div>
		
	</div>
	
	<script type="text/javascript">
		var vm = new Vue({
			el:"#app",
			data:{
				layout:'list',
				search_content:"",
				example:[
					{
						title:"vue学习",
						img:"../image/vue.png"
					},
					{
						title:"交换布局",
						img:"../image/布局.png"
					},
					{
						title:"模糊查询",
						img:"../image/搜索.png"
					},
					{
						title:"2020.7.11",
						img:"../image/学习.png"
					},
					{
						title:"搭好基础准备练习后台管理系统",
						img:"../image/加油站.png"
					},
				]
			},
		computed:{
			
			find:function(){
				// let that = this;
				if(this.search_content==''){ return this.example;}
				
				// return this.example.filter(function(item){
				// 	//return item.title.indexOf(that.search_content)!=-1
				// 	return item.title.includes(that.search_content)
				// })
				
				return this.example.filter(item=>{
					//return item.title.indexOf(that.search_content)!=-1
					return item.title.includes(this.search_content)
				})
			}
		},
	
		
		})
	</script>
	</body>
	<style type="text/css">
		.active {
			background-color: #764BA2;
		}
		
		#app {
		position:absolute;
		left: 300px;
			
		}
		#show {	
			width: 900px;
			background-color: #2980B9;
		
		}


		.flex li {
			background-color: #30CFD0;
			text-align: center;
			margin: 12px;
			width: 270px;
			float: left;
		}
		.flex2 li {
			background-color: #30CFD0;
			text-align: center;
			margin: 10px;
			width: 420px;
			float: left;
		}
		.flex2 #img2 img{
			width: 400px;
			height: 400px;
		}
		* {
			margin: 0rem;
			padding: 0rem;
			list-style: none;
			
		}
		#search {
			margin-top: 30px;
			width: 900px;
			height: 100px;
			background-color: #2980B9;
			text-align: center;
			box-sizing: border-box;
		}
		#search img {
			vertical-align: middle;
			width: 20px;
			height: 20px;
		}
		#search input {
			margin-top: 28px;
			width: 350px;
			height: 40px;
		}
		
	</style>
</html>

猜你喜欢

转载自blog.csdn.net/qq_42285889/article/details/107288320