第十节:Vue指令:v-for列表循环

第十节:Vue指令:v-for列表循环,第1张

用 v-for 指令根据一组数组的选项列表进行渲染。

通过数组的索引获取数组的数据

这种写法在数据很多的时候或者数据发生更新的时候处理就会很繁琐,

因此我们可以使用v-for指令来循环数组

基本数组的循环

v-for 还支持一个可选的第二个参数为当前项的索引。

数组项为对象的循环

使用索引

同时我们也可以用 of 替代 in 作为分割符

语法

示例:

也可以用 v-for 指令来循环对象。

第一个参数是训练遍历对象的属性值:

第二个的参数为对象的属性(键名):

还可以通过第三个参数来获取索引值:

使用 v-for 更新已渲染的元素列表时,默认用 就地复用 策略;列表数据修改的时候,他会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素; 我们在使用的使用经常会使用 index (即数组的下标)来作为 key ,但其实这是不推荐的一种使用方法;

key值的使用其实是和vue响应式已经虚拟DOM有关, 那么我们通过下面的例子来了解一下

例子:

数据

页面渲染

但是数据发生了变化,

如果数据是这一种变化的话, 那么index没什么问题

数据前后变化的结果

这样vue就会分析到 其他的数据 都不需要改变,只需要在新增一个DOM节点,然后添加新增的数据就可以了

可以输入我们是在数组中间插入的数据就会不一样为了

这时数据的对比

通过上面清晰的对比,发现除了第一个数据可以复用之前的之外,另外三条数据都需要重新渲染;

是不是很惊奇,我明明只是插入了一条数据,怎么三条数据都要重新渲染而我想要的只是新增的那一条数据新渲染出来就行了

最好的办法是使用数组中不会变化的那一项作为 key 值,对应到项目中,即每条数据都有一个唯一的 id ,来标识这条数据的唯一性;使用 id 作为 key 值,我们再来对比一下向中间插入一条数据,此时会怎么去渲染

此时数据的变化

现在对比发现只有一条数据变化了,就是 id 为4的那条数据,因此只要新渲染这一条数据就可以了,其他都是就复用之前的;

为什么需要key属性: 虚拟DOM的diff算法,

当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程

我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

所以一句话,key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

建议尽可能在使用 v-for 时提供 key ,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

v-if和v-for一起使用,v-for的优先级要高于v-if

可能会想到v-if和v-for是用的两种情况

那么接下来好好看看这两种情况

第一种情况: 为了过滤一个列表中的项目

为了过滤项目内容,我们可能会如下调用:

在这种情况下,请将 users 替换为一个计算属性(比如 activeUsers ),让其返回过滤后的列表。

示例详解:

如果现在只想显示价格在22元以上的水果,我们可能会这么写

这么写固然会得到你想要的效果, 但是因为v-for和v-if优先级的关系, 所以将会经过如下的运算

因此,哪怕我们只渲染出一小部分内容,也得在每次重新渲染的时候遍历整个列表,无论价格是否满足我们的条件

随意我们推荐使用计算属性, 在计算属性中处理过滤事宜, 计算属性会在计算完毕后缓存内容,提高遍历的效率

这样我们得到的结果是一样的,但是我们获得了如下的好处

第二种情况: 为了避免渲染本应该被隐藏的列表

也就是根据条件类判断列表的显示我们也后可能会使用下面的方法调用

实例详解:

原理是一样的, 就是如果这么写, 还是会循环遍历每一个数据,然后判断是不是显示 一样浪费

所以我们将 v-if 移动到容器元素,这样我们就不用对每一个元素都进行判断是否显示, 取而代之的是,我们只检查判断一次,且不会在 isShow 为假的时候还循环运算 v-for。

有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以使用计算属性和方法来过滤数据

我们上面讲过了计算属性,下面来看看方法的使用

总结示例:

Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:push()

pop()

shift()

unshift()

splice()

sort()

reverse()

以上七个数组都会改变原数组,下面来分别讲解它们的区别:var list = [3,4,5,6]

1 push() 向数组的尾部添加若干元素,并返回数组的新长度;

