URL参数必须对每个query值单独encodeURIComponent编码,不能整体编码或仅中文编码;接收端需手动类型转换且成对解码,否则真机静默失效。

参数丢失或乱码不是 uni-app 的 bug,而是 URL 传输机制的必然表现——没做 encodeURIComponent 编码,就等于把中文、空格、&、= 直接扔进 URL 分隔符系统里,小程序解析时直接截断或混淆。
uni.navigateTo 拼接 URL 必须对每个 query value 单独编码
不能只对中文编码,也不能对整个 URL 调用 encodeURIComponent(它会把 / 和 : 也干掉,路径就废了)。必须只编码参数值部分。
- ❌ 错误写法:
url: '/pages/detail/detail?id=' + id + '&name=' + name(name含中文或&就崩) - ✅ 正确写法:
url: '/pages/detail/detail?id=' + id + '&name=' + encodeURIComponent(name) - 数字类参数如
id可不编码,但接收端仍要Number(options.id)转类型,否则是字符串 - 布尔值传
is_show=true,接收端必须用options.is_show === 'true'判断,不能用Boolean()
传对象必须 JSON.stringify + encodeURIComponent 双重处理
对象直接拼进 URL 会变成 [object Object],且微信小程序 URL 长度上限约 2048 字节,超长静默失败。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- ✅ 正确流程:先
JSON.stringify(obj)→ 再encodeURIComponent(...)→ 最后拼入 query - 示例:
const url = '/pages/detail/detail?data=' + encodeURIComponent(JSON.stringify({ name: '张三', remark: '上线了 & 测试中' })) - 接收端必须
try/catch包裹:JSON.parse(decodeURIComponent(options.data)),否则解析失败直接白屏 - 别在服务端返回已编码字符串再前端二次 encode——容易双重编码,解码时报
URIError
onLoad 中 options 始终是字符串,不自动类型转换
哪怕你传的是 id=123 或 is_show=false,options.id 是 "123",options.is_show 是 "false",不是数字也不是布尔值。
-
Number(options.id) || 0或parseInt(options.id, 10)处理数字 -
options.is_show === 'true'判断布尔(注意是字符串比较) - 数组或嵌套对象别走 query,改用
eventChannel或uni.setStorageSync存 key,跳转后再取 - 永远检查
options.data是否存在且非空字符串,真机下可能因跳转异常为空
图片路径、文件路径传参显示乱码或 404
像 /static/avatar.png 这种路径含 / 和点号,不编码就会被 URL 解析器当成路径分隔或协议标识,导致截断。
- 必须
encodeURIComponent('/static/avatar.png')后再传 - 接收端用
decodeURIComponent(options.path)恢复,不能漏 - 如果路径来自接口返回,确认服务端没多加一层编码;本地拼接时也别手抖多调一次
encodeURIComponent - 路径过长(比如 base64 图片)建议改用全局状态或本地缓存,避免 URL 截断
最常被忽略的一点:所有编码/解码操作都必须成对出现,且仅作用于 value 部分;任何一步漏掉或重复,都会让参数在真机上静默失效——模拟器有时“恰好”能过,反而掩盖问题。


















