2.Vue指令

为什么使用Vue指令?

  • 就是要实现JS与HTML的分离
  • HTML的结构应该定义在HTML文件中,而不是散落在JS代码中
  • JS代码仅仅是通过Model去控制View,而不是定义View。

一、条件渲染指令

v-if指令条件渲染指令
它根据表达式的true/false来删除或添加元素
语法:
v-if="expression’
expression 是一个返回bool值:

  • true:显示
  • false:元素删除转换为注释
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
	<!-- 引入vue.js -->	
	<script src="js/vue.js"></script>	
	
	
	</head>
	<body>
		
		<div id = "app">
			<input type="button" value="显示" @click="show" />
			<p v-if="showP">能够被控制显示还是不显示的p标签</p>
			<p v-if="num1">如果{{num1}}是0不显示</p>
		    <p v-if="num2">如果{{num2}}是1显示</p>
		    <p v-if="num2 > 15">如果{{num2}} > 15显示</p>
			<p v-if="num2 > 3">如果{{num2}} > 3显示</p>
			<p v-if="str1"> 如果' {{str1}}' 是空字符串不显示</p>
			<p v-if="str2"> 如果'{{str2}}'是空字符串不显示</p>
			<p v-if="str2. indexof('c') > 0">8.含有有c,显示</p>
			<p v-if="nan"> NaN</p>
			<p v-if="obj1">null</p>
			<p v-if="obj2" >undefined</p>
		</div>
		   






	<script type="text/javascript">
		//model
		var m = {
			showP:false,
			num1:0,
			num2:1,
			str1:'',
			str2:'abc',
			nan:NaN,
			obj1:null,
			obj2:undefined
			
		}
		
		//viewmodel
		var vm = new Vue({
			el:'#app',
			data:m,
			methods: {
				show:function(){
					this.showP = true;
					
				}
			}
		});	
	</script>
	</body>
</html>

v-show指令条件渲染指令
它根据表达式的true/false来显示或隐藏元素
语法:
v-show=“expression”
和v-if指令不同的,使用v-show指令元素始终会在DOM上,通过修改style属性的显示与隐藏

  • true: display:block
  • false: display:none

v-else指令条件渲染指令
指令必须跟一个v-if或v-show元素后否则不能够被识别

二、列表渲染指令

v-for列表渲染指令

  1. v-for可以用来渲染数组
  2. v-for可以用来渲染JSON
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>	
	<!-- 引入vue.js -->	
	<script src="js/vue.js"></script>	
	</head>
	<body>	
		<div id = "app">
		<!-- 	<ul>
				<li>{{array[0]}}</li>
				<li>{{array[1]}}</li>
				<li>{{array[2]}}</li>
				<li>{{array[3]}}</li>
			</ul> -->	
			<ul>
				<!-- 一般的循环 -->
				<li v-for="val in array">{{val}}</li>
				<!-- 有下标的数组 -->
				<li v-for="(val,index) in array">{{index}},{{val}}</li>
				<!-- 带有key的循环json -->
				<li v-for="(val,key) in json">{{key}},{{val}}</li>
				<li v-for="(val,key,index) in json">{{key}},{{val}},{{index}}</li>
			</ul>	
		</div>	
        <script type="text/javascript">	 
		 var m = {
			 array:['beijing','shanghai','hangzhou','tianjin'],
			 json:{
				 first:'beijing',
				 second:'shanghai',
				 third:'tianjin',
				 fourth:'hangzhou'
			 }
		 } 
		 var vm = new Vue({
			 el:'#app',
			 data:m,
			 methods:{			 
			 }
		 });
     </script>
	</body>
</html>

三、表单与v-model

v-model:用于将控件与model双向绑定

input控件与model数据的双向绑定:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>	
	<!-- 引入vue.js -->	
	<script src="js/vue.js"></script>	
	</head>
	<body>	
		<div id = "app">
