onNavigationBarButtonTap无法直接获取跳转参数,需通过getCurrentPages()读取当前页data或用uni.setStorageSync/uni.getStorageSync临时存储传递。

onNavigationBarButtonTap 里拿不到跳转参数
原生导航栏的 buttons 是静态配置的,点击后触发的 onNavigationBarButtonTap 回调本身不带任何参数,event 对象里只有按钮索引(index)和按钮配置信息,没有 URL、query 或自定义 payload。想“传参”,本质是得在点击前把数据存好,点击时再取。
用 getCurrentPages() 拿当前页面实例数据
这是最常用也最稳妥的方式:按钮点击时,目标参数往往就来自当前页面的 data 或 computed 属性。通过页面栈拿到当前页实例,直接读取它的状态:
-
const pages = getCurrentPages()获取页面栈数组 -
const currentPage = pages[pages.length - 1]取栈顶(即当前页) -
console.log(currentPage.data.userId)直接访问其data或data.xxx - 注意:不能用
this,因为onNavigationBarButtonTap不在组件上下文中执行
用 uni.setStorageSync + uni.getStorageSync 中转
如果参数来自异步加载(比如接口返回后才有的 ID),或需要跨生命周期使用,可临时存到本地存储:
- 在页面
onLoad或数据就绪后:uni.setStorageSync('navBtnParam', { id: 123, type: 'detail' }) - 在
onNavigationBarButtonTap中:const param = uni.getStorageSync('navBtnParam') - 用完建议及时清理:
uni.removeStorageSync('navBtnParam'),避免残留 - 不推荐长期存大对象,storage 有容量限制(通常 10MB),且非响应式
button 的 text 或 badgeText 不能当参数用
有人试图把 ID 写进按钮文字里(比如 "编辑-123"),再在点击时正则提取 —— 这不可靠:
- 文字可能被截断、换行、国际化替换,解析易出错
- UI 和逻辑耦合过紧,改个文案就得同步改 JS 逻辑
-
badgeText是角标,不是可读文本,iOS 上可能根本渲染不出来 - 按钮配置在
pages.json里,编译期就固定了,无法动态注入运行时数据
真正要传的“参”,从来不是塞进按钮配置里,而是提前存在页面实例或 storage 中——原生导航栏按钮只负责触发动作,不负责携带上下文。











