vue中的v-for循环

 1.v-for遍历普通数组

in前面如果是一个变量,那么该变量保存的是数组中的数据in前面如果是两个变量,那么第一个变量保存的是数组中的数据,第二个变量保存的是下标

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <!-- 绑定事件 v-on: 简写为@ -->
        <button @click="add">点击在数组最后添加元素</button>
        <ul style="list-style-type: none;">
            <!-- item是数组里面的元素  index是数组的下标 -->
            <li v-for="(item,index) in list">{{index}}-{{item}}</li>
        </ul>

    </div>
    <script src="/vue.js"></script>
    <script>

        new Vue({
            el: '#app',
            data: {
                list: ['猪方', '战神', '小金子', '楠神']
            },
            methods: {
                add() {
                    this.list.push('黑牛')
                }
            },
        })
    </script>
</body>

</html>

2.v-for遍历对象

如果是一个变量,那么保存的是对象中的属性值

如果是两个变量,那么第一个变量保存的是属性值,第二个变量保存的是属性名

如果是三个变量,那么第一个变量保存的是属性值,第二个变量保存的是属性名,第三个变量保存的是下标

v-for="o1 in obj"          o1:属性值

v-for="(o1,o2) in obj"     o1:属性值  o2:属性名


v-for="(o1,o2,o3) in obj"  o1:属性值  o2:属性名  o3:下标
 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <ul>
            <li v-for="item in obj">{{item}}</li>
            <hr>
            <li v-for="(val,key) in obj">{{ key }}-{{ val }}</li>

        </ul>
    </div>

    <script src="./vue.js"></script>

    <script>
        new Vue({
            el: '#app',
            data: {
                obj: {
                    name: '卡拉米',
                    age: 16,
                    sex: '男',

                }
            }
        })
    </script>
</body>

</html>

3.v-for循环数字

in后面不仅可以放数组、对象数组、对象,还可以放数字

在in前面用一个变量存储当前次数,注意:此变量是从1开始,而不是从0开始

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <ul style="list-style-type: none;">
            <!-- v-for='遍历的数 in 遍历的范围' -->
            <li v-for="num in 9">{{num}}</li>
        </ul>
    </div>
    <script src="/vue.js"></script>
    <script>
        new Vue({
            el: '#app',

        })

    </script>
</body>

</html>

4. Key是什么?

Key 特殊属性主要用做 Vue 的虚拟 DOM 算法在将新节点列表与旧列表进行比较时识别 VNode 的提示。在没有键的情况下,Vue 使用一种算法来最小化元素移动,并尝试尽可能多地就地修补/重用相同类型的元素。使用键,它将根据键的顺序更改对元素进行重新排序,并且不再存在键的元素将始终被删除/销毁。

 5.有无Key值不同调用方法

Vue内部会对有无Key值的for循环进行不同方法的处理

(1) patchKeyedChildren

有 Key, 进行 patchKeyedChildren

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- @click="list.splice(下标,删除的数量,添加的元素)" -->
        <button @click="list.splice(1,0,{name:'狗屎',age:11,sex:'男',id:4})">点击添加对象</button>
        <ul>
            <li v-for="item in list" :key="item.id">
                <!-- 单选框 -->
                <input type="checkbox">
                <!-- 行内元素 -->
                <span>{{item.name}}</span>
            </li>
        </ul>
    </div>
    <script src="/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                list:[
                    {name:'战神',age:18,sex:'男',id:1},
                    {name:'金子',age:18,sex:'男',id:2},
                    {name:'铜牌',age:18,sex:'男',id:3}
                ]
            }
        })
    </script>
</body>
</html>

(2)patchUnKeyedChildren

没有 Key ,进行 patchUnKeyedChildren

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- @click="list.splice(下标,删除的数量,添加的元素)" -->
        <button @click="list.splice(1,0,{name:'狗屎',age:11,sex:'男',id:4})">点击添加对象</button>
        <ul>
            <li v-for="item in list">
                <!-- 单选框 -->
                <input type="checkbox">
                <!-- 行内元素 -->
                <span>{{item.name}}</span>
            </li>
        </ul>
    </div>
    <script src="/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                list:[
                    {name:'战神',age:18,sex:'男',id:1},
                    {name:'金子',age:18,sex:'男',id:2},
                    {name:'铜牌',age:18,sex:'男',id:3}
                ]
            }
        })
    </script>
</body>
</html>

