Skip to content

TransitionGroup doesn't render a wrapper element by default in Vue 3, it uses a Fragment #648

Closed
@crutch12

Description

@crutch12

What problem does this feature solve?

I suddenly found out that vue2 <TransitionGroup/> component transforms into <span/> tag.

Vue2:

<TransitionGroup name="vue2" class="vue2-class">
  <span key="1" class="class-1">1</span>
  <span key="2" class="class-2">2</span>
</TransitionGroup>

compiles to

<span class="vue2-class">
  <span class="class-1">1</span>
  <span class="class-2">2</span>
</span>

Meanwhile vue3 <TransitionGroup/> doesn't create element in DOM, so it breaks previous behaviour and old code.

Vue3:

<TransitionGroup name="vue3" class="vue3-class">
  <span key="1" class="class-1">1</span>
  <span key="2" class="class-2">2</span>
</TransitionGroup>

compiles to

<span class="class-1">1</span>
<span class="class-2">2</span>

Also Vue3:

<TransitionGroup name="vue3" class="vue3-class">
  <span key="1" class="class-1">1</span>
</TransitionGroup>

compiles to

<span class="class-1 vue3-class">1</span>

It moves classes from <TransitionGroup/> to single child.

What does the proposed API look like?

We should add this info to vue3 migration guide (maybe here: https://v3.vuejs.org/guide/migration/transition.html#overview)

The fastest way to migrate: wrap your <TransitionGroup/> with new <span/>:

Before:

<TransitionGroup name="vue2" class="vue2-class">
  <span key="1" class="class-1">1</span>
  <span key="2" class="class-2">2</span>
</TransitionGroup>

After:

<span class="vue3-class">
  <TransitionGroup name="vue3">
    <span key="1" class="class-1">1</span>
    <span key="2" class="class-2">2</span>
  </TransitionGroup>
</span>

UPD:

Checked vue2 docs: https://v3.vuejs.org/guide/transitions-list.html#list-transitions
And vue3 docs: https://v3.vuejs.org/guide/transitions-list.html#list-transitions

Unlike <transition>, it renders an actual element: a <span> by default. You can change the element that's rendered with the tag attribute.

So it looks like a vue3 <transition-group/> bug. Or v3 docs are wrong.

The fastest way to fix your code: add tag="span" to <transition-group/>

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions