uni-app中uniIdRouter配置在微信小程序中无效,H5中有效
uni-app中uniIdRouter配置在微信小程序中无效,H5中有效
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | Windows 11 家庭中文版22621.2715 | HBuilderX |
示例代码:
"uniIdRouter": {
"loginPage": "uni_modules/uni-id-pages/pages/login/login-withoutpwd",
"needLogin": [
"pages/chat/chat",
"pages/ucenter/ucenter",
"uni_modules/uni-id-pages/pages/userinfo/userinfo"
],
"resToLogin": true
}
操作步骤:
无
预期结果:
没登录自动进入登录页面
实际结果:
没有进入登录页面
bug描述:
uniIdRouter配置在微信小程序中无效,H5中有效
3 回复
注意:uniIdRouter底层使用navigateTo、redirectTo、reLaunch、switchTab的拦截器进行页面跳转拦截,不会拦截进入首页,web端和app端会拦截原生tabbar点击,其他端不会拦截原生tabbar点击。
onload对其享数据拦截,不符合先跳到指定页。router作为辅助
在 uni-app
中使用 uniIdRouter
进行路由权限控制时,可能会遇到在微信小程序中无效但在 H5 中有效的情况。这通常是由于微信小程序的环境限制或配置问题导致的。以下是一些可能的原因和解决方案:
1. 检查 uniIdRouter
的配置
确保 uniIdRouter
的配置正确,并且适用于微信小程序。例如:
// main.js
import uniIdRouter from '@/uni_modules/uni-id-pages/common/uniIdRouter.js'
Vue.prototype.$uniIdRouter = uniIdRouter
uniIdRouter.beforeEach((to, from, next) => {
// 权限控制逻辑
if (to.requiresAuth && !uni.getStorageSync('uni_id_token')) {
next({
path: '/pages/login/login'
})
} else {
next()
}
})
2. 微信小程序的环境限制
微信小程序的环境与 H5 不同,可能存在一些限制。例如:
- 路由跳转:微信小程序的路由跳转是通过
wx.navigateTo
等 API 实现的,而不是直接修改 URL。因此,uniIdRouter
的权限控制逻辑可能需要适配微信小程序的 API。 - 存储机制:微信小程序使用的是
wx.setStorageSync
和wx.getStorageSync
来进行本地存储,确保你的权限判断逻辑使用的是这些 API。
3. 检查微信小程序的 AppID 和权限配置
确保微信小程序的 AppID 配置正确,并且在微信开发者工具中开启了相关权限(如用户信息获取、存储等)。
4. 调试和日志输出
在微信小程序中使用 console.log
输出调试信息,检查 uniIdRouter
的逻辑是否正常执行。例如:
uniIdRouter.beforeEach((to, from, next) => {
console.log('路由跳转:', to, from)
if (to.requiresAuth && !uni.getStorageSync('uni_id_token')) {
console.log('未登录,跳转到登录页')
next({
path: '/pages/login/login'
})
} else {
console.log('已登录,继续跳转')
next()
}
})
5. 使用 uni-app
官方提供的解决方案
uni-app
官方提供了一些解决方案和插件,可以帮助你在微信小程序中实现路由权限控制。例如,使用 uni-simple-router
插件:
// main.js
import Vue from 'vue'
import App from './App'
import { RouterMount } from 'uni-simple-router'
import router from './router'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
//v1.3.5起 H5端 你应该去除原有的app.$mount();使用路由自带的渲染方式
// #ifdef H5
RouterMount(app, router, '#app')
// #endif
// #ifndef H5
app.$mount(); //为了兼容小程序及app端必须这样写才有效果
// #endif