<think>首先,用户的问题是:我想理解 Vue 中 v-for 循环中 key 属性的作用,并通过示例进行说明。请问Vue v-for 循环中 key 的作用及使用示例。 根据系统级指令: - 所有行内数学表达式必须使用 $...$ 格式,但这里没有数学表达式,所以不需要。 - 独立公式必须使用 $$...$$ 格式并单独成段,但同样,主题是Vue.js,没有数学公式。 - LaTeX语法正确:不适用。 - 使用中文回答:必须用中文。 - 生成相关问题:在回答后添加相关问题。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。参考了提供的引用内容,这些是关于Vue v-for key作用的引用。 用户提供的引用: - 引用[1]: Vue中v-for关于key的作用。核心作用包括底层原理和性能影响。 - 引用[2]: 前端面试题145(vue v-for循环中key的作用)。性能优化,Vue利用key高效更新列表。 - 引用[3]: vue v-for循环中key的作用。默认就地复用策略,key帮助判断数据是否改变。 - 引用[4]: vue v-for循环动态获取。快速讲明key作用,不推荐使用index作为key。 这些引用强调了key的作用: 1. 性能优化:key帮助Vue高效更新DOM,避免不必要的重新渲染。 2. 唯一标识:key作为元素的唯一标识符,帮助Vue追踪列表项的变化。 3. 避免使用index:使用唯一id而不是index作为key,因为index不稳定。 我的回答需要: - 结构清晰:逐步解释key的作用。 - 保证真实可靠:基于Vue.js官方文档和常见实践。 - 添加示例:提供代码示例说明key的使用。 - 添加引用标识:在引用内容末尾添加[^1], [^2]等,基于提供的引用。 回答结构: 1. 介绍key的作用。 2. 详细解释key的重要性。 3. 提供使用示例。 4. 讨论最佳实践。 5. 添加相关问题。 引用处理: - 在回答中,当提到引用内容时,在段落末尾添加引用标识。例如,如果解释性能优化部分,添加[^2]。 相关问题: - 生成3-5个相关问题,放在最后。 完整回答: - 开头:直接回答问题。 - 主体:分步骤解释。 - 结尾:相关问题。 示例代码: - 使用Vue模板语法,展示v-for with key。 最佳实践: - 强调使用唯一id,如item.id,而不是index。 现在,构建回答。</think>### Vue v-for 循环中 key 属性的作用及使用示例 在 Vue.js 中,`v-for` 指令用于渲染列表数据,而 `key` 属性是 `v-for` 的必需部分,用于提升性能并确保列表渲染的准确性。下面我将逐步解释其作用,并通过示例进行说明。 #### 1. **key 属性的核心作用** - **性能优化**:Vue 在更新列表时,会利用 `key` 作为唯一标识符来高效地追踪元素变化。当数据变动时,Vue 通过 `key` 直接定位需要更新的元素,避免重新渲染整个列表,从而减少不必要的 DOM 操作。这显著降低了时间复杂度(从 O(n) 优化到 O(1))[^2]。 - **避免就地复用问题**:默认情况下,Vue 采用“就地复用”策略(in-place patch)。如果列表数据顺序改变(如添加、删除项),没有 `key` 时 Vue 会错误地复用现有元素,导致状态混乱。`key` 帮助 Vue 判断数据是否改变,决定是否重新渲染或复用元素[^3]。 - **维护元素状态**:`key` 确保每个元素(如输入框、复选框)的状态与数据绑定正确对应。例如,在动态列表中,没有 `key` 时用户输入可能被错误保留[^1]。 #### 2. **key 属性的使用示例** 以下是一个 Vue 组件的代码示例,展示如何正确使用 `key`: ```html <template> <div> <!-- 使用唯一 id 作为 key(推荐做法) --> <ul> <li v-for="item in itemList" :key="item.id"> {{ item.text }} - ID: {{ item.id }} </li> </ul> <!-- 错误示例:使用 index 作为 key(不推荐) --> <ul> <li v-for="(item, index) in itemList" :key="index"> {{ item.text }} - Index: {{ index }} </li> </ul> </div> </template> <script> export default { data() { return { itemList: [ { id: 1, text: '数据1' }, { id: 2, text: '数据2' }, { id: 3, text: '数据3' } ] }; } }; </script> ``` - **正确用法**:在第一个列表中,`key="item.id"` 使用数据项的唯一 `id`。这确保了当列表变化时(如添加新项),Vue 能精准更新 DOM。 - **错误用法**:在第二个列表中,`key="index"` 使用数组索引作为 `key`。如果列表顺序改变(如删除第一项),索引会重新计算,导致 Vue 错误复用元素,引发渲染问题(如显示错误数据)[^4]。 #### 3. **最佳实践** - **始终使用唯一标识符**:优先选择数据中的唯一值(如 `id`),而不是 `index`。`index` 在动态列表中不稳定,易导致性能下降或逻辑错误[^3][^4]。 - **为什么避免 index**:如果列表发生排序或插入操作,`index` 会变化,Vue 无法正确追踪元素,可能触发全量重渲染,降低性能[^1]。 - **场景应用**:适用于任何动态列表,如用户列表、商品列表等。通过 `key`,Vue 能高效处理数据变化,提升用户体验[^2]。 通过以上解释和示例,您可以看到 `key` 在 Vue 的 `v-for` 循环中至关重要,它不仅是性能优化的关键,也是确保数据一致性的基础。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值