前段時間做了一個行動端spa項目,技術基於:vue + vue-router + vuex + mint-ui
因為使用了vue-cli腳手架的webpack模版,所有頁面都以.vue為後綴的檔案作為一個元件
最近公司專案比較少終於有空來記錄一下自己對vue-router的一些小小的使用心得,
一般的行動埠單頁應用在跳轉頁面時候會有對應的轉場動畫,例如:
1. 從目前一級頁面跳轉二級頁面需要展示的轉場動畫是一級頁面向螢幕左邊移動消失的同時,
二級頁面從螢幕的右邊向左邊移動出現。 (類似翻書翻到下一頁的效果)
2. 從目前二級頁面跳回一級頁面需要展示的轉場動畫是二級頁面向螢幕右邊移動消失的同時,
一級頁面從螢幕的左邊向右邊移動出現。類似(翻書翻回到上一頁的效果)
但是出現了一個問題:如何判斷當前頁面和將要跳轉頁面之間的層級關係呢?
我的解決方法是:建立頁面(元件)時,在定義頁面的router裡透過設定頁面的path(存取路徑 )屬性來區分元件之間的層級關係。
例如一個一級頁面 (元件) ‘A’ 的存取路徑為 #‘/A’ 。他的二級頁面 'B' 的訪問路徑為 '/A/B' .
那麼在跳轉頁面之前,只需要比較當前頁面和將要跳到的頁面的路徑深度就可以動態設定轉場動畫了。
例如 '/A/B'的深度 > '/A' 的深度那麼從B頁面跳到A頁面就應該是效果2:(翻書翻回上一頁的效果).
一。首先父頁面
home.vue:
scoped
.child-view { position: absolute; width: 100%; height: 100%; transition: all .5s ease; -webkit-transition: all .5s ease; -moz-transition: all .5s ease; }
<em><em><em>.rightin-enter,<br/>.leftin-leave-active {<br/> opacity: 0;<br/> transform: translate3d(50% 0, 0);<br/> -webkit-transform: translate3d(50%, 0, 0);<br/> -moz-transform: translate3d(50%, 0, 0);<br/>}<br/><br/>.leftin-enter,<br/>.rightin-leave-active {<br/> opacity: 0;<br/> transform: translate3d(-50% 0, 0);<br/> -webkit-transform: translate3d(-50%, 0, 0);<br/> -moz-transform: translate3d(-50%, 0, 0);<br/>}<br/><br/><span style="color: #0000ff;"></style></span></em></em></em>
二 。其次附上我的main.js片段(用來在跳轉頁面之前動態設定轉場動畫)
main.js:
//进入路由之前设置拦截器let noLoginList = ["login", "register", "forget", "home", "classify", "goodsDetial"]; router.routeInfo.beforeEach((to, from, next) => { let user = sessionStorage.getItem('user'); //如果要去登录页面 if (noLoginList.indexOf(to.name) >= 0) { if (!user || user == '') { //未登录的状态通行 next(); return; } else { if (["login", "register", "forget"].indexOf(to.name) >= 0) { //已登录的状态去首页 next({ name: 'home' }); return; } else { //已登录的状态去首页 next(); return; } } } else { //去登录页面以外的页面(以下是本文关键代码) if (user && user != '') { //判断是否为需要缓存组件,如果是添加组件名到数组 if (to.meta.keepAlive) { const toName = to.name; let keepLi = store.getters.getKeepAlList; keepLi.indexOf(toName) < 0 ? keepLi.push(toName) : ''; store.commit('SET_KEEPALLIST', keepLi); } //根据路径名深度设置转场动画类型 store.commit('SET_TRANSNA', (to.path.split('/').length < from.path.split('/').length ? 'leftin' : 'rightin')); next(); } else { let toWhere = router.nameList.indexOf(to.name) >= 0 ? to : {name: 'home'}; next({ name: 'login', params: { jumpTo: { name: toWhere.name, params: toWhere.params, query: toWhere.query, }, } }); } } });
以上是如何用vue-route實現自動判斷左右翻頁轉場動畫的詳細內容。更多資訊請關注PHP中文網其他相關文章!