更新记录

1.2.0(2026-09-14) 下载此版本

  • 适配 QQ、百度、快手、京东、飞书、小红书小程序与快应用:JS 写出 PNG 后用 image 展示。

1.1.0(2026-09-14) 下载此版本

  • 修复鸿蒙APP二维码保存相册失败。

1.0.0(2026-09-14) 下载此版本

  • 首发:二维码 / 条形码绘制,支持保存到相册和浏览器下载。
  • 支持多种格式的条形码。
查看更多

平台兼容性

uni-app(4.83)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟

umi-barcode

uni-app 二维码 / 条形码组件。easycom 引入 <umi-barcode>,也可调用 generateCode 直接写出 PNG。

本插件只用于 uni-app 工程(.vue / .nvue),不是 uni-app-x。属性与 umi-barcode-x 对齐,便于同一套业务在两套工程里复用。

平台

Vue 2、Vue 3 均可。nvue App-Android / App-iOS,鸿蒙 App 用 vue 页。

支持 绘制方式
H5(Chrome / Safari 等) canvas,download() 触发浏览器下载 PNG
App-Android / App-iOS(vue) canvas
App-Android / App-iOS(nvue) JS 编码后用 view 画模块,二维码可叠 logo
App-Harmony(vue) JS 编码写出 PNG,<image> 展示
微信小程序 Canvas 2D 出图后用 <image> 展示
支付宝小程序 Canvas 2D(需等 canvas @ready),出图后用 <image> 展示
抖音 / 头条小程序 Canvas 2D 出图后用 <image> 展示
鸿蒙元服务(mp-harmony) JS 编码写出 PNG,<image> 展示
QQ / 百度 / 快手 / 京东 / 飞书 / 小红书 JS 编码写出 PNG,<image> 展示(不走 Canvas 2D)
快应用(华为 / 联盟) JS 编码写出 PNG,<image> 展示

微信 / 支付宝 / 抖音走 Canvas 2D:离屏画完再 canvasToTempFilePath,页面用 <image> 显示。支付宝必须等原生 canvas ready 后再 draw,查询节点用 .node()

QQ、百度等小程序的 canvas type="2d" 官方未与微信对齐,原生 canvas 又高于普通节点、不能进 scroll-view。这些端与快应用改用和鸿蒙相同的 JS 栅格化 PNG,避免各端 canvas 差异。二维码 logo 预览为浮层;保存相册为码图文件(与鸿蒙元服务相同,logo 不一定烧进 PNG)。

码制

format 取值(大小写不敏感;ean-13code_39 等写法会归一化):

format 类型 说明
qrcode / qr 二维码 typeqrcode 时可省略
code128 条形码 typebarcode 且未传 format 时默认此项。内容须为 ASCII 32–127
ean13 / ean-13 条形码 12 位数字自动补校验位,13 位须校验正确
ean8 / ean-8 条形码 7 位数字自动补校验位,8 位须校验正确
code39 / code-39 条形码 0-9 A-Z 及 - . 空格 $ / + %,起止符 * 自动添加
code93 / code-93 条形码 字符集同 Code 39,自动附加 C、K 校验符

使用

easycom 自动引入。vue 页面用 .vue 组件,nvue 页面用 .nvue 组件:

<umi-barcode
    ref="qrBar"
    type="qrcode"
    value="https://uniapp.dcloud.net.cn/"
    :size="200"
    :logo="qrLogo"
    @success="onOk"
    @fail="onFail"
></umi-barcode>
<umi-barcode type="qrcode" size="200px" value="hello"></umi-barcode>
<umi-barcode type="barcode" format="code128" value="ABC-12345678" width="280rpx" height="88rpx"></umi-barcode>
<umi-barcode type="barcode" format="ean13" value="6922868288601" width="280rpx" height="88rpx"></umi-barcode>
<umi-barcode type="barcode" format="ean8" value="96385074" width="280rpx" height="88rpx"></umi-barcode>
<umi-barcode type="barcode" format="code39" value="ABC-1234" width="280rpx" height="88rpx"></umi-barcode>
<umi-barcode type="barcode" format="code93" value="CODE93" width="280rpx" height="88rpx"></umi-barcode>
import qrLogo from './logo.png'

export default {
    data() {
        return { qrLogo }
    },
    methods: {
        onOk(e) {
            // e.path 为码图临时路径(部分端 canvas 直出时可能为空字符串)
            console.log(e.width, e.height, e.path)
        },
        onFail(e) {
            uni.showToast({ title: e.errMsg, icon: 'none' })
        },
        save() {
            this.$refs.qrBar.download().then((path) => {
                uni.showToast({ title: '已保存', icon: 'none' })
            }).catch((err) => {
                uni.showToast({ title: err.message || '保存失败', icon: 'none' })
            })
        }
    }
}

数字尺寸默认 rpx(按 750 设计稿换算成 px),也可写 "200px" / "200rpx"

属性

