Browse Source

fix(hydration): fix css vars hydration mismatch false positive on non-root nodes

close #10317
test case from #10325
pull/10350/head
Evan You 1 year ago
parent
commit
995d2fdcca
  1. 17
      packages/runtime-core/__tests__/hydration.spec.ts
  2. 6
      packages/runtime-core/src/hydration.ts

17
packages/runtime-core/__tests__/hydration.spec.ts

@ -1554,5 +1554,22 @@ describe('SSR hydration', () => {
app.mount(container)
expect(`Hydration style mismatch`).not.toHaveBeenWarned()
})
// #10317 - test case from #10325
test('css vars should only be added to expected on component root dom', () => {
const container = document.createElement('div')
container.innerHTML = `<div style="--foo:red;"><div style="color:var(--foo);" /></div>`
const app = createSSRApp({
setup() {
useCssVars(() => ({
foo: 'red',
}))
return () =>
h('div', null, [h('div', { style: { color: 'var(--foo)' } })])
},
})
app.mount(container)
expect(`Hydration style mismatch`).not.toHaveBeenWarned()
})
})
})

6
packages/runtime-core/src/hydration.ts

@ -753,10 +753,16 @@ function propHasMismatch(
}
}
const root = instance?.subTree
if (
vnode === root ||
(root?.type === Fragment && (root.children as VNode[]).includes(vnode))
) {
const cssVars = instance?.getCssVars?.()
for (const key in cssVars) {
expectedMap.set(`--${key}`, String(cssVars[key]))
}
}
if (!isMapEqual(actualMap, expectedMap)) {
mismatchType = mismatchKey = 'style'

Loading…
Cancel
Save