5.1 基本指令
5.1.1 v-cloak(遮掩) 一般与display:none进行结合使用
作用:解决初始化慢导致页面闪动的最佳实践
//css中 设置 [v-cloak] display:none ------------------------------
<style>
[v-cloak] {
display: none;
}
</style>
//html中 ------------------------------
<div id="app">
<p v-cloak> {{msg}} </p>
</div>
//vue中 ------------------------------
<script>
var app = new Vue({
el: '#app',
data: {
msg: '我是数据'
}
})
</script>
5.1.2 v-once
定义它的元素和组件只渲染一次
//html中 ------------------------------
<div id="app">
<p v-once> {{msg}} </p>
</div>
//vue中 ------------------------------
<script>
var app = new Vue({
el: '#app',
data: {
msg: '我是数据'
}
})
</script>
5.2 条件渲染指令
5.2.1 v-if, v-eles-if ,v-else
用法: 如果三个全用的话,就必须按照上面顺序
<div id="app">
<p v-if="6<3">{{apple}}</p>
<p v-else-if="19<10">{{orange}}</p>
<p v-else>{{banana}}</p>
</div>
--------------------------------
var app = new Vue({
el: '#app',
data: {
apple: '我是苹果',
orange: '我是橘子',
banana: '我是香蕉'
}
})
v-if的弊端 :
Vue 在渲染元素时 ,出于效率考虑,会尽可能地复用已有的元素而非重新渲染, 因此会出现乌龙只会渲染变化的元素。
如:
//这里的弊端,input元素被复用
<div id="app">
<div v-if="type === 'name'">
用户名: <input type="text" placeholder="请输入用户名 ">
</div>
<div v-else>
密码: <input type="text" placeholder="请输入密码">
</div>
<button @click="trg">点击切换</button>
</div>
-------------------------------------------------------
var app = new Vue({
el: '#app',
data: {
type: 'name'
},
methods: {
trg: function(){
this.type = (this.type==='name' ? 'password' : 'name')
}
}
})
解决方法:加key
,提供key
唯一的值可以来决定是否复用该元素
如:
// 加入了key,key的值可以随便定义
// 如果两个不相等,那么就是唯一的,如果相等,那么代表可以复用
<div id="app">
<div v-if="type === 'name'" key="name">
用户名: <input type="text" placeholder="请输入用户名 ">
</div>
<div v-else key="password">
密码: <input type="text" placeholder="请输入密码">
</div>
<button @click="trg">点击切换</button>
</div>
-------------------------------------------------------
var app = new Vue({
el: '#app',
data: {
type: 'name'
},
methods: {
trg: function(){
this.type = (this.type==='name' ? 'password' : 'name')
}
}
})
5.2.2 v-show
只改变了css属性display
v-if 和 v-show 的比较
-
v-if
:
实时渲染:页面显示就渲染,不显示。我就给你移除 -
v-show
:
v-show的元素永远存在也页面中,只是改变了css的display的属性
代码举例:
// 在html中------------------------------------
<div id="app">
<p v-show> {{msg}} </p>
</div>
//相等于 下面代码
<div id="app">
<p style="display: none"> {{msg}} </p>
</div>
//------------------------------------------------------------------------
var app = new Vue({
el: '#app',
data: {
msg: '我是组件数据'
}
})
5.3 列表渲染指令v-for
用法: 当需要将一个数组遍历或枚举一个对象属性的时候循环显示时,就会用到列表渲染指令 v-for。
一定是写在遍历的元素上,v-for后面接等号,内容为 '申明一变量' in 'data中要遍历的一个数组'
两种使用场景:
- 遍历多个对象,那么一定是数组
<div id="app">
<ul>
<li v-for="value in arrData"> {{value.name}} </li>
</ul>
</div>
-----------------------------------------------------------
var app = new Vue({
el: '#app',
data: {
arrData: [
{name: '我是1号'},
{name: '我是2号'},
{name: '我是3号'},
]
}
})
---------------------------------------------------------------------------------
// 带索引的写法: 用括号,里面有两个变量,第一个为item,第二个为index
<ul>
<li v-for="(value,index) in vueData"> {{index}} ---- {{value.name}} </li>
</ul>
- 遍历一个对象的多个属性
<div id="app">
<ul>
<li v-for="value in objData"> {{value}} </li>
</ul>
</div>
-----------------------------------------------------------
var app = new Vue({
el: '#app',
data: {
objData:{
apple: '我是苹果',
orange: '我是橘子',
banana: '我是香蕉'
}
}
})
---------------------------------------------------------------------------------
// 带索引的写法: 用括号,里面有三个变量,第一个为item,第二个为key,第三个为index
<ul>
<li v-for="(value,key,index) in vueData"> {{index}} :{{key}}---{{value.name}} </li>
</ul>
5.4 数组更新,过滤与排序
改变数组的一系列方法:
- push() 在末尾添加元素
- pop() 将数组的最后一个元素移除
- shift() 删除数组的第一个元素
- unshift() 在数组的第一个元素位置添加一个元素
-
splice() 可以添加或者删除函数—返回删除的元素
三个参数:
第一个参数 表示开始操作的位置
第二个参数表示:要操作的长度
第三个为可选参数: - sort() 排序
- reverse() 倒序
- filter() 过滤
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="app">
<div v-for="value in arrData"> {{value}} </div>
<hr>
排序用法: sort()
<button @click="sortData">点我排序</button>
<hr>
倒序的用法: reverse()
<button @click="revData">点我倒序 </button>
<hr>
过滤的用法: filter() 需要用到计算属性 computed
{{filData}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
arrData: ['3331','123','666666','22555']
},
methods: {
sortData: function(){
this.arrData.sort(function(val1,val2){
return val1.length - val2.length
})
},
revData: function(){
this.arrData.reverse()
}
},
computed: {
filData: function(){
return this.arrData.filter(function(val){
return val.match(/22/)
})
}
}
})
</script>
</body>
</html>
两个数组变动vue检测不到:
- 改变数组的指定项
- 改变数组长度
解决方法:
1.set 改变指定项: Vue.set(app.arr,1,”car”);
2.splice 改变数组长度: app.arr.splice(1)
5.5 方法和事件
[object MouseEvent]
5.4.1 基本用法
v-on绑定的事件类似于原生 的onclick等写法
<div id="app">
点击基数:{{count}}
<button @click="oneNum()">点我加1</button>
<button @click="oneNum(10)">点我加10</button>
</div>
------------------------------------------------------------------------------
var app = new Vue({
el: '#app',
data: {
count: 100
},
methods: {
oneNum: function(val){
val = val || 1
this.count = this.count + val
}
}
})
如果方法中带有参数,但是没有加括号,默认传原生事件对象event
5.4.2 修饰符
在vue中传入event对象用 $event
向上冒泡
- stop 阻止单击事件向上冒泡
- prevent 提交事件并且不重载页面
- self 只是作用在元素本身而非子元素的时候调用
- once 只执行一次的方法
可以监听键盘事件:
<input @keyup.13 ="submitMe"> ——指定的keyCode
<div id="app">
stop: 阻止单击事件向上冒泡
<div @click="divClick" style="width: 100px; height: 100px; background-color: red;">
<button @click.stop="btnClick">点击</button>
</div>
<hr>
prevent: 提交事件并且不重载
<form action="" @submit.prevent="hangle">
<button type="submit">提交表单</button>
</form>
<hr>
self: 只是作用在元素本身而非子元素的时候调用
<div @click.self="divClick" style="width: 100px; height: 100px; background-color: red;">
<button @click="btnClick">点击</button>
</div>
<hr>
once: 只执行一次 <br>
<button @click="onceClick">执行无数次</button>
<button @click.once="onceClick">执行一次</button>
<hr>
监听键盘事件:
<br>
<input type="text" @keyup.13="submitMe"> <!--其中13 代表 Enter键-->
<input type="text" @keyup.enter="submitMe">
</div>
----------------------------------------------------------------------
var app = new Vue({
el: '#app',
methods: {
divClick: function(){
alert('div被点击了')
},
btnClick: function(){
alert('botton被点击了')
},
hangle: function(){
alert('我不重载了')
},
onceClick: function(){
alert('开始执行了')
},
submitMe: function(){
alert('你按下了Enter')
}
}
})