From 7d473b7721b423050dba62823b16f3d39e640567 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 6 Aug 2024 15:58:17 +0800 Subject: [PATCH] fix(hydration): force hydrate custom element dynamic props close #7203 close #8038 --- .../runtime-core/__tests__/hydration.spec.ts | 20 +++++++++++++++++++ packages/runtime-core/src/hydration.ts | 4 +++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index c525618b510..02f491efc67 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -1340,6 +1340,26 @@ describe('SSR hydration', () => { expect((container.firstChild!.firstChild as any)._value).toBe(true) }) + // #7203 + test('force hydrate custom element with dynamic props', () => { + class MyElement extends HTMLElement { + foo = '' + constructor() { + super() + } + } + customElements.define('my-element-7203', MyElement) + + const msg = ref('bar') + const container = document.createElement('div') + container.innerHTML = '' + const app = createSSRApp({ + render: () => h('my-element-7203', { foo: msg.value }), + }) + app.mount(container) + expect((container.firstChild as any).foo).toBe(msg.value) + }) + // #5728 test('empty text node in slot', () => { const Comp = { diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index c371542607d..533a52e8e07 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -447,6 +447,7 @@ export function createHydrationFunctions( !optimized || patchFlag & (PatchFlags.FULL_PROPS | PatchFlags.NEED_HYDRATION) ) { + const isCustomElement = el.tagName.includes('-') for (const key in props) { // check hydration mismatch if ( @@ -463,7 +464,8 @@ export function createHydrationFunctions( (key.endsWith('value') || key === 'indeterminate')) || (isOn(key) && !isReservedProp(key)) || // force hydrate v-bind with .prop modifiers - key[0] === '.' + key[0] === '.' || + isCustomElement ) { patchProp(el, key, null, props[key], undefined, parentComponent) }