这篇文章主要介绍微信小程序开发页面拦截器的示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<>强场景强>
- <李>
小程序有52个页面,其中13个页面无需任何身份,另外39个页面需要系统角色。对于这39个页面,如果微信用户没有系统角色,则跳转到登录页。
李> <李>是否有系统角色信息需要通过异步请求来获取。
李> <强>需求分析,实现强>
对需求进行抽象,其实要的就是一个过滤器,对小程序页面的访问进行过滤,符合条件的通过,不符合条件进行其他处理。
使用过php的laravel框架的童鞋,肯定一下子就联想到了laravel框架的http中间件:
http中间件提供一个方便的机制来过滤进入应用程序的http请求,例如,laravel默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进。当然,除了身份验证之外,中间件也可以被用来执行各式各样的任务,歌珥中间件负责替所有即将离开程序的响应加入适当的响应头,一个日志中间件可以记录所有传入应用程序的请求。
令人忧桑的是,微信小程序并没有提供针对页面实例的中间件机制,所以只能从页面实例的生命周期处下手。
对于onLoad,一个页面只会调用一次,对于昂秀,每次打开页面(比如小程序从后台转到前台)都会调用一次。
在onLoad或者昂秀钩子函数里,对用户身份进行校验,通过后则拉取该页面需要的数据,否则跳转到登录页。
//orderDetail.js 昂秀:function (), { let 才能;that =,;//才能身份校验 service.identityCheck才能((),=祝辞,{ ,,,,//跳转到登录页 ,,,,wx.redirectTo ({ ,,,,,url:,“/页/共同/登录/login" ,,,,}); ,,,},,(),=祝辞,{,, ,,,,//获取页面数据等等,,, ,,,,that.getDetail (this.orderId); ,,,,… ,,,} ,,); },
不过,每个页面都要这样写,重复代码好多啊,侵入性也不强。如用装饰函数(高大上的说法是装饰者模式)来包装一下:
//filter.js function identityFilter (pageObj) { 如果才能(pageObj.onShow) { ,,,let _onShow =, pageObj.onShow; ,,,pageObj.onShow =,函数(){ ,,,,,service.identityCheck(()=祝辞{ ,,,,,,,//跳转到登录页 ,,,,,,,wx.redirectTo ({ ,,,,,,,,,url:,“/页/共同/登录/login" ,,,,,,,}); ,,,,,},()=祝辞{ ,,,,,,,//获取页面实例,防止这劫持 ,,,,,,,let currentInstance =, getPageInstance (); ,,,,,,,_onShow.call (currentInstance); ,,,,,}); ,,,} ,,} return 才能;pageObj; } function getPageInstance () { var 才能;pages =, getCurrentPages (); return 才能;页面(pages.length 作用;1); } 时间=exports.identityFilter identityFilter;
<代码> filter.js> 代码用以提供过滤器方法,除了现有的用户身份拦截,后续如果需要其他拦截,可以在这个文件增加,然后,在需要用户身份拦截的小程序页面代码里,用<代码>过滤器。identityFilter> 代码处理一下就可以了:
//orderDetail.js let filter =,要求(& # 39;filter.js& # 39;); 页面(filter.identityFilter ({ ,,… ,,昂秀:function (), { ,,,//获取页面数据等等 ,,,this.getDetail (this.orderId); ,,,//? ,,}, ,,… }));
<强>使用承诺进行优化强>
上面的实现中,每次访问页面,都会执行一次获取用户身份的方法(就是上面代码里的服务。identityCheck)。其实没有必要的,在小程序启动的时候获取一次就行了。也就是说,放在应用。js的onLaunch方法里执行。
每个小程序页面实例化时,一般也会执行异步方法,用来获取页面需要的数据。关键在于,我们需要保证,页面的异步方法必须在获取用户身份的异步请求之后执行。
毋容置疑,承诺最擅长处理异步请求的执行顺序了。主子,快放代码粗来:
//app.js 应用程序({ onLaunch才能:函数(){ ,,,let p =, new 承诺(函数(解决,拒绝){ ,,,,,service.identityCheck(解决,拒绝); ,,,}); ,,,this.globalData.promise =,,, ,,}, ,,… ,,globalData: { ,,,承诺:空, ,,}, });微信小程序开发页面拦截器的示例