<transition-group>
component of Vue should be used properly
- VUE_BAD_TRANSITION_GROUP
- Error
- Medium
- vue
This rule applies when <transition-group>
component of Vue is wrongly used.
It can be applied to the following cases:
<transition>
is used on multiple elements. In this case, Vue renders only the first child and ignores the rest. You can fix this problem by applying one of the following:- Use
<transition-group>
instead of<transition>
if the effect is intended for each child separately. - Use a wrapper element for the children if the effect is intended for the children as a whole.
- Select one child by using conditional directives like
v-if
.
- Use
- Elements inside
<transition-group>
do not havekey
attribute. In this case, the elements withoutkey
will not be rendered.
Noncompliant Code Example
View with compliant examples side by side<template>
<div>
<!-- Example 1 -->
<transition> <!-- VUE_BAD_TRANSITION_GROUP alarm because '<transition>' has three elements as children. -->
<button key="saved">
Edit
</button>
<button key="edited">
Save
</button>
<button key="editing">
Cancel
</button>
</transition>
<!-- Example 2 -->
<transition name="list"> <!-- VUE_BAD_TRANSITION_GROUP alarm because the child element has 'v-for'. That means, it will be rendered as multiple elements. -->
<span v-for="item in items" v-bind:key="item.id" class="list-item">
{{ item }}
</span>
</transition>
<!-- Example 3 -->
<transition-group name="list" tag="p">
<span v-for="item in items" class="list-item"> <!-- VUE_BAD_TRANSITION_GROUP alarm because '<span>' does not have 'key' attribute. -->
{{ item }}
</span>
</transition-group>
</div>
</template>
Compliant Code Example
View with noncompliant examples side by side<template>
<div>
<!-- Example 1 -->
<transition>
<button v-if="docState === 'saved'" key="saved">
Edit
</button>
<button v-if="docState === 'edited'" key="edited">
Save
</button>
<button v-if="docState === 'editing'" key="editing">
Cancel
</button>
</transition>
<!-- Example 2 -->
<transition-group name="list">
<span v-for="item in items" v-bind:key="item.id" class="list-item">
{{ item }}
</span>
</transition-group>
<!-- Example 3 -->
<transition-group name="list" tag="p">
<span v-for="item in items" v-bind:key="item.id" class="list-item">
{{ item }}
</span>
</transition-group>
</div>
</template>
Version
This rule was introduced in DeepScan 1.17.0-beta.
See
[Vue warn]: <transition> can only be used on a single element. Use <transition-group> for lists.
[Vue warn]: <transition-group> children must be keyed: <span>