getcurrentpages() 获取的 route 不含 query 参数,需手动拼接并编码;三端参数获取方式不同,冷启动时需用 uni.getlaunchoptionssync() 兜底,且必须处理 uri 编码解码。
直接用 getcurrentpages() 拿不到带 query 的完整路由地址,必须自己拼;this.$route 在小程序端根本不存在,别试。
为什么 getCurrentPages().pop().route 不等于浏览器地址栏里的 URL
route 字段只返回路径部分(如 "pages/detail/detail"),不含任何 query 参数,也不带 / 开头或 .vue 后缀。它本质是微信原生页面栈的 route 字段,和 H5 的 URL 概念不同。
- 小程序平台:query 全在
options对象里,且值未解码(比如中文是%E4%BD%A0) - H5 平台:
route可能为空或结构不一致,得靠this.$route.fullPath或window.location.href - App 平台:行为接近 H5,但部分 Android 客户端有兼容问题
- 绝对不要依赖
__route__、url或this.$mp.page.$options.route—— 这些不是标准 API,随时可能失效
怎么安全拼出带参数的完整路径(含中文、特殊符号)
手动拼接是唯一通用方案,但必须处理编码和空值。错误示例:${currentPage.route}?${JSON.stringify(currentPage.options)} —— 会崩在中文、&、= 等字符上。
- 对每个 key 和 value 都用
encodeURIComponent()包一层 - 先 try-catch
decodeURIComponent()再拼,否则options里乱码参数会导致拼接失败 - 跳转时传的参数若含 JSON 字符串(如
?data=%7B%22id%22%3A1%7D),要先 decode 再JSON.parse,顺序不能反 - 示例代码片段:
const pages = getCurrentPages();
if (pages.length === 0) return '';
const currentPage = pages[pages.length - 1];
const path = `/${currentPage.route}`;
const options = currentPage.options || {};
const queryStr = Object.keys(options)
.map(k => {
let val = options[k] || '';
try {
val = decodeURIComponent(val);
} catch (e) {}
return `${encodeURIComponent(k)}=${encodeURIComponent(val)}`;
})
.join('&');
const fullUrl = queryStr ? `${path}?${queryStr}` : path;
onLoad 里拿不到参数?冷启动和分享卡片是重灾区
从分享卡片、扫码、后台冷启动进来的页面,onLoad 的 options 可能为空,因为此时页面被重建,但框架没把启动参数注入进去。
- 必须同时在
onLoad和onShow里读取参数,并加时间戳或 flag 做覆盖判断(比如后到的优先) - 兜底用
uni.getLaunchOptionsSync(),它能拿到首次启动时的path和query - 注意:这个 API 返回的
query也是未解码的,一样要decodeURIComponent - 别在
onUnload里调getCurrentPages()—— 栈已变更,pop()会取错页甚至报错
最麻烦的不是拼路径,而是三端行为不一致 + 编码状态混乱。写死路径+参数传参虽土,但在关键跳转逻辑里反而更稳。











