uni-app列表点击跳转传id必须用uni.navigateto拼接encodeuricomponent编码的query参数,详情页在onload(options)中取options.id(字符串),需手动parseint转数字且校验合法性。

uni-app列表点击跳转时怎么传id
直接用 uni.navigateTo 拼接 query 参数是最常用、最稳妥的方式。uni-app 的路由系统不支持 Vue Router 那样的命名路由或动态段(如 /detail/:id),所有参数都得走 URL query 字符串。
常见错误是试图在 url 里写成 /pages/detail/detail?id={{item.id}} —— 这不行,{{}} 在静态字符串中不会解析;也有人用字符串模板但漏了 ? 或没编码,导致 id 里带斜杠、空格或中文时跳转失败或参数截断。
- 正确写法:
uni.navigateTo({ url: '/pages/detail/detail?id=' + encodeURIComponent(item.id) }) - 如果
item.id是数字,encodeURIComponent仍建议保留,避免后续扩展时混入特殊字符 - 多个参数用
&连接,例如:?id=123&source=list&from=home
详情页如何拿到传过来的id
uni-app 页面生命周期中,onLoad 是唯一可靠读取路由参数的地方。别在 created 或 mounted 里读 this.$route.query.id —— uni-app 的 Vue 实例没有 $route 对象,这是 H5 端模拟 Vue Router 时的常见误解。
实际参数存在 options 对象里,由框架注入 onLoad 回调的第一个参数:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
onLoad(options) {
const id = options.id // 字符串类型,即使传的是数字也会变成字符串
console.log(id) // "123"
}
-
options中的 key 就是 URL query 的键名,大小写敏感 - 如果 URL 是
?ID=123,就得用options.ID,不是options.id - 未传参时对应字段为
undefined,建议做空值判断,比如const id = options.id || ''
id传过去是字符串,后端要number怎么办
uni-app 所有 URL query 参数都是字符串,这是 HTTP 协议决定的,绕不开。后端接口通常要求 number 类型的 id,前端必须显式转换,否则可能触发后端校验失败或查不到数据。
- 用
parseInt(id, 10)最安全,比Number(id)更严格(后者对空字符串返回0) - 如果 id 可能是长整型(比如 MongoDB 的 ObjectId 或超大数字),用
parseInt会丢失精度,此时应保持字符串传给后端,让后端按字符串处理 - 转换前务必校验:
if (!/^\d+$/.test(id)) { uni.showToast({ title: '非法ID', icon: 'none' }); return; }
为什么有时跳转后 onLaunch 或 onShow 拿不到参数
因为 onLaunch 是 App 启动时触发,只在冷启动时执行一次,且此时页面还没加载,根本没 options;onShow 是页面显示时触发,但它不接收路由参数 —— 它的参数是平台级的(比如从后台切回前台),和页面跳转无关。
真正该写逻辑的地方只有 onLoad。如果页面支持“被分享进入”或“从桌面图标冷启”,需要同时兼容两种场景:一种是正常跳转带 options,另一种是无 options(此时可能需从 storage 或全局状态恢复上下文)。
容易被忽略的一点:App.vue 的 onShow 和 onHide 与页面级生命周期无关,别在这里处理页面参数逻辑。










