v-for中key的作用:为什么使用v-for时必须添加唯一的key属性

key的作用:

  key是为了给Vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,需要为每项提供一个唯一的key属性。

先来举个例子:

在这里插入图片描述

一、没有加key:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 
</head>
<body>
    <div id="app" >
        <div>
            <input type="text" v-model="name" >
            <button @click="add">添加</button>
        </div>
        <ul>
            <li v-for="item in list">
                <input type="checkbox">ID{{item.id}} -------name:{{item.name}}
            </li>
        </ul>
    </div>
<script>
    var vm = new Vue({
            el:'#app',
            data:{
                name: '',
                list: [
                    { id:0,name:'小美子1号' },
                    { id:1,name:'小美子2号' },
                    { id:2,name:'小美子3号' }
                ]
            },
            methods:{
                add() {
                     //    1.拼接处一个完整的用户信息对象,包含ID 和name
                    const newUser= {id: this.list.length,name: this.name};
                    //    2.把拼接出来的用户信息对象 调用this.list.unshift方法把对象追加到数组的第一个
                    this.list.unshift(newUser);
                }
            }
    })
</script>
</body>
</html>
没有加key的时候,当我选中第二个“小美子2号”后,再添加小美子4号时:

在这里插入图片描述

则会出现问题:

选中的变成了“小美子3号”,位置依旧是第二个,很显然这不是我们想要的结果,解决这个问题的方法就是加key属性

在这里插入图片描述

二、加上key:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 
</head>
<body>
    <div id="app" >
        <div>
            <input type="text" v-model="name" >
            <button @click="add">添加</button>
        </div>
        <ul>
            <!-- 注意:key的取值必须是number 或 string,不能是对象 -->
            <!-- 而且 使用 v-for 循环的每一项的值,都要保证唯一性 -->
            <!-- 今后,只要使用 v-for循环,就必须为循环的每一项,添加 :key  属性绑定 -->
            <li v-for="item in list" :key="item.id">
                <input type="checkbox">ID{{item.id}} -------name:{{item.name}}
            </li>
        </ul>
    </div>
<script>
    var vm = new Vue({
            el:'#app',
            data:{
                name: '',
                list: [
                    { id:0,name:'小美子1号' },
                    { id:1,name:'小美子2号' },
                    { id:2,name:'小美子3号' }
                ]
            },
            methods:{
                add() {
                     //    1.拼接处一个完整的用户信息对象,包含ID 和name
                    const newUser= {id: this.list.length,name: this.name};
                    //    2.把拼接出来的用户信息对象 调用this.list.unshift方法把对象追加到数组的第一个
                    this.list.unshift(newUser);
                }
            }
    })
</script>  
</body>
</html>

加上key以后,当我选中第二个“小美子2号”后,再添加小美子4号时:

在这里插入图片描述

上边出现的问题解决了,选中的依然是“小美子2号”:

在这里插入图片描述

注意:key的取值必须是number 或 string,不能是对象,而且使用 v-for 循环的每一项的值,都要保证唯一性 。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值