VUE:v-for的使用及源码

本文详细介绍了Vue中的v-for指令,不仅涵盖了遍历数组、对象、数字和字符串的用法,还揭示了在Vue3中如何处理具有iterator接口的对象。在源码分析部分,揭示了v-for在不同场景下的内部处理机制,包括在Vue3中对Set、Map等类型的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

v-for可以说是vue中使用最多的指令之一,不过,你真的了解它吗?v-for不仅仅能用于遍历数组,也不仅仅能用于遍历对象。

二、使用

先说结论:v-for可以遍历数组、对象、数字以及字符串,以及,在vue3版本新增的对于部署了iterator接口的对象的支持。下面是各种场景的分析,以(item,index) in obj的使用方式为例:

<div v-for="(item,index) in obj"></div>

 

1.遍历数组

遍历数组时,item是数组的当前项,index是对应的下标

//(item,index) in [1,2,3]
// item : 1 2 3
// index: 0 1 2

2.遍历对象

遍历对象时,item是对象键值对的value,index是对应的key

遍历顺序,和Object.keys(obj)、Object.values(obj)的遍历顺序是一样的,即先是数值键,按升序遍历;然后是字符串键,按加入时间遍历;然后是Symbol键,按加入时间遍历

//  obj = {
//   1: 1,
//   v: 2,
//   c: 3,
// };
//(item,index) in obj
// item : 1 2 3
// index: 1 v c

3.遍历字符串

item是字符串的每个字符,index是对应的下标

// (item,index) in 'abc'
// item: a b c
// index: 0 1 2

4.遍历数字

遍历数字n时,item是从1到n的数字,index是对应的顺序,以0为起始值(可以理解为遍历从1到n的数组)

// (item,index) in 3
// item: 1 2 3
// index: 0 1 2

5.遍历有interator接口的对象

iterator接口,不明白的可以查阅阮一峰老师的es6标准入门,地址戳我

比如Set、Map、classList等等

v-for在遍历这类对象时,会先用Array.from将这些对象转换为数组,然后就和遍历数组类似的了

// const set = new Set([3, 4, 5]);
// (item,index) in set
// item: 3 4 5
// index: 0 1 2

// const map = new Map();
// map.set(1,2)
// map.set(3,4)
// map.set(5,6)
// (item,index) in map
// item: [1,2] [3,4] [5,6]
// index: 0 1 2

三、源码

这里放下源码(位于core/instance/render-helpers/render-list.js文件内),源码看起来很容易理解,就不多说了,其实就是对各种情况的处理。(这里放的是vue3版本的远吗,vue2版本的,没有对iterator做特殊处理,所以vue2版本的v-for也不能用于遍历Set、Map等)

function renderList(source, renderItem) {
    let ret;
    if (isArray(source) || isString(source)) {
        ret = new Array(source.length);
        for (let i = 0, l = source.length; i < l; i++) {
            ret[i] = renderItem(source[i], i);
        }
    }
    else if (typeof source === 'number') {
        ret = new Array(source);
        for (let i = 0; i < source; i++) {
            ret[i] = renderItem(i + 1, i);
        }
    }
    else if (isObject(source)) {
        if (source[Symbol.iterator]) {
            ret = Array.from(source, renderItem);
        }
        else {
            const keys = Object.keys(source);
            ret = new Array(keys.length);
            for (let i = 0, l = keys.length; i < l; i++) {
                const key = keys[i];
                ret[i] = renderItem(source[key], key, i);
            }
        }
    }
    else {
        ret = [];
    }
    return ret;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值