mirror of https://github.com/vuejs/core.git
fix(hydration): force hydrate custom element dynamic props
close #7203 close #8038
This commit is contained in:
parent
63fd8b683a
commit
7d473b7721
|
@ -1340,6 +1340,26 @@ describe('SSR hydration', () => {
|
||||||
expect((container.firstChild!.firstChild as any)._value).toBe(true)
|
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 = '<my-element-7203></my-element-7203>'
|
||||||
|
const app = createSSRApp({
|
||||||
|
render: () => h('my-element-7203', { foo: msg.value }),
|
||||||
|
})
|
||||||
|
app.mount(container)
|
||||||
|
expect((container.firstChild as any).foo).toBe(msg.value)
|
||||||
|
})
|
||||||
|
|
||||||
// #5728
|
// #5728
|
||||||
test('empty text node in slot', () => {
|
test('empty text node in slot', () => {
|
||||||
const Comp = {
|
const Comp = {
|
||||||
|
|
|
@ -447,6 +447,7 @@ export function createHydrationFunctions(
|
||||||
!optimized ||
|
!optimized ||
|
||||||
patchFlag & (PatchFlags.FULL_PROPS | PatchFlags.NEED_HYDRATION)
|
patchFlag & (PatchFlags.FULL_PROPS | PatchFlags.NEED_HYDRATION)
|
||||||
) {
|
) {
|
||||||
|
const isCustomElement = el.tagName.includes('-')
|
||||||
for (const key in props) {
|
for (const key in props) {
|
||||||
// check hydration mismatch
|
// check hydration mismatch
|
||||||
if (
|
if (
|
||||||
|
@ -463,7 +464,8 @@ export function createHydrationFunctions(
|
||||||
(key.endsWith('value') || key === 'indeterminate')) ||
|
(key.endsWith('value') || key === 'indeterminate')) ||
|
||||||
(isOn(key) && !isReservedProp(key)) ||
|
(isOn(key) && !isReservedProp(key)) ||
|
||||||
// force hydrate v-bind with .prop modifiers
|
// force hydrate v-bind with .prop modifiers
|
||||||
key[0] === '.'
|
key[0] === '.' ||
|
||||||
|
isCustomElement
|
||||||
) {
|
) {
|
||||||
patchProp(el, key, null, props[key], undefined, parentComponent)
|
patchProp(el, key, null, props[key], undefined, parentComponent)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue