在開發有登陸功能的項目時,不可避免的須要在路由(頁面)跳轉時對當前用戶的權限進行必定的校驗。目前我使用的比較多的Vue.js提供了比較好的解決方案。在開發微信小程序時,發現官方目前並未提供相應的解決方案,根據以往的經驗本身實現了路由(頁面)跳轉攔截。在此對二者作一個簡單的對比。html
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
目前在微信小程序這方面若是有比較好的解決方案的話,能夠相互交流一下。小程序
路由跳轉攔截是一個很是經常使用的功能,但願後續微信小程序官方能給出一個比較好的官方解決方案。微信小程序