Skip to content

QRCode 二维码 1.1.2

手机扫码预览
13:03

组件名:rice-qrcode

能够将文本转换生成二维码的组件,支持自定义配色,自定义形状和 Logo 配置
使用前请先阅读FAQ

平台兼容性

uni-app x

AndroidiOSHarmonyOSHarmonyOS(Vapor)微信小程序h5

基础用法

value 的值即二维码的值,值改变时,二维码会自动刷新

vue
<rice-qrcode value="https://riceui.cn/"/>

二维码状态

可在二维码 加载中/已过期/已扫描 等状态下使用

  • show-statustrue 时可以展示二维码状态区域的view;
  • status-class 可以自定义状态区域的样式,如背景色,文字对其方式等;
vue
<template>
  <rice-qrcode :value="value" :size="200" :show-status="status!='normal'" class="custom-class"
    status-class="status-class" @complete="onComplete2">
    <template #status>
      <rice-loading v-if="status=='loading'" text="生成中…" vertical />
      <view v-else-if="status=='expire'">
        <text class="statue-text">二维码已过期</text>
        <rice-button size="small" text="点我重新生成" type="primary" @click="refreshCode"></rice-button>
      </view>
    </template>
  </rice-qrcode>
  <view class="flex">
    <rice-count-down :time="expireTime" format="ss秒" @finish="onFinish" />
    <text class="text" style="margin-left:6px"> 后二维码过期</text>
  </view>
</template>

<script setup>
const value = ref('')
const status = ref('loading')
const expireTime = ref(0)
const getQrCodeValue = () => {
  setTimeout(() => {
    value.value = 'https://riceui.cn/components/quickstart.html'
    expireTime.value = 15 * 1000
  }, 1500)
}

const onComplete2 = () => {
  status.value = 'normal'
}

const onFinish = () => {
  if (value.value != '') {
    status.value = 'expire'
  }
}

//重新生成二维码
const refreshCode = () => {
  status.value = 'loading'
  setTimeout(() => {
    value.value = `https://riceui.cn/components/count-down.html?t=${Date.now()}`
    expireTime.value = 10 * 1000
  }, 1500)

}

onReady(() => {
  getQrCodeValue()
})
</script>

<style scoped lang="scss">
.custom-class {
  border: none;
}
.status-class {
  // background-color:rgba(255,255,255,.4)
}

.statue-text {
  color: red;
  font-size: 18px;
  font-weight: bold;
  margin-bottom: 4px;
}
</style>

API

Props

属性名类型说明默认值
valueString二维码的值
sizeNumber二维码的尺寸160
colorString二维码颜色#000
iconStringlogo 地址,支持本地和网络图片
icon-optionUTSJSONObjectlogo的宽高{height:30,width:30}
levelString纠错等级 L/M/Q/H无icon时,默认为 M,有icon时默认为 Q
auto-exportBoolean二维码绘制完成后是否生成图片,可在complete中拿到false
paddingNumber二维码的边距2个色块的码边距
eye-shaperString码眼的形状 square\circle\roundsquare
dot-shapeString点的形状 square\dotsquare
show-statusBoolean是否显示状态区域false
status-classString自定义状态区域的class

Events

事件名说明回调参数
complete二维码绘制完成后触发,只要二维码改变了就会触发,不管是形状还是value值payload:QRCodeCompletePayload
error二维码绘制失败时触发err:QRCodeError

方法

通过 ref 可以获取到 QRCode 实例并且调用实例的方法

方法名说明返回值
getTempFilePath获取二维码图片的地址异步方法,App端返回的是临时地址,web/小程序返回的是base64 ,图片生成失败会返回空字符串

App 端返回的图片是带静区的,即 padding 的值,web/小程序不带

调用方法示例

ts
const qrCodeRef = ref<RiceQrcodeComponentPublicInstance | null>(null)
//获取二维码图片的地址,app端返回的是临时地址,web/小程序返回的是base64
const value =await qrCodeRef.value!.getTempFilePath()

Slots 插槽

名称说明参数
status自定义二维码状态-

类型定义

组件导出如下类型

ts
//二维码绘制完成
type QRCodeCompletePayload = {
	tempFilePath : string | null, //仅当 autoExport 为 true 时才返回字符串
	autoExport : boolean,
}

//二维码绘制失败
type QRCodeError = {
	code : number, // 0 uni.createCanvasContextAsync 失败 ,1 value 为空 2:绘制二维码失败
	errMsg : string, //错误信息
}

组件类型

ts
// 组件类型
const qrCodeRef = ref<RiceQrcodeComponentPublicInstance | null>(null)

FAQ

关于二维码纠错等级
纠错等级也叫纠错率,就是指二维码可以被遮挡后还能正常扫描,而这个能被遮挡的最大面积就是纠错率。

通常情况下二维码分为 4 个纠错级别:L级 可纠正约 7% 错误、M级 可纠正约 15% 错误、Q级 可纠正约 25% 错误、H级 可纠正约 30% 错误。但并不是所有位置都可以缺损,像最明显的三个角上的方框,直接影响初始定位。中间零散的部分是内容编码,可以容忍缺损。当二维码的内容编码携带信息比较少的时候,也就是链接比较短的时候,设置不同的纠错等级,生成的图片不会发生变化。 可参阅官方文档相关资料

生成的二维码无法扫描?

  1. 可能是因为链接地址过长导致像素过于密集,可以通过 size 配置二维码更大,或者通过短链接服务等方式将链接变短。
  2. icon 时,纠错等级请 至少不低于 Q,目前组件内部的逻辑是:无icon时,默认为 M,有icon时默认为 Q,如果传了level,以传的为准
  3. icon 时不建议同时把样式做得太激进,比如同时使用很小的 padding、dot-shape="dot"、 icon尺寸过大等
  4. padding 本质上是二维码静区,太小会影响扫码识别,尤其是在小尺寸、复杂背景、低端设备或相机对焦一般的情况下,如果没有特殊设计要求,建议保留默认值或只做小幅调整

怎么改变二维码父级的样式

直接在组件上使用 classstyle 即可