Skip to content

NBarcode 条形码 ​

基于 Canvas 绘制的条形码组件:EAN-13 商品条码与 Code 128 通用条码双码型,颜色 / 数字标注 / 尺寸全可配,像素级高分屏绘制与 png dataURL 导出。

平台兼容性 ​

App(ANDROID) App(IOS) App(HARMONY) WEB 微信小程序
✓ ✓ ✓ ✓ ✓
  • 绘制通道分端:Web 端画布元素直取上下文,小程序端组件作用域选择器取节点,App 端异步上下文载体;导出统一 png dataURL。
  • Code 128 仅支持 ASCII 字符(含中文会触发 error);EAN-13 仅接受数字。

基本使用 ​

html
<template>
	<n-barcode value="6937147252044" />
</template>

EAN-13 说明:12 位输入自动补校验位;13 位输入校验校验位,校验失败时条码仍绘制并触发 invalid(无效条码扫码枪读不出商品信息,仅供展示场景判断)。内容非 12/13 位数字时触发 error 且不绘制。

Code 128(任意 ASCII 文本,长度自适应码集压缩):

html
<template>
	<n-barcode type="code128" value="ORDER-2024" :width="380" :height="100" />
</template>

内容动态更新(value 一变即重绘):

html
<template>
	<n-barcode :value="code" @change="onChange" @error="onError" />
</template>
<script setup lang="uts">
	const code = ref("6937147252044");
	function onChange(value: string) {
		// value 为当前绘制完成的内容
	}
	function onError(message: string) {
		// 内容非法(位数 / 字符范围)等
	}
</script>

导出图片:

html
<script setup lang="uts">
	const barcodeRef = ref<NBarcodeComponentPublicInstance | null>(null);
	async function save() {
		const dataUrl = await barcodeRef.value!.toPng();
		// png dataURL,可直接用作 image src 或自行转存
	}
</script>

API ​

属性 ​

属性 类型 默认值 说明
value string "" 条码内容:ean13 为 12/13 位数字(12 位自动补校验位),code128 为 ASCII 文本
width number | string 380 条码宽度 px(数字)或 px/rpx 字符串
height number | string 120 条码高度 px(数字)或 px/rpx 字符串
type "ean13" / "code128" "ean13" 码型
color string "#181818" 条与数字标注颜色
showText boolean true 是否在条码下方绘制数字标注(ean13)
showPrefix boolean true 首位数字是否前置显示在条码左侧(ean13)
customClass string "" 根节点类名(类须定义在组件样式表内,如 n-barcode--xxx)
customStyle string "" 根节点行内样式,拼接在内部默认值之后可覆盖(含尺寸)

事件 ​

事件 参数 说明
ready — 首次绘制完成时触发(仅一次)
change value: string 条码重绘完成时触发,参数为当前内容
valid — EAN-13 校验位通过时触发
invalid — EAN-13 校验位失败时触发(条码仍已绘制,仅供展示判断)
longpress — 长按条码时触发
error message: string 生成失败时触发:内容非法(EAN-13 非 12/13 位数字、Code 128 含非 ASCII 字符)或画布通道失败

插槽 ​

无。

实例方法 ​

(通过 ref 直调)

方法 参数 返回 说明
toPng — Promise&lt;string> 导出当前条码为 png dataURL(三端一致);空内容或未绘制成功时返回空串

实现说明(参考做法 vs 本库做法) ​

参考源仅其一(另两源无条码组件),下表逐机制记录映射与分歧:

机制 参考做法 本库做法 分歧理由
码型命名 type 数字 1(EAN-13)/ 2(Code 128) 字符串枚举 "ean13" | "code128" 语义化枚举(数字魔数可读性差)
尺寸语义 width/height 为 rpx 数值 数字 = px、字符串支持 px/rpx 与本库二维码等画布组件换算语义一致
数字标注开关 options.number prop showText number 命名易误读为"内容须为数字"
首位前置开关 options.prefix prop showPrefix 与 showText 对仗自解释
前景色 options.color(默认 #181818) prop color,默认值沿用 提为正式 prop
Code 128 前景 固定 #000000(不接 color) 统一接 color 同一 color prop 对两种码型生效,避免同 prop 行为分叉
调试辅助线 options.debug(红色分隔线) 不收录 编码库调试残留,无使用者价值;校验有效性走 valid/invalid
校验回调 onValid / onInvalid / onSuccess / onError 回调参数 事件 valid / invalid;成功/失败由 ready / change / error 覆盖 回调式 options 事件化(库惯例),不重复设事件
手动绘制 draw(options) 手动入口 无 draw():value 等 props 响应式自动重绘 参考无响应式的补丁入口;响应式后手动入口冗余
触摸透传 touchStart / touchEnd 透传 不收录 无业务语义(画布触摸不含交互逻辑),业务可直接在组件外层监听
longclick longclick 事件 longpress 事件(画布通用长按事件转发) 统一 uni 惯用事件名
ready 参数 无参 使用者无需画布 id(组件自持绘制通道)
导出 无 toPng() png dataURL 三端一致 与本库二维码 / 签名 / 裁剪组件同源导出基建
Code 128 几何 绘制起点 top = border_size - 4(条顶 4px 画到画布外被裁、底部贴边) top = 0、条高 = 画布高 根治参考实现补偿 hack
EAN-13 校验位公式 10 - (counter % 10) % 10:权重和为 10 的倍数时校验位产出 10(两位数导致编码失败) (10 - (counter % 10)) % 10 根治参考实现公式缺陷(校验位 0 的合法场景参考无法编码)
Code 128 的 ~ 字符 设计意图为替换 FNC1(GS1-128),但替换表对象字面量键未求值、替换恒不生效(~ 被编成普通字符) ~ 生效替换为 FNC1 按参考注释自述的设计意图修复死代码;GS1 条码的 FNC1 为真实业务需求
空值 空串走空编码绘制空码 空值清空画布不发事件 与本库二维码同契约
主题 不随主题 不随主题(背景透明、颜色由 color 控制) 条码是数据图形,颜色显式控制

编码核心为 EAN-13(GB 12904 / ISO 15420)与 Code 128(ISO 15417)公开标准算法实现:编码表与校验公式逐字节对齐成熟开源实现,离线比对脚本验证输出逐位一致(EAN-13 十种首位国家模式全比对;Code 128 码集 A/B/C 自动择优、SHIFT 切换、校验和 mod 103)。

记录 · 思考 · 创作