5.1 基本指令
v-clock不需要表达式,它会在Vue实例结束编译时从绑定的HTMl元素上移除,经常和CSS的display:node;配合使用。
在一般情况下,v-clock是一个解决初始化man导致页面闪动的最佳实践,对于简单的项目很实用,但是在具有工程化的项目里,项目的HTML结构只有一个空的div元素,剩余的内容都是由路由去挂载不同组件完成的,所以不再需要v-cloak。
v-once 也是一个不需要表达式的指令,作用是定义它的元素或组件只能被渲染一次,包括元素或组件的所有子节点。首次渲染后,不再随数据的变化重新渲染,将被视为静态内容。例如

 <body>
    	  
        <div id="app">
      
           <span v-once>{{message}}</span>
           <div v-once>
           	<span>{{message}}</span>
           </div>
        </div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <script>
          var app=new Vue({
          	el:'#app',
          	data:{
          		message:'这是一段文本'
          	}
          })
        </script>
    </body>

5.2 条件渲染指令

5.2.1 v-if、v-else-if、v-else
与JavaScript的条件语句相似,Vue.js的条件指令可以根据表达式的值在DOM中渲染或销毁元素/组件,例如:

<body>
    	  
        <div id="app">
      <p v-if="status===1">当status为1时显示该行</p>
      <p v-else-if="status===2">当status为2时显示该行</p>
      <p v-else>否则显示该行</p>
        </div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <script>
          var app=new Vue({
          	el:'#app',
          	data:{
          	status:1
          	}
          })
        </script>
    </body>

v-else-if 要紧跟v-if,v-else要紧跟v-else-if或v-if,当前元素、组件以及所有子节点将被渲染,为假时将被移除。如果一次判断的是多个元素,可以在Vue.js内置的元素上使用条件指令,最终渲染的结果不会该元素。

5.2.3 v-show
v-show的用法与v-if基本上一致,只不过v-show是改变元素的CSS属性display。当v-show的表达式的值为false时,元素会隐藏。
例如:

<body>
    	  
        <div id="app">
   <p v-show="status===1">显示</p>
      
        </div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <script>
          var app=new Vue({
          	el:'#app',
          	data:{
          	status:2
          	
          	}
          })
        </script>
    </body>

查看DOM结构会看到元素上加载了内联样式display:none;

<p style="display: none;">显示</p>

5.2.3 v-if 与v-show的选择
v-if和v-show有同样的功能,不过v-if才是真正的条件渲染,它会根据表达式适当的销毁或重建元素以及绑定的事件或子组件,若表达式初始值为false,则一开始元素、组件并不会渲染,只有当条件第一次变为真时才开始编译。
而v-show只是简单的css属性切换,无论条件真与否,都会被编译,相比之下,v-if更适合条件不经常改变的场景,因为它切换开销相对较大,而v-show适用于频繁切换条件。

5.3 列表渲染指令v-for

当需要将一个数组遍历或枚举一个对象循环显示的时候,就会用到列表渲染指令v-for。它的表达式需要结合in来使用,类似item in items的形式。

 <body>
    	  
       <div id="app">
			<ul>
				<li v-for="book in books" >{{book.name}}</li>
			</ul>
			
		</div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
	new Vue({
		el: '#app',
		data: {
		books: [
		{name:'《Vue.js实战》'},
		{name:'《Java实战》'},
		{name:'《C#实战》'},
		]
		}
	})
</script>
    </body>

在表达式中,books是数据,book是当前数组元素的别名,循环出的每个列表内的元素都可以访问到对应的当前book。列表渲染也支持of来代替in作为分隔符,它更接近JavaScript迭代器的语法:

<li v-for="book of books" >{{book.name}}</li>

v-for的表达式支持一个可选参数作为当前项的索引,也可以用在内置标签<**template>**上,将多个元素进行渲染。除了数组外,对象的属性也是可以遍历的,遍历对象属性的时候,有两个可选参数,分别是键名和索引

<ul>
				<li v-for="(value,key,index) in user">
					{{index}-{{key}}:{value}}					
				</li>
				
			</ul>

v-for还可以迭代整数

   <body>
   <div id="app">
   	<span v-for="n in 10">{{n}}</span>
   	</div>
   	 <script src="https://unpkg.com/vue/dist/vue.js"></script>
   	<script>
   		var app=new Vue({
   			el:'#app'
   		}) 		
   	</script>
    </body>

5.3.2 数组更新
Vue的核心是数据与视图的双向绑定,当我们修改数组的时候,Vue会检测到数据变化,所以v-for渲染的视图会立即更新。Vue包含了一组观察数组变异的方法,使用它们改变数组也会触发视图更新。

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • resverse()

使用以上方法会改变这些方法调用的原始数组,有些方法不会改变原数组,而是生成一个新的数组.
filter(),concat(),slice(),在使用这些非变异方法的时候,可以用新数组来替换原数组。

