Vue.js笔记-条件渲染 列表渲染
条件渲染v-ifdiv id="demo">div v-if="abc">{{abc.a}}div> //该值为true时显示该标签,为false则不显示div>var vm = new Vue({el:'#demo',data:{abc:{a:"1"} }})script>if...else结构h1
·
条件渲染
v-if
<div id="demo">
<div v-if="abc">{{abc.a}}</div> //该值为true时显示该标签,为false则不显示
</div>
<script>
var vm = new Vue({
el:'#demo',
data:{
abc:{
- a:"1"
}
}
})
</script>
if...else结构
<h1 v-if="ok">Yes</h1>
<h1 v-else>No</h1>
if...else if...else结构,
if-else用嵌入的方式放进去
<div v-if=""></div>
<template v-else>
<div v-if=""></div>
<div v-else></div>
</template>
v-else 元素必须立即跟在 v-if 或 v-show 元素的后面——否则它不能被识别。
template v-if
如果想切换多个元素,可以把一个<template>元素当作包装元素,并在上面使用v-if,最终的渲染结果不会包含它。
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
v-show
不同的是有 v-show 的元素会始终渲染并保持在 DOM 中。v-show 是简单的切换元素的 CSS 属性 display。
注意 v-show 不支持 <template> 语法。
<h1 v-show="ok">Hello!</h1>
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——在条件第一次变为真时才开始局部编译(编译会被缓存起来)。
相比之下,v-show 简单得多——元素始终被编译并保留,只是简单地基于 CSS 切换。
一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好。
列表渲染
v-for
基于一个数组渲染一个列表。
语法:item in items(数组元素的别名 in 数据数组)
<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
var example1 = new Vue({
el: '#example-1',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
在 v-for 块内我们能完全访问父组件作用域内的属性,另有一个特殊变量 $index,是当前数组元素的索引。
另外,可以为索引指定一个别名(如果 v-for 用于一个对象,则可以为对象的键指定一个别名):
<div v-for="(index, item) in items">
{{ index }} {{ item.message }}
</div>
从 1.0.17 开始可以使用 of 分隔符,更接近 JavaScript 遍历器语法:
<div v-for="item of items"></div>
template v-for
渲染一个包含多个元素的块,
需要将多个标签都用v-for遍历,那么就需要用template标签。
同样,template在实际渲染的时候不会出现,只是起到一个包裹作用。
<div id="app">
<ul>
<template v-for="i in items">
<li>Index is {{$index}}</li>
<li>Content is {{i}}</li>
</template>
</ul>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
items: {
a: "1",
b: "2",
c: "3"
}
}
})
</script>
渲染为:
<ul>
<li>Index is 0</li><li>Content is 1</li>
<li>Index is 1</li><li>Content is 2</li>
<li>Index is 2</li><li>Content is 3</li>
</ul>
数组变动检测
变异方法(修改了原始数组):
vue.js包装了被观察数组的变异方法,故它们能出发视图更新,即当利用这些方法变更数组时,被渲染的内容会实时更新,被包装的方法有:
- push() 数组末尾添加
- pop() 数组末尾取出
- shift() 数组开头取出
- unshift() 数组开头添加
- splice() 删除并插入
- sort() 排序
- reverse() 数组顺序颠倒
<ul id="demo">
<li v-for = "item in items">
{{item}}
</li>
</ul>
<script>
var vm = new Vue({
el:'#demo',
data:function(){
return {items:[4,2,3].splice(0,2)};
}
})
</script>
替换数组(返回一个新数组):
数组从一个数组变为另一个数组时(记得,数组是按引用传递的),数据绑定依然生效;
但前提是使用以下方法:
filter() 过滤,参数是一个函数,取其返回值为true的元素被添加到新数组
concat() 合并两个数组,返回的数组是合并后的
slice() 返回数组的拷贝,从开始索引到结束索引(前含后不含)
track-by:
有时需要用全新对象(例如通过 API 调用创建的对象)替换数组。因为
v-for 默认通过数据对象的特征来决定对已有作用域和 DOM 元素的复用程度,这可能导致重新渲染整个列表。但是,如果每个对象都有一个唯一 ID 的属性,便可以
使用 track-by 特性给 Vue.js 一个提示,Vue.js 因而能
尽可能地复用已有实例。
例如,假定数据为:
{
items: [
{ _uid: '88f869d', ... },
{ _uid: '7496c10', ... }
]
}
然后可以这样给出提示:
<div v-for="item in items" track-by="_uid">
<!-- content -->
</div>
然后在替换数组 items 时,如果 Vue.js 遇到一个包含 _uid: '88f869d' 的新对象,它知道它可以复用这个已有对象的作用域与 DOM 元素。
track-by $index
如果没有唯一的键供追踪,可以使用 track-by="$index",它强制让 v-for 进入原位更新模式:片断不会被移动,而是
简单地以对应索引的新值刷新。这种模式也能处理数据数组中重复的值。
这让数据替换非常高效,但是也会付出一定的代价。因为这时
DOM 节点不再映射数组元素顺序的改变,不能同步临时状态(比如 <input> 元素的值)以及组件的私有状态。因此,如果 v-for 块包含 <input> 元素或子组件,要小心使用 track-by="$index"。
问题:
vue.js不能检测到下面数组变化:
- 直接用索引设置元素,如 vm.items[0] = {}
解决方案,$set()方法,demo.items.$set( 0 , {childMsg:'changed!
'} )
- 修改数据的长度,如 vm.items.length = 0
解决方案:只需要用一个空数组替换items
从目标数组中查找并删除元素,在内部调用splice(),this.items.$remove(item)
<ul id="demo">
<li v-for = "item in items">
{{item.name}}
</li>
</ul>
<button onclick = "change()">移除</button>
<script>
var test = {name:'d'}
var vm = new Vue({
el:'#demo',
data:{
items:[
{name:'a'},
{name:'b'},
{name:'c'}
]
},
})
vm.items.push(test);
function change(){
vm.items.$remove(test);
}
</script>
对象v-for
作用域内还可以访问另一个特殊变量$key
<ul id="repeat-object" class="demo">
<li v-for="value in object">
{{ $key }} : {{ value }}
</li>
</ul>
new Vue({
el: '#repeat-object',
data: {
object: {
FirstName: 'John',
LastName: 'Doe',
Age: 30
}
}
})
也可以给对象的键提供一个别名:
<div v-for="(key, val) in object">
{{ key }} {{ val }}
</div>
值域v-for
v-for 也可以接收一个整数,此时它将重复模板数次。
<div>
<span v-for="n in 10">{{ n }} </span>
</div>
结果为:
更多推荐
已为社区贡献9条内容
所有评论(0)