微信小程序未登录状态下的导航拦截有哪些方法可以实现

1. 全局路由拦截(最推荐)

原理 :利用小程序页面栈和路由跳转机制进行统一拦截
实现步骤

javascript 复制代码
// app.js 中定义全局路由守卫
App({
  onLaunch() {
    // 存储原始路由方法
    const originalNavigateTo = wx.navigateTo;
    wx.navigateTo = function(options) {
      if (needAuth(options.url) && !isLogin()) {
        return redirectToLogin(); // 跳转到登录页
      }
      originalNavigateTo.call(this, options);
    };
    // 对 wx.redirectTo/wx.switchTab 等做同样处理
  }
})

// 检查页面是否需要登录
function needAuth(url) {
  const authPages = ['/pages/order/order', '/pages/profile/profile'];
  return authPages.some(page => url.includes(page));
}

2. 页面跳转前检查(组件化方案)

原理 :封装自定义导航组件
实现代码

javascript 复制代码
// components/auth-navigate/auth-navigate.js
Component({
  methods: {
    handleNavigate() {
      if (this.data.requireAuth && !getApp().globalData.isLogin) {
        wx.navigateTo({ url: '/pages/login/login' });
      } else {
        wx.navigateTo({ url: this.data.target });
      }
    }
  }
})

// 页面中使用
<auth-navigate 
  target="/pages/order/order" 
  require-auth
  bindtap="handleNavigate"
>去订单页</auth-navigate>

3. 页面生命周期拦截

原理 :在页面的onLoadonShow中检查
实现代码

javascript 复制代码
// pages/order/order.js
Page({
  onShow() {
    if (!getApp().globalData.isLogin) {
      wx.redirectTo({ url: '/pages/login/login' });
      return;
    }
    // 正常逻辑...
  }
})

4. 后端接口拦截(补充方案)

原理 :通过接口返回状态码强制跳转
实现逻辑

javascript 复制代码
// 封装请求方法
function request(url, data) {
  return new Promise((resolve, reject) => {
    wx.request({
      url,
      success(res) {
        if (res.data.code === 401) { // 未登录状态码
          redirectToLogin();
          reject('未登录');
        } else {
          resolve(res.data);
        }
      }
    });
  });
}

5. 本地存储检查(简单方案)

原理 :利用wx.getStorageSync快速验证
实现代码

javascript 复制代码
function checkAuth() {
  try {
    const token = wx.getStorageSync('token');
    if (!token) throw new Error();
  } catch {
    wx.showModal({
      title: '提示',
      content: '请先登录',
      success() { wx.reLaunch({ url: '/pages/login/login' }) }
    });
    return false;
  }
  return true;
}

方案对比

方法 优点 缺点 适用场景
全局路由拦截 一劳永逸,维护成本低 需要处理特殊页面(如tabBar) 中大型应用
自定义导航组件 组件化,可复用性强 每个链接需替换为组件 需要精细控制的场景
页面生命周期检查 实现简单 每个页面需单独添加代码 少量需要拦截的页面
后端接口拦截 权限控制绝对可靠 用户感知延迟 对安全性要求高的功能
本地存储检查 快速实现 无法防止直接URL访问 简单小程序

最佳实践建议

  1. 组合使用

    • 核心方案:全局路由拦截 + 页面生命周期检查

    • 增强方案:关键接口401拦截

  2. 用户体验优化

    javascript 复制代码
    // 登录成功后返回原页面
    wx.redirectTo({
      url: '/pages/login/login?redirect=' + encodeURIComponent(currentPage)
    });
  3. 特殊页面处理

    javascript 复制代码
    // 在app.js中排除登录页
    if (options.url.includes('login')) {
      return originalNavigateTo.call(this, options);
    }

4.TabBar页面处理

javascript 复制代码
// 由于switchTab不能带参数,需使用全局变量
getApp().globalData.requireLogin = true;
wx.switchTab({ url: '/pages/profile/profile' });

注意事项

  1. 小程序页面路径最多支持10层,避免循环跳转

  2. tabBar页面无法通过navigateTo跳转,需特殊处理

  3. onLaunch中无法获取页面栈,建议用getCurrentPages()做运行时检查

根据项目复杂度选择方案,一般推荐方案1+3的组合实现。

相关推荐
笨笨狗吞噬者1 小时前
小程序包体积分析利器 -- vite-plugin-component-insight
前端·微信小程序·uni-app
杰建云1673 小时前
小程序转化率低的核心原因是什么?
小程序·小程序制作
中国胖子风清扬4 小时前
基于GPUI框架构建现代化待办事项应用:从架构设计到业务落地
java·spring boot·macos·小程序·rust·uni-app·web app
Greg_Zhong4 小时前
微信小程序中使用canvas中绘制的页面,切换字体的几种实践方式
微信小程序·腾讯云cos·canvas页面切换字体
weikecms5 小时前
外卖CPS小程序哪家系统比较完善
小程序
绝世唐门三哥1 天前
uniapp系列-uniappp都有哪些生命周期?
vue.js·小程序·uniapp
人还是要有梦想的1 天前
如何开发小程序介绍
小程序·notepad++
roamingcode1 天前
支付宝小程序数据可视化避坑指南:@antv/f2 踩坑与最佳实践
信息可视化·小程序·canvas·antv
2501_915921431 天前
HTTP和HTTPS协议全面解析:技术原理与安全应用
安全·http·ios·小程序·https·uni-app·iphone
double_eggm2 天前
微信小程序2
微信小程序·小程序