最近公司項(xiàng)目比較少終于有空來(lái)記錄一下自己對(duì)vue-router的一些小小的使用心得,
一般的移動(dòng)端口單頁(yè)應(yīng)用在跳轉(zhuǎn)頁(yè)面時(shí)候會(huì)有相應(yīng)的轉(zhuǎn)場(chǎng)動(dòng)畫,比如:
1. 從當(dāng)前一級(jí)頁(yè)面跳轉(zhuǎn)二級(jí)頁(yè)面需要展示的轉(zhuǎn)場(chǎng)動(dòng)畫是一級(jí)頁(yè)面向屏幕左邊移動(dòng)消失的同時(shí),
二級(jí)頁(yè)面從屏幕的右邊向左邊移動(dòng)出現(xiàn)。(類似翻書翻到下一頁(yè)的效果)
2. 從當(dāng)前二級(jí)頁(yè)面跳回一級(jí)頁(yè)面需要展示的轉(zhuǎn)場(chǎng)動(dòng)畫是二級(jí)頁(yè)面向屏幕右邊移動(dòng)消失的同時(shí),
一級(jí)頁(yè)面從屏幕的左邊向右邊移動(dòng)出現(xiàn)。類似(翻書翻回到上一頁(yè)的效果)
但是出現(xiàn)了一個(gè)問題:如何判斷當(dāng)前頁(yè)面和將要跳轉(zhuǎn)頁(yè)面之間的層級(jí)關(guān)系呢?
我的解決辦法是:創(chuàng)建頁(yè)面 (組件)時(shí),在定義頁(yè)面的router里通過設(shè)置頁(yè)面的path(訪問路徑 )屬性來(lái)區(qū)分組件之間的層級(jí)關(guān)系。
比如一個(gè)一級(jí)頁(yè)面 (組件) ‘A' 的訪問路徑為 ‘/A' 。他的二級(jí)頁(yè)面 ‘B' 的訪問路徑為 ‘/A/B' .
那么在跳轉(zhuǎn)頁(yè)面之前,只需要比較當(dāng)前頁(yè)面和將要跳轉(zhuǎn)到的頁(yè)面的路徑深度就可以動(dòng)態(tài)設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫了。
比如 ‘/A/B'的深度 > ‘/A' 的深度那么 從B頁(yè)面跳轉(zhuǎn)到A頁(yè)面就應(yīng)該是 效果2:(翻書翻回到上一頁(yè)的效果).
一 。首先父頁(yè)面
home.vue:
<!-- keepAlList是用來(lái)動(dòng)態(tài)判斷組件是否需要keep-alive,建議保存到vuex中作為全局變量,至于下方的css動(dòng)畫,看官可以按照喜好自由修改--> <transition :name="transNa"> <keep-alive :include="keepAlList"> <router-view class="child-view"></router-view> </keep-alive> </transition> <style scoped> .child-view { position: absolute; width: 100%; height: 100%; transition: all .5s ease; -webkit-transition: all .5s ease; -moz-transition: all .5s ease; } .rightin-enter, .leftin-leave-active { opacity: 0; transform: translate3d(50% 0, 0); -webkit-transform: translate3d(50%, 0, 0); -moz-transform: translate3d(50%, 0, 0); } .leftin-enter, .rightin-leave-active { opacity: 0; transform: translate3d(-50% 0, 0); -webkit-transform: translate3d(-50%, 0, 0); -moz-transform: translate3d(-50%, 0, 0); } </style>
二 。其次附上我的main.js片段(用來(lái)在跳轉(zhuǎn)頁(yè)面之前動(dòng)態(tài)設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫)
main.js:
//進(jìn)入路由之前設(shè)置攔截器 let noLoginList = ["login", "register", "forget", "home", "classify", "goodsDetial"]; router.routeInfo.beforeEach((to, from, next) => { let user = sessionStorage.getItem('user'); //如果要去登錄頁(yè)面 if (noLoginList.indexOf(to.name) >= 0) { if (!user || user == '') { //未登錄的狀態(tài)通行 next(); return; } else { if (["login", "register", "forget"].indexOf(to.name) >= 0) { //已登錄的狀態(tài)去首頁(yè) next({ name: 'home' }); return; } else { //已登錄的狀態(tài)去首頁(yè) next(); return; } } } else { //去登錄頁(yè)面以外的頁(yè)面(以下是本文關(guān)鍵代碼) if (user && user != '') { //判斷是否為需要緩存組件,如果是添加組件名到數(shù)組 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); } //根據(jù)路徑名深度設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫類型 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, }, } }); } } });
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com