采坑指南:v-for 中 :key 到底有什么用?

v-for循环表单,删除一行后数据并没有被删除(对于我遇到的坑简单粗暴的描述)。我是一个在v-for循环中从来不写key并且一直没有遇到坑的人,直到今天...


图一

遇到的坑

是这样的!tr我是v-for循环的一个数组,这个数组里面是一个个行标识(见图二),每一行的内容(日期)是用户填写的。填写后保存到一个json里面。然而我删除其中一行时,对应的行标识消失,行数也减一,但是删除的那一行填写的日期并不会消失,消失的日期是最后一行。看上去像是删掉了最后一行。


图二

解决方法:

查阅大量资料终于找到问题出现在:key上。应该赋予tr一个独一无二的key才能识别填入的数据和行标识数组的关系。于是乎我就把独一无二的行标识添加到了:key中。大功告成!

原理解析:

虚拟DOM的Diff算法:

  1. 两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构。

  2. 同一层级的一组节点,他们可以通过唯一的id进行区分。

  3. 如果节点类型不同,直接干掉前面的节点,再创建并插入新的节点,不会再比较这个节点以后的子节点了。

  4. 如果节点类型相同,则会重新设置该节点的属性,从而实现节点的更新。

由于没有这个key此算法一定是认为是相同的类型了,于是乎出现了上面错位的效果。


image.png

最后:大家还是养成v-for写:key的好习惯吧,以前我是有这个习惯的,后来发现也出不了什么事,就不写了。

详情见Vue2.0 v-for 中 :key 到底有什么用?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 综合写作(等于argument):考生首先将在屏幕的左侧读到一篇230-300词左右的文章,阅读时间为3分钟,阅读...
    HCI申请准备中阅读 366评论 0 0
  • 重载:在一个类中,方法名必须相同,参数的个数或是类型必须不同,不设计返回值 重写:子类对父类的操作,不在一个类中,...
    Katharine123阅读 143评论 0 0
  • 亲爱的:夜很深了,但我不得不这样做。 有些话说了可能比憋在心里舒服,不说的话我可能象一个病人,神经病精...
    yayahoom阅读 623评论 0 0