fix(custom-element): properly resolve props for sync component defs (#12855)

close #12854
This commit is contained in:
edison 2025-05-22 08:38:27 +08:00 committed by GitHub
parent 1d41d4de7f
commit a683c80cf4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 11 deletions

View File

@ -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(
'<div><span>1 is number</span><span>true is boolean</span></div>',
)
})
})
describe('attrs', () => {

View File

@ -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)
}
// apply CSS
if (this.shadowRoot) {