v-for循环表单,删除一行后数据并没有被删除(对于我遇到的坑简单粗暴的描述)。我是一个在v-for循环中从来不写key并且一直没有遇到坑的人,直到今天...
遇到的坑
是这样的!tr我是v-for循环的一个数组,这个数组里面是一个个行标识(见图二),每一行的内容(日期)是用户填写的。填写后保存到一个json里面。然而我删除其中一行时,对应的行标识消失,行数也减一,但是删除的那一行填写的日期并不会消失,消失的日期是最后一行。看上去像是删掉了最后一行。
解决方法:
查阅大量资料终于找到问题出现在:key上。应该赋予tr一个独一无二的key才能识别填入的数据和行标识数组的关系。于是乎我就把独一无二的行标识添加到了:key中。大功告成!
原理解析:
虚拟DOM的Diff算法:
两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构。
同一层级的一组节点,他们可以通过唯一的id进行区分。
如果节点类型不同,直接干掉前面的节点,再创建并插入新的节点,不会再比较这个节点以后的子节点了。
如果节点类型相同,则会重新设置该节点的属性,从而实现节点的更新。
由于没有这个key此算法一定是认为是相同的类型了,于是乎出现了上面错位的效果。
最后:大家还是养成v-for写:key的好习惯吧,以前我是有这个习惯的,后来发现也出不了什么事,就不写了。