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

ByteRover
• 阅读 16027

前言

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

Vue.js的路由拦截

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

// 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()函数和生命周期,具体代码如下:

// 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;

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

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

总结

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

  1. 微信小程序需要进行路由拦截的每个页面都需要引入,并包装一层,使用起来还是比较繁琐的。
  2. Vue.js是每次跳转到新的路由(页面)前进行处理,校验通过会跳转到新页面,不通过则直接跳转到登陆页面;而微信小程序这里,会先跳转到新页面,校验不通过会再次跳转到登陆页面。

目前在微信小程序这方面如果有比较好的解决方案的话,可以相互交流一下。

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

点赞
收藏
评论区
推荐文章
胡哥有话说 胡哥有话说
4年前
喜大普奔,微信终于支持外网打开小程序啦!
前言千呼万唤始出来,微信小程序终于支持以URLScheme的形式从外部唤起了。longlongago我们只能在微信内的网页中使用微信开发标签小程序跳转按钮
Caomeinico Caomeinico
3年前
小程序手动实现路由拦截
小程序中并没有像vuerouter一样的路由拦截功能,所以需要自己手动实现,下面就把具体的实现方法分享出来供大家参考。具体实现思路与vue相同,定义一个全局的token变量,进入某一个页面的时候判断是否存在这个token是否存在,存在则正常跳转,不存在则跳转到登录页面。创建一个工具文件夹,创建一个routers.js,封装路由拦截的具体代码如
马丁路德 马丁路德
4年前
小程序静默登录与维护自定义登录态
1.背景在小程序中,openid是一个用户对于一个小程序/公众号的标识,开发者可以通过这个标识识别出用户,就如同你的身份证一样。2.什么是静默登录?在普通的应用中,用户通过表单验证登录建立用户体系,这种常见的登录方式一般是通过登录页面表单进行登录,对用户来说是有感的。在小程序中,由于是基于微信,可以通过微信官方提供的API能力,使我们能够无感知得获取
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
马丁路德 马丁路德
4年前
微信小程序 - 路由实践
欢迎来到我博客阅读:1\.前言在微信小程序由一个App()实例,和众多Page()组成。而在小程序中所有页面的路由全部由框架进行管理,框架以栈的形式维护了所有页面,然后提供了以下API来进行路由之间的跳转:1.wx.navigateTo2.wx.redirectTo3.wx.navigateBack4.
梦
4年前
服务号跳转微信小程序的坑
服务号跳转微信小程序一直报错{"errcode":40165,"errmsg":"invalidweapppagepathhint:8yDcBa01023942"}
Stella981 Stella981
3年前
App唤起微信小程序和回调
在同一开放平台账号下的移动应用及小程序无需关联即可完成跳转,非同一开放平台账号下的小程序需与移动应用(APP)成功关联后才支持跳转。可在“管理中心移动应用应用详情关联小程序信息”,为通过审核的移动应用发起关联小程序操作。唤起App打开下程序他有两种方式:1,通过App分享小程序卡片到微信,然后在微信上点击小程序卡片打开小程序,
Easter79 Easter79
3年前
Taro小程序自定义顶部导航栏
微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。!在这里插入图片描述(https://i
Wesley13 Wesley13
3年前
5G消息与微信小程序互联互通?北京国都互联这么做……
最近微信小程序上线了一个超级流量的新入口URLScheme,据微信官网介绍,scheme码适用于短信、邮件、外部网页等拉起小程序的业务场景。通过小程序页面的URLScheme,可以在短信、邮件或微信外部的网页中打开微信小程序。意义在于将微信流量生态延伸到微信以外渠道,进一步完善了小程序和外部渠道互通的营销场景。北京国都互联第一时
Wesley13 Wesley13
3年前
10分钟彻底搞懂单页面应用路由
上一次,跟大家科普了小程序的自定义路由routes,开启了路由之旅;今天,顺势就单页面应用路由,跟大家唠个五毛钱,如果唠得不好……退…一块钱?单页面应用特征假设:在一个web页面中,有1个按钮,点击可跳转到站内其他页面。多页面应用:点击按钮,会从新加载一个html资源,刷新整个页面;单页面应
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(