expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"
- <!--[--><span>a</span><span>b</span><span>c</span><!--]-->
- "
+ <!--[--><span>a</span><span>b</span><span>c</span><!--for-->"
`,
)
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"
- <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--]-->
- "
+ <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--for-->"
`,
)
})
`
"
<!--[--><div>
- <!--[--><span>a</span><span>b</span><span>c</span><!--]-->
- </div><div>3</div><!--]-->
+ <!--[--><span>a</span><span>b</span><span>c</span><!--for--></div><div>3</div><!--]-->
"
`,
)
`
"
<!--[--><div>
- <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--]-->
- </div><div>4</div><!--]-->
+ <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--for--></div><div>4</div><!--]-->
"
`,
)
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div><span></span>
- <!--[--><span>a</span><span>b</span><span>c</span><!--]-->
- <span></span></div>"
+ <!--[--><span>a</span><span>b</span><span>c</span><!--for--><span></span></div>"
`,
)
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div><span></span>
- <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--]-->
- <span></span></div>"
+ <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--for--><span></span></div>"
`,
)
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div><span></span>
- <!--[--><span>b</span><span>c</span><span>d</span><!--]-->
- <span></span></div>"
+ <!--[--><span>b</span><span>c</span><span>d</span><!--for--><span></span></div>"
`,
)
})
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div><span></span>
- <!--[--><span>a</span><span>b</span><span>c</span><!--]-->
- <!--[--><span>a</span><span>b</span><span>c</span><!--]-->
- <span></span></div>"
+ <!--[--><span>a</span><span>b</span><span>c</span><!--for-->
+ <!--[--><span>a</span><span>b</span><span>c</span><!--for--><span></span></div>"
`,
)
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div><span></span>
- <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--]-->
- <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--]-->
- <span></span></div>"
+ <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--for-->
+ <!--[--><span>a</span><span>b</span><span>c</span><span>d</span><!--for--><span></span></div>"
`,
)
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div><span></span>
- <!--[--><span>c</span><span>d</span><!--]-->
- <!--[--><span>c</span><span>d</span><!--]-->
- <span></span></div>"
+ <!--[--><span>c</span><span>d</span><!--for-->
+ <!--[--><span>c</span><span>d</span><!--for--><span></span></div>"
`,
)
})
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div>
- <!--[--><div>comp</div><div>comp</div><div>comp</div><!--]-->
- </div>"
+ <!--[--><div>comp</div><div>comp</div><div>comp</div><!--for--></div>"
`,
)
expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
`
"<div>
- <!--[--><div>comp</div><div>comp</div><div>comp</div><div>comp</div><!--]-->
- </div>"
+ <!--[--><div>comp</div><div>comp</div><div>comp</div><div>comp</div><!--for--></div>"
`,
)
})
<!--[-->
<!--[--><span>a</span><!--]-->
<!--[--><span>b</span><!--]-->
- <!--[--><span>c</span><!--]-->
- <!--]-->
+ <!--[--><span>c</span><!--for--><!--]-->
</div>"
`,
)
<!--[-->
<!--[--><span>a</span><!--]-->
<!--[--><span>b</span><!--]-->
- <!--[--><span>c</span><span>d</span><!--slot--><!--]-->
- <!--]-->
+ <!--[--><span>c</span><span>d</span><!--slot--><!--for--><!--]-->
</div>"
`,
)
<!--[-->
<!--[--><div>foo</div>-bar-<!--]-->
<!--[--><div>foo</div>-bar-<!--]-->
- <!--[--><div>foo</div>-bar-<!--]-->
- <!--]-->
+ <!--[--><div>foo</div>-bar-<!--for--><!--]-->
</div>"
`,
)
<!--[-->
<!--[--><div>foo</div>-bar-<!--]-->
<!--[--><div>foo</div>-bar-<!--]-->
- <!--[--><div>foo</div>-bar-<div>foo</div>-bar-<!--]-->
- <!--]-->
+ <!--[--><div>foo</div>-bar-<div>foo</div>-bar-<!--for--><!--]-->
</div>"
`,
)
`
"
<!--[-->
- <!--[--><span>a</span><span>b</span><span>c</span><!--]-->
- <!--]-->
+ <!--[--><span>a</span><span>b</span><span>c</span><!--for--><!--]-->
"
`,
)
`
"
<!--[-->
- <!--[--><div>a</div><div>b</div><div>c</div><!--]-->
+ <!--[--><div>a</div><div>b</div><div>c</div><!--for-->
<!--[--><span>foo</span><!--]-->
- <!--[--><div>a</div><div>b</div><div>c</div><!--]-->
- <!--]-->
+ <!--[--><div>a</div><div>b</div><div>c</div><!--for--><!--]-->
"
`,
)
`
"
<!--[-->
- <!--[--><div>a</div><div>b</div><div>c</div><div>d</div><!--]-->
+ <!--[--><div>a</div><div>b</div><div>c</div><div>d</div><!--for-->
<!--[--><span>foo</span><!--]-->
- <!--[--><div>a</div><div>b</div><div>c</div><div>d</div><!--]-->
- <!--]-->
+ <!--[--><div>a</div><div>b</div><div>c</div><div>d</div><!--for--><!--]-->
"
`,
)
})
})
- describe.todo('transition', async () => {
- test('transition appear', async () => {})
+ describe('transition', async () => {
+ test('transition appear', async () => {
+ const { container } = await testHydration(
+ `<template>
+ <transition appear>
+ <div>foo</div>
+ </transition>
+ </template>`,
+ )
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<div style="" class="v-enter-from v-enter-active">foo</div>"`,
+ )
+ expect(`mismatch`).not.toHaveBeenWarned()
+ })
- test('transition appear with v-if', async () => {})
+ test('transition appear work with pre-existing class', async () => {
+ const { container } = await testHydration(
+ `<template>
+ <transition appear>
+ <div class="foo">foo</div>
+ </transition>
+ </template>`,
+ )
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<div class="foo v-enter-from v-enter-active" style="">foo</div>"`,
+ )
+ expect(`mismatch`).not.toHaveBeenWarned()
+ })
- test('transition appear with v-show', async () => {})
+ test('transition appear work with empty content', async () => {
+ const data = ref(true)
+ const { container } = await testHydration(
+ `<template>
+ <transition appear>
+ <slot v-if="data"></slot>
+ <span v-else>foo</span>
+ </transition>
+ </template>`,
+ undefined,
+ data,
+ )
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<!--slot--><!--if-->"`,
+ )
+ expect(`mismatch`).not.toHaveBeenWarned()
+
+ data.value = false
+ await nextTick()
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<span class="v-enter-from v-enter-active">foo</span><!--if-->"`,
+ )
+ })
+
+ test('transition appear with v-if', async () => {
+ const data = ref(false)
+ const { container } = await testHydration(
+ `<template>
+ <transition appear>
+ <div v-if="data">foo</div>
+ </transition>
+ </template>`,
+ undefined,
+ data,
+ )
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<!--if-->"`,
+ )
+ expect(`mismatch`).not.toHaveBeenWarned()
+ })
+
+ test('transition appear with v-show', async () => {
+ const data = ref(false)
+ const { container } = await testHydration(
+ `<template>
+ <transition appear>
+ <div v-show="data">foo</div>
+ </transition>
+ </template>`,
+ undefined,
+ data,
+ )
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<div style="display:none;" class="v-enter-from v-enter-active v-leave-from v-leave-active">foo</div>"`,
+ )
+ expect(`mismatch`).not.toHaveBeenWarned()
+ })
- test('transition appear w/ event listener', async () => {})
+ test('transition appear w/ event listener', async () => {
+ const { container } = await testHydration(
+ `<script setup>
+ import { ref } from 'vue'
+ const count = ref(0)
+ </script>
+ <template>
+ <transition appear>
+ <button @click="count++">{{ count }}</button>
+ </transition>
+ </template>`,
+ )
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<button style="" class="v-enter-from v-enter-active">0</button>"`,
+ )
+
+ triggerEvent('click', container.querySelector('button')!)
+ await nextTick()
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `"<button style="" class="v-enter-from v-enter-active">1</button>"`,
+ )
+ })
})
describe.todo('async component', async () => {
import {
+ type BaseTransitionProps,
type GenericComponentInstance,
type TransitionElement,
type TransitionHooks,
baseResolveTransitionHooks,
checkTransitionMode,
currentInstance,
+ isTemplateNode,
leaveCbKey,
+ queuePostFlushCb,
resolveTransitionProps,
useTransitionState,
warn,
import { extend, isArray } from '@vue/shared'
import { renderEffect } from '../renderEffect'
import { isFragment } from '../fragment'
+import {
+ currentHydrationNode,
+ isHydrating,
+ setCurrentHydrationNode,
+} from '../dom/hydration'
const decorate = (t: typeof VaporTransition) => {
t.displayName = 'VaporTransition'
export const VaporTransition: FunctionalVaporComponent = /*@__PURE__*/ decorate(
(props, { slots, attrs }) => {
+ // wrapped <transition appear>
+ let resetDisplay: Function | undefined
+ if (
+ isHydrating &&
+ currentHydrationNode &&
+ isTemplateNode(currentHydrationNode)
+ ) {
+ // replace <template> node with inner child
+ const {
+ content: { firstChild },
+ parentNode,
+ } = currentHydrationNode
+ if (firstChild) {
+ if (
+ firstChild instanceof HTMLElement ||
+ firstChild instanceof SVGElement
+ ) {
+ const originalDisplay = firstChild.style.display
+ firstChild.style.display = 'none'
+ resetDisplay = () => (firstChild.style.display = originalDisplay)
+ }
+
+ parentNode!.replaceChild(firstChild, currentHydrationNode)
+ setCurrentHydrationNode(firstChild)
+ }
+ }
+
const children = (slots.default && slots.default()) as any as Block
if (!children) return
const { mode } = props
checkTransitionMode(mode)
- let resolvedProps
+ let resolvedProps: BaseTransitionProps<Element>
let isMounted = false
renderEffect(() => {
resolvedProps = resolveTransitionProps(props)
})
}
- applyTransitionHooks(
+ const hooks = applyTransitionHooks(
children,
{
state: useTransitionState(),
fallthroughAttrs,
)
+ if (resetDisplay && resolvedProps!.appear) {
+ const child = findTransitionBlock(children)!
+ hooks.beforeEnter(child)
+ resetDisplay()
+ queuePostFlushCb(() => hooks.enter(child))
+ }
+
return children
},
)