Vue 3 -< Transition>渲染无法设置动画的非元素根节点

exdqitrt  于 2022-12-14  发布在  Vue.js
关注(0)|答案(9)|浏览(172)

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()
    }
  }
}

有什么窍门可以修复这个错误吗?谢谢你的提示!

1l5u6lss

1l5u6lss1#

没有。

<template>
  <div></div>
  <div>~someone~</div>
</template>

是的,我知道

<template>
  <div>
    <div></div>
    ~someone~
  </div>
</template>

如果您没有在“Template”标签内使用“div”标签,您将得到相同的错误。(顺便说一下,可以使用除div标签之外的其他标签)

bmvo0sr5

bmvo0sr52#

转换需要单个子节点,因此可以将<component>标记 Package 在<div>中,但是,<transition>中的普通<div>不会触发转换,但更改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

ix0qys7i

ix0qys7i3#

我不能完全相信这一点...但我也遇到了类似的问题,问题是我的视图中有多个节点,并发现了guy's post on the Vue.js forums
我也发现了我的错误。过渡需要组件中的单个根节点!由于Vue 3不再需要组件的单个根节点,我认为这也适用于transitions。但这也是合乎逻辑的。CSS需要过渡可以引用的单个根节点。

4ktjp1zp

4ktjp1zp4#

当在具有相同标签名称的元素之间切换时,你必须通过赋予它们唯一的键属性来告诉Vue它们是不同的元素。否则,Vue的编译器只会为了效率而替换元素的内容。即使在技术上没有必要,在一个组件中总是键控多个项也被认为是一种好的做法。

<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>
yeotifhr

yeotifhr5#

我解决了它,这是一个小错误,有一个字符外的html标签,直接在标签后(逗号)。

<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>
2ekbmq32

2ekbmq326#

你动态组件示例必须有一个根元素。2在你的例子中,′ Swiper ′和′ SwiperSlide ′必须有一个根元素!

7gcisfzg

7gcisfzg7#

不要在路由器的component参数中使用RouterView.如果你需要那样做,把它放在根元素里面

ig9co6j1

ig9co6j18#

<router-view v-slot="{ Component }">
 <transition name="fade" mode="out-in" appear>
  <!-- root element -->
  <div>
    <component :is="Component"></component>
  </div>
 </transition>
</router-view>
f4t66c6m

f4t66c6m9#

我使用Nuxt3的一个解决方案:
父页面为:

<template>
  <NuxtPage />
</template>

但也应该 Package 到根节点中:

<template>
  <div>
    <NuxtPage />
  </div>
</template>

否则我会得到一个过渡异常:
<Transition>内部的组件呈现无法设置动画的非元素根节点

相关问题