expect(`mismatch`).not.toHaveBeenWarned()
})
+ test('transition appear work with pre-existing class', () => {
+ const { vnode, container } = mountWithHydration(
+ `<template><div class="foo">foo</div></template>`,
+ () =>
+ h(
+ Transition,
+ { appear: true },
+ {
+ default: () => h('div', { class: 'foo' }, 'foo'),
+ },
+ ),
+ )
+ expect(container.firstChild).toMatchInlineSnapshot(`
+ <div
+ class="foo v-enter-from v-enter-active"
+ >
+ foo
+ </div>
+ `)
+ expect(vnode.el).toBe(container.firstChild)
+ expect(`mismatch`).not.toHaveBeenWarned()
+ })
+
test('transition appear with v-if', () => {
const show = false
const { vnode, container } = mountWithHydration(
parentComponent.vnode.props.appear
const content = (el as HTMLTemplateElement).content
- .firstChild as Element
+ .firstChild as Element & { $cls?: string }
if (needCallTransitionHooks) {
+ const cls = content.getAttribute('class')
+ if (cls) content.$cls = cls
transition!.beforeEnter(content)
}
* Dev only
*/
function propHasMismatch(
- el: Element,
+ el: Element & { $cls?: string },
key: string,
clientValue: any,
vnode: VNode,
if (key === 'class') {
// classes might be in different order, but that doesn't affect cascade
// so we just need to check if the class lists contain the same classes.
- actual = el.getAttribute('class')
+ if (el.$cls) {
+ actual = el.$cls
+ delete el.$cls
+ } else {
+ actual = el.getAttribute('class')
+ }
expected = normalizeClass(clientValue)
if (!isSetEqual(toClassSet(actual || ''), toClassSet(expected))) {
mismatchType = MismatchTypes.CLASS