vue-router自動判斷左右翻頁轉場動畫


  前段時間做了一個移動端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:

<!-- keepAlList是用來動態判斷組件是否需要keep-alive,建議保存到vuex中作為全局變量,至於下方的css動畫,看官可以按照喜好自由修改-->
<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片段(用來在跳轉頁面之前動態設置轉場動畫)

  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,
          },
        }
      });
    }
  }
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM