Просмотр исходного кода

polish: warn duplicate keys when patching children into empty node (#8881)

close #8832
Daniel Santana Rocha 7 лет назад
Родитель
Сommit
2bb3199da7
2 измененных файлов с 15 добавлено и 0 удалено
  1. 3 0
      src/core/vdom/patch.js
  2. 12 0
      test/unit/modules/vdom/patch/children.spec.js

+ 3 - 0
src/core/vdom/patch.js

@@ -550,6 +550,9 @@ export function createPatchFunction (backend) {
       if (isDef(oldCh) && isDef(ch)) {
         if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly)
       } else if (isDef(ch)) {
+        if (process.env.NODE_ENV !== 'production') {
+          checkDuplicateKeys(ch)
+        }
         if (isDef(oldVnode.text)) nodeOps.setTextContent(elm, '')
         addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue)
       } else if (isDef(oldCh)) {

+ 12 - 0
test/unit/modules/vdom/patch/children.spec.js

@@ -530,4 +530,16 @@ describe('vdom patch: children', () => {
     patch(vnode2, vnode3)
     expect(`Duplicate keys detected: 'b'`).toHaveBeenWarned()
   })
+
+  it('should warn with duplicate keys: patchVnode with empty oldVnode', () => {
+    function makeNode (key) {
+      return new VNode('li', { key: key })
+    }
+
+    const vnode1 = new VNode('div')
+    const vnode2 = new VNode('div', undefined, ['1', '2', '3', '4', '4'].map(makeNode))
+
+    patch(vnode1, vnode2)
+    expect(`Duplicate keys detected: '4'`).toHaveBeenWarned()
+  })
 })