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>
https://swiperjs.com/vue/
该文件还包含以下内容:
import { Swiper, SwiperSlide } from 'swiper/vue';
import 'swiper/swiper.scss';
export default {
components: {
Swiper,
SwiperSlide,
},
setup () {
return {
page: usePage()
}
}
}
有什么窍门可以修复这个错误吗?谢谢你的提示!
9条答案
按热度按时间1l5u6lss1#
没有。
是的,我知道
如果您没有在“Template”标签内使用“div”标签,您将得到相同的错误。(顺便说一下,可以使用除div标签之外的其他标签)
bmvo0sr52#
转换需要单个子节点,因此可以将
<component>
标记 Package 在<div>
中,但是,<transition>
中的普通<div>
不会触发转换,但更改key
属性会触发转换。我们可以通过获取路由名称来获得唯一密钥:
这将有效地在具有不同名称的路由之间进行转换,但是如果您还希望在具有不同参数的同名路由之间进行转换,则可以使用
route.fullPath
代替route.name
作为key
。ix0qys7i3#
我不能完全相信这一点...但我也遇到了类似的问题,问题是我的视图中有多个节点,并发现了guy's post on the Vue.js forums:
我也发现了我的错误。过渡需要组件中的单个根节点!由于Vue 3不再需要组件的单个根节点,我认为这也适用于
transitions
。但这也是合乎逻辑的。CSS需要过渡可以引用的单个根节点。4ktjp1zp4#
当在具有相同标签名称的元素之间切换时,你必须通过赋予它们唯一的键属性来告诉Vue它们是不同的元素。否则,Vue的编译器只会为了效率而替换元素的内容。即使在技术上没有必要,在一个组件中总是键控多个项也被认为是一种好的做法。
yeotifhr5#
我解决了它,这是一个小错误,有一个字符外的html标签,直接在标签后(逗号)。
2ekbmq326#
你动态组件示例必须有一个根元素。2在你的例子中,′ Swiper ′和′ SwiperSlide ′必须有一个根元素!
7gcisfzg7#
不要在路由器的
component
参数中使用RouterView
.如果你需要那样做,把它放在根元素里面ig9co6j18#
f4t66c6m9#
我使用Nuxt3的一个解决方案:
父页面为:
但也应该 Package 到根节点中:
否则我会得到一个过渡异常:
<Transition>
内部的组件呈现无法设置动画的非元素根节点