js和微信小程序路由(页面)跳转拦截 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 小程序相关 >

js和微信小程序路由(页面)跳转拦截

发表时间:2022-9-14

发布人:葵宇科技

浏览次数:1553

前言 
在开发有登录功能的项目时,不可避免的需要在路由(页面)跳转时对当前用户的权限进行一定的校验。目前我使用的比较多的vue.js提供了比较好的解决方案。在开发微信小程序时,发现官方目前并未提供相应的解决方案,根据以往的经验自己实现了路由(页面)跳转拦截。在此对两者做一个简单的对比。

vue.js的路由拦截 
vue.js官方称之为导航守卫。官方文档很详细,使用起来也比较简单,此处就不多说了,简单的示例代码如下:

  1. // routes/index.js
  2. const router = new Router({
  3. routes: [{
  4. path: '/',
  5. name: 'Login',
  6. component: Login
  7. },
  8. {
  9. path: '/user',
  10. name: 'User',
  11. component: User,
  12. meta: {
  13. requireAuth: true
  14. }
  15. }]
  16. });
  17. // 全局导航钩子
  18. router.beforeEach((to, from, next) => {
  19. // meta.requireAuth为true时才进行校验
  20. if (to.meta.requireAuth) {
  21. // 此处使用vuex进行校验,具体根据业务需求来
  22. store.dispatch('checkAuth');
  23. if (!store.state.checkAuth) {
  24. // rediect是为了登录后重定向到当前页面
  25. next({
  26. path: '/',
  27. query: {
  28. redirect: to.fullPath
  29. }
  30. });
  31. } else {
  32. next();
  33. }
  34. } else {
  35. next();
  36. }
  37. });

微信小程序的路由拦截

因为微信小程序官方并没有提供官方的解决方案,所以这里只能自己去实现一个。如果对node.js比较熟悉的话,应该对express/koa框架中的经常提到的中间件概念比较熟悉,这里就使用中间件的机制来处理。结合小程序中Page()函数和生命周期,具体代码如下:

  1. // utils/filter.js
  2. function loginCheck(pageObj) {
  3. if (pageObj.onLoad) {
  4. let _onLoad = pageObj.onLoad;
  5. // 使用onLoad的话需要传递options
  6. pageObj.onLoad = function (options) {
  7. if(wx.getStorageSync('USERID')) {
  8. // 获取当前页面
  9. let currentInstance = getPageInstance();
  10. _onLoad.call(currentInstance, options);
  11. } else {
  12. //跳转到登录页
  13. wx.redirectTo({
  14. url: "/pages/login/login"
  15. });
  16. }
  17. }
  18. }
  19. return pageObj;
  20. }
  21. // 获取当前页面
  22. function getPageInstance() {
  23. var pages = getCurrentPages();
  24. return pages[pages.length - 1];
  25. }
  26. exports.loginCheck = loginCheck;

以上,通用的过滤函数就写好了。在需要使用的页面引入该方法即可:

  1. // pages/user/user.js
  2. const filter = require('../../utils/filter');
  3. Page(filter.loginCheck({
  4. // ...
  5. onLoad: function (options) {
  6. // ...
  7. },
  8. // ...
  9. }));

总结

相比vue.js官方提供的路由拦截功能,自己实现微信小程序的路由拦截还是存在一定的不足。比如:

微信小程序需要进行路由拦截的每个页面都需要引入,并包装一层,使用起来还是比较繁琐的。 
vue.js是每次跳转到新的路由(页面)前进行处理,校验通过会跳转到新页面,不通过则直接跳转到登陆页面;而微信小程序这里,会先跳转到新页面,校验不通过会再次跳转到登陆页面。 
目前在微信小程序这方面如果有比较好的解决方案的话,可以相互交流一下。

路由跳转拦截是一个非常常用的功能,希望后续微信小程序官方能给出一个比较好的官方解决方案。

相关案例查看更多