Vue在检测到数组变化时,并不是直接重新渲染真个列表,而是最大化的复用DOM元素,替换的数组中,含有相同元素的项不会被重新渲染,因此可以大胆地用新数组来替换旧数组,不用担心性能问题。
需要注意的是,以下变动的数组中,Vue是检测不到的,也不会触发视图更新。

  • 通过索引直接设置项,比如app.books[3]={…}
  • 修改数组长度,比如app.length=1.

5.3.3 过滤与排序

  • 过滤器就是可以对我们的数据进行添油加醋然后再显示
  • 过滤器有全局过滤器和组件内的过滤器
    • 全局过滤器Vue.filter(‘过滤器名’,过滤方式fn );
    • 组件内的过滤器 filters:{ ‘过滤器名’,过滤方式fn }
    • {{ msg | 过滤器名}}
  • 最终都是在过滤方式fn里面return产出最终你需要的数据

vue中的this是vue封装好给我们使用的,跟平常方法里面的this是不同的
注意:过滤器中方法的引号不能省略。

<!DOCTYPE html>
<html>
<head>
	<title>过滤器</title>
</head>
<body>
		<div id="app">
			我输入的:<input type="text" name="" v-model='instring'></br>
			我输出的:{{ instring }}</br>
			{{ instring | reversal('翻转输出:')}}
		</div>

		<script type="text/javascript" src="vue.js"></script>
		<script type="text/javascript">

			console.log(this)
			Vue.filter('reversal',function(val,arg2){
				return  arg2+val.split('').reverse().join('')
			})
			new Vue({
				el:'#app',
				data(){
					return {
						instring:''
					}
				},
				created(){
					console.log(this,'vue的')
				}
				// filters:{
				// 	reversal(val,arg2){   对应上文中的	{{ instring | reversal('翻转输出:')}}
				// 		//          字符串转数组  翻转    数组转字符串
				// 		return  arg2+val.split('').reverse().join('')
				// 	}
				// }
			})
		</script>
</body>
</html>

当你不想改变原数组,想通过一个数组的副本来做过滤或排序的显示时,可以使用计算属性来返回过滤或排序后的数组。
例如

<body>
		<div id="app">
			<ul>
				<template v-for="book in filterBooks">
					<li>书名:{{book.name}}</li>
					<li>作者:{{book.author}}</li>
				 </template>
			</ul>		
		</div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
	new Vue({
		el: '#app',
		data: {
		books: [
		{
			name:'《Vue.js实战》',
			author:'尤雨溪'
		
		},
		{
			name:'《Java实战》',
			author:'许致远'
		},
		{
			name:'《C#实战》',
			author:'许晨'
			}
		]
		},
		computed:{
			filterBooks:function(){
				return this.books.filter(function(book){
				return book.name.match(/Java/);	
				});
				
			}
		}
	})
</script>
	</body>

在Vue.js 2.x中废弃了1.x中内置的limitBy、filterBy和orderBy过滤器,统一使用计算属性来实现。

5.4 方法与事件

5.4.1 基本用法
我们已经引入了Vue事件处理的概念V-on,在事件绑定上,类似原生的JavaScript的OnClick写法,也是在HTML上进行监听的。例如,我们写监听一个按钮的点击事件,设置一个计数器,每次都加1:

<body>
		<div id="app">
			点击次数:{{counter}}
			<button @click="counter++">+1</button>
		</div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
	new Vue({
		el: '#app',
		data: {
			counter:0
		}
	})
</script>
	</body>

@click的表达式可以直接使用JavaScript语句,也可以是一个在Vue实例中methods选项内的函数名字,比如对上例进行扩展,再增加一个按钮,点击一次,计数器加10;

<body>
		<div id="app">
			点击次数:{{counter}}
			<button @click="handleAdd()">+1</button>
			<button @click="handleAdd(10)">+10</button>

		</div>
 <script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
	new Vue({
		el: '#app',
		data: {
			counter:0
		},
		methods:{
			handleAdd:function(count){
				count=count||1;
				this.counter+=count;
				
			}
		}
	})
</script>
	</body>

这种在HTML元素上监听事件的设计看似将DOM与JavaScript紧耦合,违背分离的原理,实则正好相反,因为通过HTML就能知道调用的是那个方法,将逻辑与DOM解耦,便于维护。最重要的是,当ViewModel销毁时,所有的事件处理器会自动删除,无需自己清理。
Vue提供了一个特殊变量$event,用于访问原生DOM事件。
5.4.2 修饰符
Vue支持以下修饰符

  • stop
  • prevent
  • capture
  • self
  • once

在表单元素上监听键盘事件时,还可以使用键盘修饰符,比如调用某个键时才调用某个方法。

Logo

前往低代码交流专区

更多推荐