一、条件渲染
1.v-if
(1)在<template>元素上使用v-if条件渲染分组
当想切换多个元素的时候,可以把一个<template>元素当做不可见的包裹元素,在上面使用v-if,最终渲染结果不包括<template>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<template v-if="ok">
<h1>Hello</h1>
<h2>World</h2>
</template>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
ok: true
}
})
</script>
</body>
</html>
渲染结果如下:
(2)v-else
v-else必须紧跟在带v-if或者v-else-if的元素后面,否则将不会被识别
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<div v-if="ok">
Now you can
</div>
<div v-else>
Now you can not
</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
ok: true
}
})
</script>
</body>
</html>
(3)v-else-if
v-else-if必须紧跟在v-if或者v-else-if的元素之后
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<div v-if="name === 'yj'">
My name is yangjiao
</div>
<div v-else-if="name === 'lp'">
My name is lupeng
</div>
<div v-else-if="name === 'lz'">
My name is lize
</div>
<div v-else>
Not Name
</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
name: 'yj'
}
})
</script>
</body>
</html>
(4)用key管理可复用的元素
Vue通常会复用已有元素而不是从头开始渲染
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<template v-if="loginType === 'username'">
<label>Username</label>
<input type="text" placeholder="Enter your username" key="username-input">
</template>
<template v-else>
<label>Email</label>
<input type="text" placeholder="Enter your email" key="email-input">
</template>
<button type="button" v-on:click="toggleLogin()">
转换登录方式
</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
loginType: 'username'
},
methods: {
toggleLogin: function () {
if(this.loginType === 'username'){
this.loginType = 'email'
} else{
this.loginType = 'username'
}
}
}
})
</script>
</body>
</html>
2.v-show
- 作用:根据条件展示元素
- 带有v-show的元素始终会被渲染并保留在DOM中
- v-show指令只是简单的切换元素的CSS属性的display
- PS:v-show不支持<template>和v-else
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<h1 v-show="ok">
Hello
</h1>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
ok: true
}
})
</script>
</body>
</html>
3.v-if vs v-show
(1)v-if
- 确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建~~~~~不懂
- 惰性,即只有条件为真的时候才会渲染条件块
- 更高的切换开销
- 如果运行时条件很少改变,则使用
(2)v-show
- 不管初始条件是什么,元素总是会被渲染,简单的基于css进行切换
- 更高的初始渲染开销
- 如果需要非常频繁的切换,则使用
4.v-if与v-for一起使用
v-for的优先级高于v-if
二、列表渲染
1.用v-for把一个数组对应为一组元素
在v-for块中,拥有对父作用域属性的完全访问权限
(1) item in items或者item of items
items代表数组
item代表数组里面的元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="item in items">
{{ item.name }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{name: 'yangjiao'},
{name: 'lp'}
]
}
})
</script>
</body>
</html>
(2) (item, index) in items或者(item, index) of items
items代表数组
item代表数组里面的元素
index代表数组里面的元素的索引
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item, index) in items">
{{ index }} - {{ item.name }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{name: 'yangjiao'},
{name: 'lp'}
]
}
})
</script>
</body>
</html>
2.一个对象的v-for
通过一个对象的属性来迭代
(1) value in object
value代表对象的键值
object代表对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="value in object">
{{ value }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
object: {
Name: 'yangjiao',
age: 24
}
}
})
</script>
</body>
</html>
(2) (value, key) in object
value代表对象的键值
key代表对象的键名
object代表对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(value, key) in object">
{{ key }} : {{ value }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
object: {
Name: 'yangjiao',
age: 24
}
}
})
</script>
</body>
</html>
(3) (value, key, index) in object
value代表对象的键值
key代表对象的键名
index代表对象中键的索引
object代表对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(value, key, index) in object">
{{ index }} - {{ key }} : {{ value }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
object: {
Name: 'yangjiao',
age: 24
}
}
})
</script>
</body>
</html>
3.key~~~~~~~~~~~~~~~~~~~~~~~~不太懂
唯一的key值:给Vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素 用v-bind绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item, index) in items" v-bind:key="item.id">
{{ index }} - {{ item.name }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{id: 'yj', name: 'yangjiao'},
{id: 'lp', name: 'lupeng'}
]
}
})
</script>
</body>
</html>
4.数组更新检测
(1)变异方法----改变原数组,对数组进行一些操作
- push()~~~压入栈 先进后出
- pop()~~~弹出栈
- shift()~~~删除队列元素 后进先出
- unshift()~~~加入队列元素
- splice()~~~截取数组
- sort()~~~排序
- reverse()~~~倒序
(2)替换数组----不会改变原数组,总是返回一个新数组
- filter()~~~过滤
- concat()~~~连接两个数组
- slice()~~~截取
(3)注意事项~~~~~~~~~~~~~~~~~~~略略略
5.对象更改检测注意事项
对于已经创建的实例,向嵌套对象添加响应式属性
(1)使用Vue.set(object, key, value)向嵌套对象添加响应式属性
(2)使用vm.$set(object, key, value)向嵌套对象添加响应式属性
(3)为已有对象赋予多个新属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<h1>
{{ users.name }}
</h1>
<h2>
{{ users.age }}
</h2>
<h3>
{{ users.gender }}
</h3>
<h2>
{{ users.love }}
</h2>
<h3>
{{ users.friend }}
</h3>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
users: {
name: 'yangjiao'
}
}
});
// 使用Vue.set(object, key, value)向嵌套对象添加响应式属性
Vue.set(vm.users, 'age', 24);
// 使用vm.$set(object, key, value)向嵌套对象添加响应式属性
vm.$set(vm.users, 'gender', '女');
// 为已有对象赋予多个新属性
vm.users = Object.assign({}, this.users, {
love: 'lp',
friend: 'lz'
})
</script>
</body>
</html>
6.显示过滤/排序结果
(1)使用计算属性
显示一个数组的过滤或排序副本,而不实际改变或重置原始数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="n in Num">
{{ n }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
numbers: [1,2,3,4,5,6]
},
computed: {
Num: function () {
return this.numbers.filter(function (number) {
return number % 2 === 0
})
}
}
});
</script>
</body>
</html>
(2)使用methods方法
不适用计算属性的时候
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="n in Num(numbers)">
{{ n }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
numbers: [1,2,3,4,5,6]
},
methods: {
Num: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0
})
}
}
});
</script>
</body>
</html>
7.一段取值范围的v-for
取整数:重复多次模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="n in 10">
{{ n }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app'
});
</script>
</body>
</html>
8.v-for on a <template>
渲染多个元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<template v-for="(item, index) in items">
<li>
{{ item.msg }}
</li>
<li class="divider">
---------------
</li>
<li>
{{ index }}
</li>
</template>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{msg: 'YJ'},
{msg: 'LP'}
]
}
});
</script>
</body>
</html>
9.v-for with v-if
(1)处在同一级别的时候,v-for的优先级高于v-if
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item, index) in items" v-if="index > 1">
{{ item.msg }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{msg: 'YJ'},
{msg: 'LP'},
{msg: 'Hello'},
{msg: 'World'}
]
}
});
</script>
</body>
</html>
(2)v-if在v-for外边,有条件的跳过循环的执行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../vue/vue.js"></script>
</head>
<body>
<div id="app">
<ul v-if="items.length<0">
<li v-for="item in items" >
{{ item.msg }}
</li>
</ul>
<p v-else>
NONONO
</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{msg: 'YJ'},
{msg: 'LP'},
{msg: 'Hello'},
{msg: 'World'}
]
}
});
</script>
</body>
</html>