最近再寫頁面的時候,感覺頁面之間的切換有點生硬,所以查了一下文檔看見了transition這個組建,很實用,故此在這里跟大家分享一下
---------------------------------------------------------
---------------------------------------------------------
---------------------------------------------------------
1、解決這個問題的難點就是如何來確定路由是前進還是后退的問題,下面是解決的方案
a) 我們需要給各個頁面定義層級,在切換路由時判斷用戶是進入哪一層頁面,如果用戶進入更高層級那么做前進動畫,如果用戶退到低層級那么做后退動畫.
router/index.js
1 import VueRouter from 'vue-router' 2 import Home from '../components/home/home' 3 import User from '../components/user/user' 4 var router = new VueRouter({ 5 routes:[{ 6 name:'test', 7 path:'/', 8 meta:{index:0}, // meta對象的index用來定義當前路由的層級,由小到大,由低到高 9 component:{template:'<div>test</div>' }}, 10 { 11 name:'home', 12 path:'/home', 13 meta:{index:1}, 14 component:Home 15 }, 16 { 17 name:'user', 18 path:'/user/:id', 19 meta:{index:2}, 20 component:User 21 }] 22 } 23 }); 24
監控路由跳轉,判斷切換頁面之間的層級關系,並以此來判斷路由前進或者后退.
1 <template> 2 <div id="app"> 3 <transition :name="transitionName"> 4 <router-view></router-view> 5 </transition> 6 </div> 7 </template> 8 <script> 9 export default { 10 name: 'App', 11 data () { 12 return { 13 transitionName:'' 14 } 15 }, 16 watch: { 17 // 使用watch 監聽$router的變化 18 $route (to, from) { 19 // 如果to索引大於from索引,判斷為前進狀態,反之則為后退狀態 20 if (to.meta.index > from.meta.index){ 21 // 設置動畫名稱 22 this.transitionName = 'slide-left'; 23 } else{ 24 this.transitionName = 'slide-right'; 25 } 26 } 27 } 28 } 29 </script> 30
編寫slide-left 和 slide-right 類的動畫
1 .slide-right-enter-active, 2 .slide-right-leave-active, 3 .slide-left-enter-active, 4 .slide-left-leave-active { 5 will-change: transform; 6 transition: all 500ms; 7 position: absolute; 8 }.slide-right-enter { 9 opacity: 0; 10 transform: translate3d(-100%, 0, 0); 11 }.slide-right-leave-active { 12 opacity: 0; 13 transform: translate3d(100%, 0, 0); 14 }.slide-left-enter { 15 opacity: 0; 16 transform: translate3d(100%, 0, 0); 17 }.slide-left-leave-active { 18 opacity: 0; 19 transform: translate3d(-100%, 0, 0); 20 }