<template>
<div id="app">
<router-view class="router-view" v-slot="{ Component }">
<transition :name="transitionName">
<component :is="Component" />
</transition>
</router-view>
</div>
</template>
<script>
export default {
data () {
return {
transitionName: 'slide-left'
}
},
watch: {
$route (to, from) {
if (to.meta.index > from.meta.index) {
this.transitionName = 'slide-left'
console.log('slide-left')
} else if (to.meta.index < from.meta.index) {
this.transitionName = 'slide-right'
console.log('slide-right')
} else {
this.transitionName = ''
}
}
}
}
</script>
<style lang="stylus">
#app {
height: 100%;
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #2c3e50;
}
.router-view{
width: 100%;
height: auto;
position: absolute;
top: 0;
bottom: 0;
margin: 0 auto;
-webkit-overflow-scrolling: touch;
}
.slide-right-enter-active,
.slide-right-leave-active,
.slide-left-enter-active,
.slide-left-leave-active{
height: 100%;
will-change: transform;
transition: all 500ms cubic-bezier(.55,0,.1,1);
position: absolute;
backface-visibility: hidden;
}
.slide-right-enter-active{
opacity: 0;
transform: translate3d(-100%, 0, 0);
}
.slide-right-leave-active{
opacity: 0;
transform: translate3d(100%, 0, 0);
}
.slide-left-enter-active{
opacity: 0;
transform: translate3d(100%, 0, 0);
}
.slide-left-leave-active{
opacity: 0;
transform: translate3d(-100%, 0, 0);
}
</style>
router中需要对页面mate设置index,用以判断向左向右滑动
[{
path: '/myPage',
name: 'MyPage',
component: () => import('@/views/MyPage.vue'),
meta: { index: 1 }
},
{
path: '/mySecondPage',
name: 'MySecondPage',
component: () => import('@/views/MySecondPage.vue'),
meta: { index: 2 }
}]