在开发有登陆功能的项目时,不可避免的须要在路由(页面)跳转时对当前用户的权限进行必定的校验。目前我使用的比较多的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
目前在微信小程序这方面若是有比较好的解决方案的话,能够相互交流一下。小程序
路由跳转拦截是一个很是经常使用的功能,但愿后续微信小程序官方能给出一个比较好的官方解决方案。微信小程序