uqrcode 是 uni-app 中兼容性最佳、体积小、支持多端的动态二维码生成方案,底层自动适配平台渲染方式,推荐使用 npm install uqrcodejs 并在 onready 或 $nexttick 后调用 makecode。

uni-app 里用 uQRCode 插件生成动态二维码最稳
直接说结论:别自己封装 canvas 或引入全量 qrcode.js,uni-app 生态里 uQRCode 是目前兼容性最好、体积小、支持 H5/小程序/App 的方案。它底层做了平台判断,比如在微信小程序里走 canvas 绘制,在 H5 走 svg,不用你手动适配。
常见错误是直接 npm install qrcode 后在 onLoad 里调 qrcode.toCanvas() —— 这在微信小程序里会报 canvas is not defined,因为小程序没有全局 canvas 对象;在 App 端也可能因缺少 DOM 环境失败。
- 只装官方推荐的插件:
npm install uqrcodejs --save(注意包名是uqrcodejs,不是uQRCode) - 导入时用
import uQRCode from 'uqrcodejs',别写成require或漏掉后缀 - 生成前务必确认
canvas元素已挂载,推荐在$nextTick或onReady后调用uQRCode.makeCode() - 传入的 content 必须是字符串,
JSON.stringify(obj)得自己做,插件不自动序列化
小程序分享码要带参数?得拼好 path 再转二维码
很多同学想生成“带 scene 参数的小程序码”,但误把 https://xxx.com?uid=123 直接喂给 uQRCode.makeCode() —— 这只能生成普通二维码,扫出来是跳 H5 页面,不是小程序。
真要生成小程序码(带 scene),必须走微信原生 API:uni.navigateToMiniProgram 不适用,得用 uniCloud.callFunction 调云函数,或后端调用微信接口 https://api.weixin.qq.com/wxa/getwxacodeunlimit 获取 base64 图片流。前端能做的只是把后端返回的图片渲染出来。
- 前端能动态生成的,只有“普通二维码”(URL 或纯文本)
- 如果业务强依赖小程序带参码,必须后端生成,前端只负责请求 + 展示
<image :src="codeUrl"></image> - 云开发场景下,可在云函数里用
cloud.downloadFile拉取已存的小程序码,或用weapp-qrcode包生成(注意:该包不能在前端运行)
makeCode 的 width 和 size 参数容易混淆
uQRCode.makeCode() 有两个尺寸相关参数:width(画布宽高,单位 px)和 size(二维码模块大小,影响密集度)。很多人设了 width: 200 却发现码糊成一团,其实是没调 size。
默认 size 是 4,对 200px 画布来说模块太小,噪点明显;若内容长(比如带长 token),还可能因容错率低导致扫不出。
- 推荐组合:
width: 280+size: 6(兼顾清晰度与信息容量) - 容错等级用
errorCorrectLevel: 'H'(最高),尤其当内容含字母+数字混合时 - H5 端若需响应式,别用百分比设
width,改用uni.getSystemInfoSync().windowWidth * 0.7动态算 - 小程序里 canvas 宽高必须是整数,
Math.round()包一层更稳妥
生成后导出图片,canvasToTempFilePath 在不同平台行为不一致
想让用户长按保存二维码?得调 uni.canvasToTempFilePath。但这个 API 在各端差异极大:H5 不支持,App 需要 canvasId 对应真实 canvas 元素,而微信小程序要求 canvas 必须在当前页面且不可被 v-if 切换隐藏。
典型报错:canvasToTempFilePath:fail canvas is empty 或 fail no canvas found,基本都是 DOM 未就绪或 canvas 被条件渲染移除了。
- H5 端绕过方案:用
canvas.toDataURL('image/png')+ 创建 a 标签下载 - 小程序端确保 canvas 元素始终存在,不要用
v-if控制显隐,改用v-show - App 端需在
manifest.json中开启 “使用相册权限”,否则保存失败无提示 - 导出前加个
setTimeout(() => { ... }, 100),给 canvas 渲染留缓冲时间
真正麻烦的从来不是生成二维码,而是处理它在三个平台上的“存在感”——canvas 是否真实挂载、是否被框架优化掉、是否被权限拦住。这些细节不试一遍根本想不到。










