Vue 2 required a single root element, so every component that logically returned two siblings had a wrapper div whose only purpose was satisfying the compiler.
<template>
<dt>{{ label }}</dt>
<dd>{{ value }}</dd>
</template>
<!-- and the cost: attribute inheritance is now ambiguous -->
<!-- v-bind="$attrs" has to be placed explicitly -->
The dt and dd case is the clearest example, because a wrapper div there produces invalid HTML that browsers silently repair — and the same applies to table rows and list items. The trade is that non-prop attributes no longer have an obvious destination, so a fragment component must place $attrs itself or a class passed by the caller lands nowhere. That is a warning in development and a silent no-op in production.