跳转到内容

二维码 qr-code

数据展示组件。三层同源:无头内核给出解剖与状态机,Vue 组件与自定义元素只是它的两层外壳,行为完全一致。

示例

基础用法

给 value 就画码,版本按内容长度自动选;缺省 M 级纠错、4 个模块的静区

纠错级别

L / M / Q / H 依次能容忍更多污损,同样的内容也因此占更多模块

L
M
Q
H

边长与静区

pixelSize 是整块的像素边长;margin 的单位是模块数,静区含在里面不额外占地方

96px · 静区 4
144px · 静区 4
144px · 静区 0

可及名字

缺省拿 value 当 aria-label;内容不是给人念的时候用 label 换一句人话

码点形状

square / dot / rounded;三种形状的墨都盖住每个模块的格心,读码器按格心取样

square
dot
rounded

码眼形状

只作用于三个定位图形,7×7 的外环加内心结构保持不变,读码器靠它找码

square
rounded
dot + rounded

落位与尺寸由组件给出,那片模块先被底色挖空;放 logo 就把 level 提到 Q 或 H

Q 级 + logo
H 级 + 圆角

换色

颜色不是 props,写三个 CSS 变量即可:码点必须比底色深且对比要足,反相码一部分读码器不认

缺省
深蓝码点
暖底 + 独立码眼色

产物

自定义元素<xh-qr-code>
Vue 组件XhQrCode XhQrCodeLogo
状态机无,connect 直接由 props 算属性
皮肤@xihan-ui/styles/qr-code.css

解剖

部件名即 data-part 属性值,也是皮肤的选择器。加粗的是必备部件,不渲染它组件不工作(Web Components 适配器会在诊断通道上报 wc.missing-part)。

data-scope="qr-code"root · logo

Props

属性类型必填说明
eyeShapeQrEyeShape码眼形状,缺省 square。时序图形与校正图形不受它影响,一律保持方块——它们是透视校正的几何基准。
labelstring可及名字,缺省用 value;给了全空白的名字等于没给。
levelQrLevel纠错级别 L / M / Q / H,缺省 M。
logoboolean码面正中是否留一块给 logo。 留出来的那片模块会被底色盖住,对读码器而言等于人为污损:放 logo 就把 level 提到 Q 或 H, L 与 M 那点纠错余量赔不起这一块。损伤量见 logoDamage;超出所选级别的余量时 会往诊断通道报一条 qr-code.logo-damage 警告,码照画。
marginnumber静区宽度,单位是模块数,缺省 4;静区含在 viewBox 里,不占额外尺寸。
moduleShapeQrModuleShape码点形状,缺省 square。
pixelSizenumber像素边长,缺省 160;写成根上的内联宽高。
valuestring要编码的内容,按 UTF-8 取字节走字节模式;空串不画码。

connect API

connect 产出的对象。getXxxProps() 铺到对应部件的宿主元素上,其余是可读状态与操作入口。

成员类型说明
modulesreadonly (readonly boolean[])[]模块矩阵,[行][列],true = 深色;没画出码时是空数组。
versionnumber实际用到的版本;没画出码时为 0。
countnumber每边模块数,不含静区;没画出码时为 0。
marginnumber解析后的静区宽度,单位是模块数。
viewBoxstring根的 viewBox,含静区。
pathstring除三个码眼以外的模块合成的那条 &lt;path&gt; 的 d;没画出码时是空串,此时不该生成 path 节点。 码眼永远不在这一条里,与形状无关。
eyePathstring三个码眼合成的那条 &lt;path&gt; 的 d;没画出码时是空串,此时不该生成第二个 path 节点。 两条分开画与形状无关:码眼的颜色可以与码点不同,合成一条就没地方单独上色。
logoAreaQrCodeLogoArea | undefinedlogo 的落位与挖空矩形;没留位时为 undefined。
logoDamageQrCodeLogoDamage | undefined挖空对码面造成的损伤;没留 logo 位时为 undefined。
stateQrCodeState当前状态。
errorstring | undefined编码失败的原因;其余状态为 undefined。
labelstring | undefined解析后的可及名字;没给名字时为 undefined,此时根退出无障碍树。
getRootProps() => T['element']
getLogoProps() => T['element']铺到 logo 部件上的落位;没留位时宽高都是 0,那块连同里面的图形一起不渲染。

键盘

规格出处:W3C APG

无键盘交互(不接收焦点,或焦点行为完全由原生元素提供)。

Released under The MIT License