From: edison Date: Thu, 22 May 2025 00:38:27 +0000 (+0800) Subject: fix(custom-element): properly resolve props for sync component defs (#12855) X-Git-Tag: v3.5.15~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a683c80cf44ecc482f8ac9c76bf2381443c1b0bb;p=thirdparty%2Fvuejs%2Fcore.git fix(custom-element): properly resolve props for sync component defs (#12855) close #12854 --- diff --git a/packages/runtime-dom/__tests__/customElement.spec.ts b/packages/runtime-dom/__tests__/customElement.spec.ts index cf7b94ed00..eee2151716 100644 --- a/packages/runtime-dom/__tests__/customElement.spec.ts +++ b/packages/runtime-dom/__tests__/customElement.spec.ts @@ -444,6 +444,36 @@ describe('defineCustomElement', () => { const e = container.childNodes[0] as VueElement expect(e.shadowRoot!.innerHTML).toBe('hello') }) + + test('prop types validation', async () => { + const E = defineCustomElement({ + props: { + num: { + type: [Number, String], + }, + bool: { + type: Boolean, + }, + }, + render() { + return h('div', [ + h('span', [`${this.num} is ${typeof this.num}`]), + h('span', [`${this.bool} is ${typeof this.bool}`]), + ]) + }, + }) + + customElements.define('my-el-with-type-props', E) + render(h('my-el-with-type-props', { num: 1, bool: true }), container) + const e = container.childNodes[0] as VueElement + // @ts-expect-error + expect(e.num).toBe(1) + // @ts-expect-error + expect(e.bool).toBe(true) + expect(e.shadowRoot!.innerHTML).toBe( + '
1 is numbertrue is boolean
', + ) + }) }) describe('attrs', () => { diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 3a4a341297..56b86a5fd9 100644 --- a/packages/runtime-dom/src/apiCustomElement.ts +++ b/packages/runtime-dom/src/apiCustomElement.ts @@ -269,11 +269,6 @@ export class VueElement this._root = this } } - - if (!(this._def as ComponentOptions).__asyncLoader) { - // for sync component defs we can immediately resolve props - this._resolveProps(this._def) - } } connectedCallback(): void { @@ -391,12 +386,7 @@ export class VueElement } } this._numberProps = numberProps - - if (isAsync) { - // defining getter/setters on prototype - // for sync defs, this already happened in the constructor - this._resolveProps(def) - } + this._resolveProps(def) // apply CSS if (this.shadowRoot) {