Vue.js和微信小程序路由(頁面)跳轉攔截

前言

在開發有登陸功能的項目時,不可避免的須要在路由(頁面)跳轉時對當前用戶的權限進行必定的校驗。目前我使用的比較多的Vue.js提供了比較好的解決方案。在開發微信小程序時,發現官方目前並未提供相應的解決方案,根據以往的經驗本身實現了路由(頁面)跳轉攔截。在此對二者作一個簡單的對比。html

Vue.js的路由攔截

Vue.js官方稱之爲導航守衛。官方文檔很詳細,使用起來也比較簡單,此處就很少說了,簡單的示例代碼以下:vue

// routes/index.js
const router = new Router({
    routes: [{
            path: '/',
            name: 'Login',
            component: Login
        },
        {
            path: '/user',
            name: 'User',
            component: User,
            meta: {
                requireAuth: true
            }
        }]
});

// 全局導航鉤子
router.beforeEach((to, from, next) => {
    // meta.requireAuth爲true時才進行校驗
    if (to.meta.requireAuth) {
        // 此處使用vuex進行校驗,具體根據業務需求來
        store.dispatch('checkAuth');
        if (!store.state.checkAuth) {
            // rediect是爲了登陸後重定向到當前頁面
            next({
                path: '/',
                query: {
                    redirect: to.fullPath
                }
            });
        } else {
            next();
        }
    } else {
        next();
    }
});

微信小程序的路由攔截

由於微信小程序官方並無提供官方的解決方案,因此這裏只能本身去實現一個。若是對node.js比較熟悉的話,應該對express/koa框架中的常常提到的中間件概念比較熟悉,這裏就使用中間件的機制來處理。結合小程序中Page()函數和生命週期,具體代碼以下:node

// utils/filter.js
function loginCheck(pageObj) {
    if (pageObj.onLoad) {
        let _onLoad = pageObj.onLoad;
        // 使用onLoad的話須要傳遞options
        pageObj.onLoad = function (options) {
            if(wx.getStorageSync('USERID')) {
                // 獲取當前頁面
                let currentInstance = getPageInstance();
                _onLoad.call(currentInstance, options);

            } else {
                //跳轉到登陸頁
                wx.redirectTo({
                    url: "/pages/login/login"
                });
            }
        }
    }
    return pageObj;
}

// 獲取當前頁面    
function getPageInstance() {
    var pages = getCurrentPages();
    return pages[pages.length - 1];
}

exports.loginCheck = loginCheck;

以上,通用的過濾函數就寫好了。在須要使用的頁面引入該方法便可:vuex

// pages/user/user.js
const filter = require('../../utils/filter');
Page(filter.loginCheck({
    // ...
    onLoad: function (options) {
       // ...
    },
    // ...
}));

總結

相比Vue.js官方提供的路由攔截功能,本身實現微信小程序的路由攔截仍是存在必定的不足。好比:express

  1. 微信小程序須要進行路由攔截的每一個頁面都須要引入,幷包裝一層,使用起來仍是比較繁瑣的。
  2. Vue.js是每次跳轉到新的路由(頁面)前進行處理,校驗經過會跳轉到新頁面,不經過則直接跳轉到登錄頁面;而微信小程序這裏,會先跳轉到新頁面,校驗不經過會再次跳轉到登錄頁面。

目前在微信小程序這方面若是有比較好的解決方案的話,能夠相互交流一下。小程序

路由跳轉攔截是一個很是經常使用的功能,但願後續微信小程序官方能給出一個比較好的官方解決方案。微信小程序

相關文章
相關標籤/搜索