Explorar o código

fix(runtime-core): handle initial undefined attrs (#5017)

fix #5016
edison %!s(int64=4) %!d(string=hai) anos
pai
achega
6d887aaf59

+ 22 - 0
packages/runtime-core/__tests__/componentProps.spec.ts

@@ -573,4 +573,26 @@ describe('component props', () => {
       render(h(Comp, { foo: null }), root)
     }).not.toThrow()
   })
+
+  // #5016
+  test('handling attr with undefined value', () => {
+    const Comp = {
+      render(this: any) {
+        return JSON.stringify(this.$attrs) + Object.keys(this.$attrs)
+      }
+    }
+    const root = nodeOps.createElement('div')
+
+    let attrs: any = { foo: undefined }
+
+    render(h(Comp, attrs), root)
+    expect(serializeInner(root)).toBe(
+      JSON.stringify(attrs) + Object.keys(attrs)
+    )
+
+    render(h(Comp, (attrs = { foo: 'bar' })), root)
+    expect(serializeInner(root)).toBe(
+      JSON.stringify(attrs) + Object.keys(attrs)
+    )
+  })
 })

+ 1 - 1
packages/runtime-core/src/componentProps.ts

@@ -369,7 +369,7 @@ function setFullProps(
             continue
           }
         }
-        if (value !== attrs[key]) {
+        if (!(key in attrs) || value !== attrs[key]) {
           attrs[key] = value
           hasAttrsChanged = true
         }