App.vue 有一个
transition
标签来淡出和淡入页面。
<router-view v-slot="{ Component }">
<transition name="fade" mode="out-in" appear>
<component :is="Component"></component>
</transition>
</router-view>
Page.vue 文件具有简单的结构,但是,它还有一个基本的 sliderjs 组件,该组件会抛出错误
<Transition> renders non-element root node that cannot be animated.
如果删除 transition
标签,则一切正常。
<div v-if="page.isReady">
<swiper>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</div>
该文件还具有以下内容:
import { Swiper, SwiperSlide } from 'swiper/vue';
import 'swiper/swiper.scss';
export default {
components: {
Swiper,
SwiperSlide,
},
setup () {
return {
page: usePage()
}
}
}
有什么技巧可以解决这个错误吗?感谢您的任何提示!
没有。
<template>
<div></div>
<div>~someone~</div>
</template>
是的。
<template>
<div>
<div></div>
~someone~
</div>
</template>
如果您不在“Template”标签内使用“div”标签,您将收到相同的错误。 (顺便说一下,可以使用除 div 标签之外的其他标签)
转换需要单个子节点。因此,您可以将
<component>
标签包装在 <div>
内,但是,<div>
内的普通 <transition>
不会触发转换,但更改 key
属性会触发转换。
我们可以通过获取路由名称来获取唯一的key:
<router-view v-slot="{ Component, route }">
<transition name="fade" mode="out-in">
<div :key="route.name">
<component :is="Component"></component>
</div>
</transition>
</router-view>
这将有效地在具有不同名称的路由之间进行转换,但如果您还想在具有不同参数的同名路由之间进行转换,则可以使用
route.fullPath
而不是 route.name
作为 key
。
我不能完全相信这个……但我遇到了类似的问题,问题是我的视图中有多个节点,并在 Vue.js 论坛上找到了这个人的帖子:
也发现了我的错误。转换需要组件中的单根!由于 Vue 3 不再需要组件的单个根节点,我认为这也适用于
transitions
。 但这也是合乎逻辑的。 CSS 需要一个可供过渡引用的根。
<div>
<router-link to="/"></router-link>
<router-link to="/about"></router-link>
</div>
<router-view v-slot="{ Component, route }">
<transition name="route" :key="route" mode="out-in">
<component :is="Component" />
</transition>
</router-view>
<template>,
<div>
<div>
<swiper>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</div>
</div>
</template>
RouterView
参数中使用
component
。如果您需要这样做,请将其放入根元素中
<router-view v-slot="{ Component }">
<transition name="fade" mode="out-in" appear>
<!-- root element -->
<div>
<component :is="Component"></component>
</div>
</transition>
</router-view>
父页面是:
<template>
<NuxtPage />
</template>
但也应该包装到根节点中:
<template>
<div>
<NuxtPage />
</div>
</template>
否则我会遇到转换异常:
组件内部
<Transition>
渲染无法动画的非元素根节点
<template>
<router-view v-slot="slotProps">
<transition name="route" mode="out-in">
<component :is="slotProps.Component"></component>
</transition>
</router-view>
</template>
import 'animate.css';
<template>
<router-view #default="{Component}">
<transition :enter-active-class="`animate__animated animate__bounceIn`">
<component :is="Component"></component>
</transition>
</router-view>
</template>
示例: 这不能动画化
<template>
<item1 />
<item2 />
</template>
这可以动画化
<template>
<div>
<item1 />
<item2 />
</div>
</template>
VUE 一次只能对一个元素进行动画处理,因此始终在模板的第一层定义一个元素,它可以是“div”或“span”,无论如何,通常是 div