listpush(7,8) //返回数组的长度6

list //list=[3,4,5,6,7,8]

2 pop() 从数组的尾部删除一个元素(删且只删除一个元素),返回被删除的元素

listpop() //返回删除的数组6

list //list=[3,4,5]

3 unshift() 向数组的头部添加若干元素,返回数组的新长度

listunshift(1,2) //返回数组的长度6

list //list=[1,2,3,4,5,6]

4 shift() 从数组的头部删除一个元素(删且只删除一个元素),返回被删除的元素

listshift() //返回删除的元素3

list //list=[4,5,6]

ps:pop()和shift()方法不接受传参,传参了也没有什么用

空数组可以删除,不报错,但返回undefined

5 splice() 该方法有如下3种用法:删除 —— 可以删除任意数量的项,只需要指定2个参数:要删除的第一项的位置和要删除项的项数。

插入 —— 可以向指定位置插入任意数量的项,只需要提供3个参数:插入起始位置、0(要删除的项数)和要插入的项。 如果要插入多个项,可以再传入第四、第五,一直任意多个项。

替换 —— 可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需要指定3个指定参数:起始位置、要删除的项数和要插入的任意数量项。 插入的项数是不必与删除的项数相等。

var colors = ["red", "green", "blue"];

var removed = colorssplice(0,1); //删除第一项

alert(colors); //green,blue

alert(removed); //red,返回数组中值包含一项

removed = colorssplice(1, 0, "yellow", "orange"); //从位置1开始插入两项

alert(colors); //green,yellow,organge,blue

alert(removed); //返回的是一个空数组

removed = colorssplice(1, 1, "red", "purple"); //插入两项,删除一项

alert(colors); //green,red,purple,orange,blue

alert(remove); //yellow, 返回的数组中只包含一项

6 sort() 该方法用于对数组的元素进行排序

list:["George","John","Thomas","James","Adrew","Martin"];

listsort(); //["Adrew", "George", "James", "John", "Martin", "Thomas"]

ps: 因为sort()排序默认的是根据字符串UniCode码进行排序,所以如果要对数字进行排序的话,参数要传递一个比较函数

list:["100","24","489","22","307","6"];

sortNumber(a,b){

return a-b

};

listsort(sortNumber) //["6", "22", "24", "100", "307", "489"]

7 reverse() 该方法用于颠倒数组中元素的顺序

list:["kwz","John","Thomas","James","Adrew","Martin"]

listreverse(); //["Martin", "Adrew", "James", "Thomas", "John", "kwz"]

通常情况下,我们可能会用v-for循环出一堆checkbox,提交数据的时候需要去获取选中的checkbox的value值,之前我的获取方式是给checkbox添加点击事件,这样确实能解决问题,但是总觉得有更好的办法,因为同为form表单元素的文本框就可以使用v-model来实现数据双向绑定,难道checkbox不能实现数据双向绑定吗?

呵呵哒,真的可以,我一直都不知道。。。。。。。。。

<input  type="checkbox"  v-model="checkFlag">

data () {

    return {

            checkFlag: true    //checkbox默认选中

    }

}

上面是最简单的用法,那如果使用场景是:购物车里循环遍历了所有用户添加的商品,用户选中一些商品,去结算,我们需要在结算的时候获取所有选中的checkbox的value值;

页面的大概效果如下:

这里我们给checkbox绑上了v-model的属性,以及value属性,checkedArr是一个数组,用来放选中的itemname,当checkbox选中或者取消都会触发v-model绑定的checkedArr值变化;

强调最重要的一点,v-model会在checkbox选中的时候,自动将当前的value值push进数组;在取消checkbox的时候,自动将当前的value值pop出数组。

以下是依次选中四个商品,然后取消商品4,打印的checkedArr的值

至于全选按钮什么时候选中,那我们可以watch一下checkedArr:

以上就是关于第十节:Vue指令:v-for列表循环全部的内容,包括:第十节:Vue指令:v-for列表循环、vue计算属性里面获取的三个数组如何放到一个数组中、vue中如何获取选中的checkbox的value值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10146389.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存