Skip to content

过渡特效

1. 快速上手

为路由切换添加过渡效果,其实就是使用 Transition 内置组件,没有其他新知识。

vue
<router-view v-slot="{ Component }">
  <Transition name="fade" mode="out-in">
    <component :is="Component" />
  </Transition>
</router-view>

2. 相关细节

单个路由的过渡

单个路由的过渡:

  • 如果对不同的路由的过渡有需求,那么可以通过以下的设置来做:
    • meta:设置元数据,上面记录过渡的方式
    • RouterView 插槽,通过插槽拿到 route,从而拿到元数据里面的过渡方式
    • <Transition>组件设置不同的 name 值从而应用不同的过渡方式

router/index.js

js
const routes = [
  {
    path: "/",
    name: "Home",
    component: Home,
    //指定过渡效果
    meta: { transition: "fade" },
  },
  {
    path: "/login",
    name: "Login",
    component: Login,
    meta: { transition: "fade" },
  },
  {
    path: "/user",
    name: "User",
    component: User,
    meta: {
      transition: "fade",
    },
  },
  {
    path: "/admin",
    name: "Admin",
    component: Admin,
    meta: {
      transition: "slide-left",
    },
  },
];

App.vue

vue
<template>
 <router-view v-slot="{ Component, route }">
    <transition :name="route.meta.transition" mode="out-in">
      <component :is="Component" />
    </transition>
  </router-view>
</template>

<style>
/* 淡入淡出 */
.fade-enter-active,
.fade-leave-active {
  transition: 0.2s;
}
.fade-enter-from,
.fade-leave-to {
  opacity: 0;
}

/* 滑动 */
.slide-left-enter-active,
.slide-left-leave-active {
  transition: 0.3s;
}

.slide-left-enter-from,
.slide-left-leave-to {
  transform: translateX(-100%);
}
</style>

路由动态过渡

基于路由动态过渡

这里可以使用导航守卫(全局后置守卫)来添加过渡效果

由此可见,组件的渲染阶段在进入路由之后

js
//使用路由全局后置守卫
router.afterEach((to) => {
  switch (to.path) {
    case '/panel-left':
      to.meta.transition = 'slide-left'
      break
    case '/panel-right':
      to.meta.transition = 'slide-right'
      break
    default:
      to.meta.transition = 'fade'
  }
})

使用Key强制渲染

使用Key:Vue 可能会自动复用看起来相似的组件,从而忽略了任何过渡,可以添加一个 key 属性来强制过渡。


-EOF-

MIT License