transition之页面切换过渡动画

推荐文章 ---------transition之页面切换过渡动画

实现步骤

1.0 使用 <transition></transition>组件包裹动态路由组件<router-view></router-view>

vue 中常见的内置组件:
 <transition>  </transition>
 <keep-alive> </keep-alive>
  <router-view></router-view>

在实际项目中,我们往往会使用transition实现路由组件之间的动画切换效果,也会使用keep-alive防止重新渲染,所以就会涉及到包裹的顺序

<template>
  <div class="myindex">
    <transition :name="transitionName">
      <keep-alive>
        <router-view v-if="this.$route.meta.keepAlive"></router-view>
      </keep-alive>
    </transition>
    <transition :name="transitionName">
      <router-view v-if="!this.$route.meta.keepAlive"></router-view>
    </transition>
    <TabBar />
  </div>
</template>
2.0 在路由设置中设置meta的index的值,通过index值的大小控制页面跳转层级顺序
import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)
const routes = [
  { path: '*', component: ()=> import('@/views/NotFound') },
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/',
    component: () => import('@/views/Index'),
    children: [
      {
        path: 'home',
        name: 'home',
        meta: { 
          keepAlive: true,
          index:0
         },// 这个子组件需要缓存 true
        component: () => import('@/views/Home')
      },

      {
        path: 'qanda',
        name: 'qanda',
        meta: { keepAlive: false,  index:1 },
        component: () => import('@/views/QA')
      },
      {
        path: 'video',
        name: 'video',
        meta: { keepAlive: false,  index:2 },
        component: () => import('@/views/Video')
      },
      {
        path: 'wode',
        name: 'wode',
        meta: { keepAlive: false,  index:3 },// 这个子组件不需要缓存 
        component: () => import('@/views/Wode')
      },
    ]
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login')
  }
]

const router = new VueRouter({
  routes
})

export default router

3.0 使用watch属性 监听$route的变化来比较to和from对应的的路由配置中的meta的index,决定动画效果(如 前进向左滑动(下一页),后退向右滑动(上一页))

<template>
  <div class="myindex">
    <transition :name="transitionName">
      <keep-alive>
        <router-view v-if="this.$route.meta.keepAlive"></router-view>
      </keep-alive>
    </transition>
    <transition :name="transitionName">
      <router-view v-if="!this.$route.meta.keepAlive"></router-view>
    </transition>
    <TabBar />
  </div>
</template>
<script>
export default {
  data() {
    return {
        transitionName:''
    };
  },
  watch: {
    //使用watch 监听$router的变化
    $route(to, from) {
      //如果to的索引值为0,不添加任何动画;如果to索引大于from索引,判断为前进状态,反之则为后退状态
      if (to.meta.index > 0) {
        if (to.meta.index < from.meta.index) {
          this.transitionName = "slide-right";
        } else {
          this.transitionName = "slide-left";
        }
      } else if (to.meta.index == 0 && from.meta.index > 0) {
        this.transitionName = "slide-right";
      }
    }
  }
};
</script>
<style>
	.slide-right-enter-active,
	.slide-right-leave-active,
	.slide-left-enter-active,
	.slide-left-leave-active {
	  will-change: transform;
	  transition: all 0.3s;
	  position: absolute;
	  width: 100%;
	  left: 0;
	}
	.slide-right-enter {
	  transform: translateX(-100%);
	}
	.slide-right-leave-active {
	  transform: translateX(100%);
	}
	.slide-left-enter {
	  transform: translateX(100%);
	}
	.slide-left-leave-active {
	  transform: translateX(-100%);
	}
</style>

值得注意:
防止出现组件切换从中间向上的切换效果,一定要给过渡的类选择器中添加 : position:absolute

.slide-right-enter-active,
.slide-right-leave-active,
.slide-left-enter-active,
.slide-left-leave-active {
  will-change: transform;
  transition: all 0.3s;
  /* 一定 要使用绝对定位*/
  position: absolute;
  width: 100%;
  left: 0;
}

总结:
transition组件 使用 动态绑定 name 的方式 实现 多组件之间的切换过渡效果,想要实现过渡效果需要配合过渡的css类名:
  name-enter:定义进入过渡的开始状态
  name-enter-active:定义进入活动状态
  name-enter-to:定义进入的结束状态
  name-leave:定义离开过渡的开始状态
  name-leave-active:定义离开的活动状态
  name-leave-to:定义离开的结束状态
transition 组件有两种过渡模式:使用 mode属性设置
   in-out:新元素先进入过渡,完成之后当前元素过渡离开,默认模式
  out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入

发布了102 篇原创文章 · 获赞 14 · 访问量 7055

猜你喜欢

转载自blog.csdn.net/weixin_42060658/article/details/104829974