文章目录
- 前言 : 基本使用
- 逐步优雅步骤
- 1. 始终在v-for循环中使用key
- 2. 在一定范围内使用v-for循环
- 3. 避免在循环中使用v-if
- 4. 使用computed属性或方法
- 5. 或者在循环外包一层元素
- 6. 访问循环中的索引
- 7. 迭代对象
前言 : 基本使用
在Vue中,基本上每个项目都会用到v-for循环。它们允许你在模板代码中编写for循环。
这在碰到诸如以下情况时特别好用:
<ul>
<li v-for='product in products'>
{{ product.name }}
</li>
</ul>
逐步优雅步骤
1. 始终在v-for循环中使用key
首先,我们讨论的是大多数Vue开发人员已经知道的常见最佳实践——在v-for循环中使用:key。
通过设置唯一的键属性,可以确保组件按期望的方式工作。
如果我们不使用:key,Vue将使DOM尽可能高效。这可能会导致v-for元素出现乱序或其他不可预测的行为。
如果我们对每个元素都有唯一的键引用,那么就可以更好地预测如何操纵DOM。
<ul>
<li
v-for='product in products'
:key='product._id'
>
{{ product.name }}
</li>
</ul>
2. 在一定范围内使用v-for循环
虽然大多数时候v-for用于循环数组或对象,但也有我们只想迭代特定次数的情况。
例如,假设我们正在为在线商店创建分页系统,并且我们只想每页显示10个产品。使用变量来跟踪当前页码,就可以像这样处理分页。
<ul>
<li v-for='index in 10' :key='index'>
{{ products[page * 10 + index] }}
</li>
</ul>
3. 避免在循环中使用v-if
VueJS将优先v-for于v-if指令。
这意味着组件将遍历每个元素,然后再检查v-if条件以查看是否应该呈现。
如果你将v-if与v-for一起使用,无论条件是什么,都将遍历数组的每一项。
<ul>
<li
v-for='product in products'
:key='product._id'
v-if='product.onSale'
>
{{ product.name }}
</li>
</ul>
两个替代方法-----如下:
4. 使用computed属性或方法
为了避免上述问题,我们应该在模板中进行迭代之前过滤数据。
首先,我们只需要设置一个computed属性或者过滤器。为了获得与之前的v-if相同的功能,代码看起来像这样。
<template>
<ul>
<li v-for="products in productsOnSale" :key="product._id">
{{ product.name }}
</li>
</ul>
</template>
<script>
export default {
data () {
return {
products: []
}
},
computed: {
productsOnSale: function () {
return this.products.filter(product => product.onSale)
}
}
}
</script>
如果我们希望能够将变量传递给过滤过程,那么就应该选择方法这条路。
<template>
<ul>
<li v-for="products in productsOnSale(50))" :key="product._id">
{{ product.name }}
</li>
</ul>
</template>
<script>
export default {
data () {
return {
products: []
}
},
methods: {
productsOnSale (maxPrice) {
return this.products.filter(product => product.onSale && product.price < maxPrice)
}
}
}
</script>
5. 或者在循环外包一层元素
<ul v-if='isLoggedIn'>
<li
v-for='product in products'
:key='product._id'
>
{{ product.name }}
</li>
</ul>
6. 访问循环中的索引
除了遍历数组并访问每个元素之外,我们还可以跟踪每个项目的索引。
为此,我们需要在项目之后添加一个索引值。
这样做超级简单,但对于分页、显示列表索引、显示排名等都很有用。
<ul>
<li v-for='(products, index) in products' :key='product._id' >
{{ index }}: {{ product.name }}
</li>
</ul>
vue的dom渲染是虚拟dom,数据发生变化时,diff算法会只比较更改的部分,如果数据项的顺序被改变,Vue将不是移动DOM元素来匹配数据项的改变,而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。
举例说明:有一个列表我们现在在中间插入了一个元素,diff算法会默认复用之前的列表并在最后追加一个,如果列表存在选中一类的状态则会随着复用出现绑定错误的情况而不是跟着原元素,key的作用就可以给他一个标识,让状态同步数据渲染。
7. 迭代对象
到目前为止,我们只研究了使用v-for来遍历数组。但是我们也可以很轻松地学会迭代对象的键值对。
与访问元素的索引类似,我们需要向循环中添加另一个值。如果我们使用单个参数循环对象,我们将循环所有项。
如果我们添加另一个参数,则将获得项和键。如果我们添加第三个参数,则还可以访问v-for循环的索引。
假设我们想遍历产品中的每个属性。那么代码如下:
<ul>
<li v-for='(products, index) in products' :key='product._id' >
<span v-for='(item, key, index) in product' :key='key'>
{{ item }}
</span>
</li>
</ul>