<!-- 		<input type="text" value="helloworld" /> -->
		<input type="text" v-model="theValue" />
		<p>{{theValue}}</p>
		</div>	
        <script type="text/javascript">	 
		 var m = {
			 theValue:'helloworld',
		 } 
		 var vm = new Vue({
			 el:'#app',
			 data:m,
			 methods:{			 
			 }
		 });
     </script>
	</body>
</html>

基于Bootstrap 3,实现一个输入用户名和留言的控件,用Vue指令实现响应命令。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>example</title>	
	<!-- 引入vue.js -->	
	<script src="js/vue.js"></script>	
	<link rel="stylesheet" href="bootstrap/dist/css/bootstrap.min.css" />
	<script src="jquery/dist/jquery.js"></script>
	<script src="bootstrap/dist/js/bootstrap.js"></script>
	</head>
	<body>	
		<div class="container">
			<div class="row">
				<div class="form-horizontal">
					<div class="form-group">
						<label for="username" class="col-sm-2 control-label">用户名:</label>
						<div class="col-sm-8">
							<input type="text" id="username"  class="form-control" v-model="username" />
						</div>
					</div>
					<div class="form-group">
						<label for="comment" class="col-sm-2 control-label">备注:</label>
						<div class="col-sm-8">
							<input type="text" id="comment"  class="form-control" v-model="comment"/>
						</div>
					</div>
					<div class="form-group">
						<div class="col-sm-8 text-center">
							<input type="button"  value="添加" class="btn btn-primary" @click="addUser" />
						    <input type="reset" value="取消" class="btn btn-danger" @click="cancleUser"/>
						</div>
					</div>
				</div>
			</div>
			<hr />
			<table class="table table-bordered table-hover">
				<thead>
				<th class="text-center">ID</th>
				<th class="text-center">用户名</th>
			    <th class="text-center">备注</th>
				<th class="text-center">操作</th>
				</thead>
				<tbody>
					<tr v-show="userList.length==0">
						<td colspan="4" class="text-center text-danger" >
							暂时没有数据
						</td>
					</tr>
					
					<tr class="text-center" v-for="(item,index) in userList">
						<td>{{index+1}}</td>
						<td>{{item.username}}</td>
						<td>{{item.comment}}</td>
						<td>
							<input type="butten" value="删除"  class="btn btn-danger btn-group-sm" @click="deleteUser(index)" />
						</td>
					</tr>
				</tbody>	
			</table>
		</div>	
		
	
		
        <script type="text/javascript">	 
		
		// 1.需要用户名,备注,缓存的数组。
		// 2. username, comment绑 定到input控件
		// 3.通过v-show来控制“暂时没有数据”的显示
		// 4.将usersList的内容用v- for循环显示
		// 5.点击添加按钮,可以将用户名,备注中的信息加入table
		//    5.1.点击添加按钮,把数据添加到usersList
		//       检验username是否是空字符串;
		//       把数据添加到usersList里; 
		//       成功的添加后,username和comment要设定为空。
		//     5.2. table根据usersList更新(这步不需要我们做什么,因为再步骤4已经实现了)
		// 6.删除,点击对应项的删除按钮,把对应数据从usersList, 然后table根据usersList更新
		//   6.1.删除
		//   删除操作数组splice;
		//   确认对话框
		//   6.2. table根据usersList更新(这步不需要我们做什么,因为再步骤4已经实现了)

		 var m = {
			 username:'',
			 comment:'',
			 userList:[]
			 
			 //为了对步骤四进行验证,缺省数据
			 /* userList:[
				 {
					 username:'lalala',
					 comment:'hahaah'
				 },
				 {
					 username:'hello',
					 comment:'world'
				 }
			 ] */
			 
		 } 
		 var vm = new Vue({
			 el:'.container',
			 data:m,
			 methods:{		
				 addUser:function(){
					 console.log(this.username,this.comment);
					 if(this.username!=''){
						 this.userList.push({
							 username:this.username,
							 comment:this.comment
						 })
					 }
					 this.username = '';
					 this.comment = '';	 
				 },
				 deleteUser(index){
					 
					 var t = confirm('确认删除?');
					 if(t){
						 this.userList.splice(index,1);
					 }		 
				 },
				 cancleUser(){
					 this.username = '';
					 this.comment = '';
					 }
		     }
		 });
     </script>
	</body>
