剪贴板不是跨页面通信机制,而是系统级临时缓存,无上下文、无所有权、不保证时效性;跨页面传数据应使用url参数、extradata、事件总线或本地存储等可控方式。

uni-app 里没有“剪贴板跨页面传递数据”这回事——剪贴板(uni.setClipboardData / uni.getClipboardData)本质是系统级临时缓存,和页面生命周期无关,它不负责通信,也不保证数据归属或时效性。真要跨页面传数据,得用明确的、可控的机制。
为什么不能靠剪贴板做跨页面通信
剪贴板是全局、无上下文、无所有权的共享区。你写入一次,任何页面(甚至其他 App)都能读;但没人知道谁写的、什么时候写的、是否已被覆盖。常见误用场景:
- 页面 A 调用
uni.setClipboardData存了个 ID,页面 B 在onLoad里立刻uni.getClipboardData—— 结果为空或旧值(被微信、输入法等覆盖) - 用户中途切到别的 App 粘贴了一次,你的数据就丢了
- H5 端部分浏览器需用户手势触发才能读取,
onLoad里直接调用会失败
真正靠谱的跨页面数据传递方式
根据数据类型、时效性和平台兼容性,选对方法比硬套剪贴板重要得多:
-
简单字符串/数字(如 ID、状态码):用 URL 参数 +
encodeURIComponent。跳转时带上,目标页在onLoad(options)拿。注意中文必须编码,否则 H5 乱码、小程序截断 -
复杂对象(如表单数据、配置项):用
uni.navigateTo的extraData字段。目标页不能在onLoad读,得在onShow或onReady里通过getCurrentPages().pop().options.extraData取 -
需要刷新同步或事件驱动(如登录后通知多个页面更新):用
uni.$emit+uni.$on。记得在onUnload里调uni.$off,否则内存泄漏 -
要持久、可跨进程(如热更新后仍存在):用
uni.setStorageSync。比globalData可靠,不受分包重载影响
剪贴板该什么时候用
它只适合明确的“用户主动复制粘贴”场景,不是通信通道:
- 点击按钮把订单号写入剪贴板:
uni.setClipboardData({ data: 'ORD-20260805-123' }) - 长按文本自动复制(配合
selectionend事件) - 扫码后把结果写入剪贴板,供用户粘贴到别处
如果你发现某个功能“非得用剪贴板传数据”,大概率是设计错了——先检查是不是 URL 参数没编码、extraData 没等到 onShow 就去读、或者事件监听没清理干净。











