详细讲解Vue中为什么要使用key

本文详细探讨了在Vue中使用key的原因,通过一个案例展示了未使用key时导致的diff算法错误。文章指出,当节点没有key时,Vue可能误认为相同节点导致错误的元素复用。使用key能确保正确匹配新旧节点,避免diff错误。同时警告,使用index作为key可能产生类似问题,除非数据不涉及更改。
摘要由CSDN通过智能技术生成

我们为什么要在vue中使用key

最新地址:https://juejin.cn/post/7402204174945353755
案例如下

<template>
  <div>
    <ul>
        <li 
            v-for="(item, index) in listData"

        >
            <input type="text">
            <button @click="deleteProperty(index)">删除</button>
        </li>
    </ul>
  </div>
</template>
<script>
export default {
    name: 'key',
    data() {
        return {
            listData: [
                {
                    id: 11,
                    value: 1
                },
                {
                    id: 22,
                    value: 2
                },
                {
                    id: 33,
                    value: 3
                },
                {
                    id: 44,
                    value: 4
                },
                {
                    id: 55,
                    value: 5
                }
            ]
        }
    },
    methods: {
        deleteProperty(index) {
            this.listData.splice(index, 1);
        }
    }
}
</script>

代码执行完毕后,我们可以看到以下的demo,此时我们点击下图所示的删除按钮,然后观看结果

点击前
在这里插入图片描述
点击后
在这里插入图片描述
原因
在vue里的diff算法中有一个判断节点是否相同的逻辑
在这里插入图片描述
其中,sel是节点的标签名,key就是节点所绑定的key,当节点没有key的时候,这时的key默认是undefined,如果前后变更的节点都没有key存在且元素标签名相同时,就判断这两个节点是相同的。

那么此时我们就可以查看diff过程了
在这里插入图片描述
1、2节点是没有变化的,所以保持原样。我们来看旧节点的第3节点和第4节点的对比,首先根据上面diff算法中判断节点是否相同的逻辑来看,这两者的共同点为:
1:sel为li
2:key为undefined
所以这两个节点满足节点相同的条件。

此时我们就要进行对比里面的子节点,子节点的相同点为
1:sel为input
2:key为undefined
此时这两个子节点也满足节点相同的条件。
那么也就是说这两个节点都是完全一样的,在diff中的处理就是元素复用,不进行任何修改,也保持原样。

其中第4节点和第5节点的比较也是同理保持原本的元素不变。由于我们删除了一个元素,所以旧节点直接舍弃掉了第5个元素。才有了操作后的结果。

综上所述,使用v-for循环时,最好把key值加上且最好不要使用index作为循环的key。否则容易出现diff错误的情况。

使用key

<li 
   v-for="(item, index) in listData"
   :key="item.id"
>
   <input type="text">
   <button @click="deleteProperty(index)">删除</button>
</li>

然后发现结果就正常了
在这里插入图片描述
diff过程
在这里插入图片描述
使用了key绑定后,新旧元素都能各自匹配上自己能匹配的元素。匹配完毕后发现3是多余的,故能正常删除3元素。

注意:这里如果使用index作为key值的话也是不能达到预期效果的,因为对应的key值为

旧节点的key新节点的key
00
11
22
33
4-
然后发现对比过程就像没写key的对比过程一样了,所以这也是使用index当key的坏处了。

当然了,如果表格数据不涉及更改的话,可以使用index当key。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值