在 uni-app 编译的微信小程序中,通过 getCurrentPages()[0].route 获取当前页面路径(如"pages/index/index"),query 参数需从 options 中提取并手动拼接,注意转义与环境兼容性。

uni-app里怎么拿到微信小程序当前页面的完整路径
在 uni-app 编译到微信小程序时,getCurrentPages() 返回的页面对象里,route 字段就是你要的路径(不含 query),但很多人直接读 __route__ 或 url 会拿空或报错。
-
getCurrentPages()是唯一可靠方式,它返回的是微信原生页面栈数组,每个元素有route和options属性 -
route值如"pages/index/index",注意没有.vue后缀,也不带/开头 - 别用
this.$route.path—— 这是 H5/APP 端 Vue Router 的行为,小程序端不生效 - 如果页面是通过
uni.navigateTo({ url: 'pages/a/a?x=1' })跳转的,route仍是"pages/a/a",query 在options里(如{ x: "1" })
如何拼出带参数的完整路径(含 query)
微信小程序要求跳转时传字符串路径,而 getCurrentPages()[0].route 不带参数,得自己拼。手动拼容易漏转义或格式错,尤其中文、特殊符号。
- 用
encodeURIComponent包裹每个 query 值,不要对整个 URL 调用一次 - 推荐写个简单工具函数:
function getPageUrl() {<br> const pages = getCurrentPages();<br> const page = pages[pages.length - 1];<br> const { route, options } = page;<br> const queryStr = Object.keys(options).map(k => `${k}=${encodeURIComponent(options[k])}`).join('&');<br> return queryStr ? `${route}?${queryStr}` : route;<br>} - 注意:
options中的值全是字符串,即使你传了数字,微信也会转成字符串,所以不用额外toString() - 别用
URLSearchParams—— 微信基础库低版本(如 2.10.4)不支持
为什么 onShow 里有时拿不到 route 或 options 为空
这不是 uni-app bug,而是微信小程序生命周期和页面栈更新时机问题:页面刚 show 时,getCurrentPages() 可能还没刷新,或者你取的是上一个页面。
- 确保在
onShow里调用getCurrentPages(),而不是onLoad或mounted—— 后两者在页面初始化时触发,不一定反映当前栈顶 - 取最后一个元素:
const page = getCurrentPages().slice(-1)[0],比[0]更安全(避免误取栈底) - 真机调试时,如果从后台切回前台,
options一定是空对象,因为微信不会把冷启动参数重复塞进热态页面的options - 需要持久化参数?得在
onLoad存options到data或vuex,onShow时读它
跨平台时怎么统一处理页面路径逻辑
如果你同时编译 H5 和小程序,getCurrentPages() 在 H5 下返回空数组,直接用会崩。
- 加运行环境判断:
uni.getSystemInfoSync().platform === 'mp-weixin' - H5 端走
location.pathname + location.search,但注意格式差异:H5 路径是/pages/index/index,小程序是pages/index/index(无前导斜杠) - 别依赖
uni.getCurrentSubNVue()或uni.getTabBar—— 它们和页面路径无关,且部分平台不支持 - 如果用了分包,
route依然是相对路径(如"subpkg/pages/detail/detail"),无需手动补前缀
最常被忽略的是:页面被 redirect 或 switchTab 触发时,options 一定为空,哪怕 URL 里写了参数——微信设计如此,不是配置漏了。这时候只能靠全局状态或 storage 传参。


