</html>

四、v-bind指令:

v-bind后面连接一个HTML属性,用来控制元素的属性值
语法: v-bind:arguments=“expression’

  1. v-bind:src
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
	<body>
		
		<div id="app">
			
			<img v-bind:src="imgUrl" />
			<!-- 简写 -->
			<img :src="imgUrl" />
			
		</div>
		
		
		<script type="text/javascript">
			var m = {
				imgUrl:'image/OMGUVV51%5B125%25%7B8MG7D2%60AA.png',
			};
			
			
			var vm = new Vue({
				el:'#app',
				data:m,
				methods:{
					
				}
				
			});		
		</script>	
	</body>
</html>

  1. v-bind:class
  • 字符串
  • 数组
  • JSON
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		div.red{
			width: 500px;
			height: 500px;
			background-color: red;
		}
		div.hasBorder{
			border: 5px solid #000000;
		}
	</style>
	<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
	<body>
		
		<div id="app">
		     <input type= "button" value="添加边框" @click="func" />
		     <!--1. v-bind来控制class 字符串:麻烦以及原始,不推荐-->
			 <!-- <div :class="divclassStr"></div> -->
			 <!-- 2.v-bind来控制class 字符串数组 可用-->
			 <!-- <div :class="divclassArray"></div> -->
			 <!--3.v-bind来控制class JSON 可用  -->
			 <div :class="{red: isRed,hasBorder: hasBorder}"></div>
			 
		</div>
		
		
		<script type="text/javascript">
			var m = {
				divclassStr:'red',
				divclassArray:['red'],
				isRed:true,
				hasBorder:false
			};
			
			
			var vm = new Vue({
				el:'#app',
				data:m,
				methods:{
					//1.
					/* func(){
						if(this.divclassStr.indexOf('hasBorder') < 0){
							this.divclassStr = this.divclassStr + ' hasBorder';
						}
					} */
					
					//2.
					/* func(){
						if(this.divclassArray.indexOf('hasBorder') < 0){
							this.divclassArray.push('hasBorder');
						}
						
						} */
						
					//3.
					func(){
						this.hasBorder = true;
						
					}
				}
				
			});		
		</script>	
	</body>
</html>

  1. v-bind:style
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		div.red{
			width: 500px;
			height: 500px;
			background-color: red;
		}
		div.hasBorder{
			border: 5px solid #000000;
		}
	</style>
	<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
	<body>
		
		<div id="app">
		     <input type= "button" value="添加边框" @click="func" />

			 <!-- 1. v-bind来控制style 字符串 不推荐-->
			<!-- <div class="red" :style="borderstyleStr"></div> -->
			 <!-- 2.. v-bind来控制style JSON 可用-->
			 <div class="red" :style="{borderWidth: borderWidthStr,borderStyle: borderStyleStr,borderColor: borderColorStr}"></div>
			 
			 
		</div>
		
		
		<script type="text/javascript">
			var m = {
				//1.
				borderstyleStr: '',
				borderWidthStr: '',
				borderColorStr: '',
				borderStyleStr: ''
			};
			
			
			var vm = new Vue({
				el:'#app',
				data:m,
				methods:{
					//1.
					/* func(){
						this.borderstyleStr = 'border: 5px solid #000';	
					} */
					//2.
					func(){
						this.borderWidthStr = '5px';
						this.borderStyleStr = 'solid';
						this.borderColorStr = '#000';
					}
				}
				
			});		
		</script>	
	</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值