属性 类型 默认值 说明
value string '' 码内容。空则不绘制
type 'qrcode' | 'barcode' 'qrcode' 二维码或条形码
format string '' 见上表。空则:二维码 qrcode,条形码 code128
size number | string 200 二维码边长。未传 width/height 时使用
width number | string 0 画布宽度
height number | string 0 画布高度。二维码未传时等于宽;条形码未传时约为 size * 0.4,组件默认约 88rpx
margin number 2 静区(模块数)
foreground string '#000000' 前景色,支持 #RGB / #RRGGBB / rgb() / rgba()
background string '#FFFFFF' 背景色
level 'L' | 'M' | 'Q' | 'H' 'M' 二维码纠错等级。设置 logo 时会自动使用 H
logo string '' 二维码中心 logo,仅二维码有效。见下方说明
logoSize number | string 0.22 ≤1 为占短边比例;>1 的数字默认 rpx。最大约 32%
logoPadding number | string 6 logo 周围留白
logoBackground string '#FFFFFF' logo 留白底色
logoRadius number | string 8 logo 与留白圆角

value、尺寸、颜色、logo 等变化会自动重绘。

logo 路径

  • vue 页(含微信 / 支付宝 / 抖音小程序):按 uni-app 静态资源,把图放在页面旁(不要只丢进 static 再把 /static/logo.png 传进组件内部 <image>,会被解析成组件目录)。推荐 import qrLogo from './logo.png':logo="qrLogo"。小程序小于 40kb 会编成 base64,组件内才能显示。
  • nvue / App-Harmony / 鸿蒙元服务 / QQ、百度、快手、京东、飞书、小红书 / 快应用:可用 logo="/static/logo.png"

保存到相册时,带 logo 的二维码会尽量合成进 PNG;预览层可能先浮一层 <image>,合成失败时仍保存无 logo 底图。

事件

事件 载荷 说明
success { path, width, height } 绘制完成。width / height 为展示像素。canvas 直出时 path 可能为 ''
fail { errMsg } 内容非法、编码失败、canvas 不可用等

组件方法

方法 返回 说明
download() Promise<string> H5 触发浏览器下载 PNG,其它支持端写入系统相册;resolve 为原文件路径或相册侧路径

须等 success 之后再调。内容为空会 reject「内容不能为空」;尚未出图会 reject「码图尚未生成」。

JS API

import { generateCode, generateCodeAlbumPreview, saveCodeToAlbum } from '@/uni_modules/umi-barcode'

generateCode(options)

编码并写出 PNG,返回本地路径 Promise。不经过组件,也不会把 logo 图画进文件(logo 非空时只把二维码纠错升到 H)。需要带 logo 的相册文件请用组件 download()

字段 类型 默认 说明
content string 必填 码内容,空则失败
type string 'qrcode' qrcode / barcode
format string 按 type 同组件 format
width / height / size number | string 二维码 200rpx;条形码 280×88 rpx 数字默认 rpx
margin number 2 静区
foreground / background string 黑 / 白 同组件
level string 'M' 二维码纠错;有 logo 时强制 H
logo string '' 仅提升纠错,不绘制 logo
generateCode({
    content: 'hello',
    type: 'qrcode',
    width: 200,
    height: 200
}).then((path) => {
    return saveCodeToAlbum(path)
}).then(() => {
    uni.showToast({ title: '已保存到相册', icon: 'none' })
})

generateCode({
    content: '96385074',
    type: 'barcode',
    format: 'ean8',
    width: 280,
    height: 88
})

saveCodeToAlbum(filePath)

H5 通过浏览器下载已有码图,文件名自动生成为 umi_barcode_*.png;其它支持端把本地码图写入系统相册。filePath 为空会失败。

鸿蒙保存前组件内部会把图垫成约 16:9,减轻授权预览窗裁切码图;调用 generateCode + saveCodeToAlbum 时如需同样效果,可用导出的 generateCodeAlbumPreview(options)(参数同 generateCode)。

保存相册权限

调用 download() / saveCodeToAlbum 前,各端需具备相册写入能力:

H5:不需要相册权限。浏览器会按自身下载设置保存 PNG;应从用户点击事件中调用,避免被浏览器拦截。

iOSmanifest.jsonapp-ios.distribute.privacyDescription):

"NSPhotoLibraryAddUsageDescription": "用于将生成的二维码和条形码保存到相册"

Androidapp-android.distribute.permissions)。不要WRITE_EXTERNAL_STORAGEandroid:maxSdkVersion="28",否则运行期会直接抛错。改权限后必须重新运行(自定义基座要重打)。

"app-android": {
  "distribute": {
    "permissions": [
      "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
      "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>"
    ]
  }
}

微信小程序:在公众平台开通「保存到相册」;用户首次保存会授权 scope.writePhotosAlbum

支付宝小程序:在开放平台配置相册写入能力;首次 saveImageToPhotosAlbum 会拉授权。

抖音 / 头条小程序:在开放平台开通相册权限;首次保存会授权。

QQ / 百度 / 快手 / 京东 / 飞书 / 小红书:在对应开放平台开通相册写入;首次保存走 uni.saveImageToPhotosAlbum。各端权限字段名可能不同,以平台文档为准。

快应用:按厂商相册能力配置。无相册 API 时 download() 会失败,页面仍可展示码图。

鸿蒙(App-Harmony 与 mp-harmony):按工程相册权限配置;授权弹窗预览可能裁切非 16:9 图,组件 download() 已做垫图。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

保存到相册时需要系统相册写入权限。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。