uni.setClipboardData必须传入字符串类型data参数,否则静默失败;需在用户触发事件中调用,支持success/fail/complete回调,H5和小程序端有兼容性限制。

uni-app 中 uni.setClipboardData 基本用法和必须传的参数
这个 API 不是「调了就完事」,它要求你必须传 data 字符串,且不能是 undefined 或空对象。直接传 {}、null、'' 都会静默失败(不报错但剪贴板没变),尤其容易在异步取值后忘记判空。
正确写法示例:
uni.setClipboardData({
data: '要复制的文字',
success: () => {
uni.showToast({ title: '已复制', icon: 'none' });
},
fail: (err) => {
console.error('复制失败', err);
}
});
-
data必须是字符串类型,数字或布尔值需显式转成字符串(如String(123)) - 微信小程序中若传入含 emoji 或特殊 Unicode 字符的字符串,部分旧版本可能截断,建议先
encodeURIComponent再复制(粘贴时再解码) - H5 端依赖
navigator.clipboard.writeText,iOS Safari 13.4+ 才支持,低版本需降级提示
为什么点一下没反应?检查这三处常见失败点
多数「点击无反应」不是 API 本身问题,而是环境或调用时机不对:
- 未在用户主动触发的事件回调里调用(如
button的@click),在mounted或定时器里直接调用会被浏览器拦截 - App 端(Android/iOS)未在 manifest.json 中配置权限:
"permissions": ["scope.clipboardWrite"](仅 3.2.14+ 支持,老版本需用plus.clipboard.writeText) - 微信小程序真机调试时,开发者工具模拟正常,但真机上若未开启「获取剪贴板」授权(iOS 尤其敏感),
fail回调里会返回errMsg: "setClipboardData:fail auth deny"
兼容多端的复制封装函数怎么写
别每次复制都手写一遍 success/fail,抽成工具函数更稳:
export const copyToClipboard = (text) => {
if (!text || typeof text !== 'string') return Promise.reject('非有效字符串');
return new Promise((resolve, reject) => {
uni.setClipboardData({
data: text,
success: () => resolve(),
fail: (err) => reject(err)
});
});
};
使用时可配合 async/await:
async handleCopy() {
try {
await copyToClipboard(this.content);
uni.showToast({ title: '已复制', icon: 'none' });
} catch (err) {
// H5 或 App 权限拒绝时走这里
uni.showToast({ title: '复制失败,请重试', icon: 'none' });
}
}
- 该函数返回 Promise,方便统一处理不同端的失败逻辑
- 避免在
fail里直接弹出「授权失败」——用户看不懂,应引导手动开启系统设置 - App 端若检测到
plus存在(即非 H5),可优先用plus.clipboard.writeText,兼容更低版本
复制长文本或富文本内容要注意什么
uni.setClipboardData 只支持纯文本,所谓「复制带样式的文字」其实是错觉。如果你看到页面上一段加粗文字被复制后还是加粗,那只是目标应用(如微信、备忘录)自己解析了 HTML 标签并渲染了样式,但剪贴板里存的仍是原始 HTML 字符串。
- 想复制纯文本:用
innerText或正则清除 HTML 标签(text.replace(/]+>/g, '')) - 想保留基础格式(如换行):确保源字符串含
\n,H5 和微信小程序会保留,但 App 端部分机型可能丢掉换行符,建议用\r\n兼容 - 不要尝试复制图片或 base64 图片字符串——剪贴板不会自动识别为图片,只会当普通文本粘贴出来
真正复杂的内容(如图文混排、表格)得靠原生层实现,uni-app 层只能妥协为复制纯文本摘要。


















