vue根据链接生成二维码(二维码中间可增加logo)

一、安装依赖

npm install vue-qr --save

二、封装组件

1、参数说明
  • appSrc 被生成二维码连接(必填)
  • logoSrc 二维码中间logo图片(选填)默认无
  • size 二维码尺寸(选填)默认150
2、组件代码
<template>
  <vue-qr
    :logo-src="logoSrc"
    :size="size"
    :margin="0"
    :auto-color="true"
    :dot-scale="1"
    :text="appSrc"
  />
</template>
<script>
import VueQr from 'vue-qr'
export default {
  name: 'QrCode',
  props: {
    // 被生成二维码连接(必填)
    appSrc: {
      type: String,
      default: ''
    },
    // 二维码中间logo图片(选填)
    logoSrc: {
      type: String,
      default: ''
    },
    // 二维码尺寸(选填)
    size: {
      type: Number,
      default: 150
    }
  },
  components: {
    VueQr
  }
}
</script>

其他属性说明(如有需要可自行扩展组件)
text:  //编码的内容,不能为空且必须要有值
size: 尺寸, 长宽一致, 包含外边距
margin: 二维码图像的外边距, 默认 20px,一定要设置为零,否则会被莫名奇妙的压缩
colorDark: 实点的颜色
colorLight: 空白区的颜色
bgSrc: 欲嵌入的背景图地址,一般不用,会比较花哨
backgroundDimming: 叠加在背景图上的颜色, 在解码有难度的时有一定帮助
logoSrc: 欲嵌入至二维码中心的 LOGO 地址,头像图片
logoScale: 用于计算 LOGO 大小的值, 过大将导致解码失败, LOGO 尺寸计算公式 logoScale*(size-2*margin), 默认 0.2f
logoMargin: LOGO 标识周围的空白边框, 默认为0
logoCornerRadius: 标识及其边框的圆角半径, 默认为0
whiteMargin: 若设为 true, 背景图外将绘制白色边框
dotScale: (0 < scale < 1.0f) 数据区域点缩小比例,让你的数据保持原来尺寸,如果迷得连接特别长,可以用缩放,如果不是特别长,就设置为1,不然生成的二维码密密麻麻,有些商家的二维码密密麻麻,就是连接太长,导致的,加上不缩放。
autoColor: 若为 true, 背景图的主要颜色将作为实点的颜色, 即 colorDark
binarize: 若为 true, 图像将被二值化处理, 未指定阈值则使用默认值
binarizeThreshold:(0 < threshold < 255) 二值化处理的阈值
callback: 生成的二维码 Data URI 可以在回调中取得,第一个参数为二维码 data URL, 第二个参数为 props 传过来的 qid(因为二维码生成是异步的,所以加个 id 用于排序)
bindElement: 指定是否需要自动将生成的二维码绑定到HTML上, 默认是TRUE

三、使用示例

<template>
    <qr-code :appSrc="appSrc" :logoSrc="logoSrc" :size="150"></qr-code>
</template>

<script>
import QrCode from '@/components/QrCode/QrCode'
export default {
    components: {
        QrCode,
    },
    data() {
        return {
        	logoSrc: 'https://profile.csdnimg.cn/3/C/0/1_zxblogs?v=1597717100',
        	appSrc: 'https://blog.youkuaiyun.com/zxBlogs',
        }
    }
}
</script>
效果

实现效果

<think>我们正在使用Vue3,需要生成一个可配置的二维码根据引用[3],我们知道在启动应用时可以通过终端显示QR码,但用户需求是在Vue3应用中生成并允许用户配置。因此,我们需要一个Vue3的二维码生成组件。 常见的Vue3二维码生成库有: 1. vue-qrcode: 一个简单的二维码生成组件,支持Vue3。 2. qrcode.vue: 另一个支持Vue3的二维码组件,具有更多配置选项。 根据需求,我们需要允许用户配置二维码,因此需要支持一些配置参数,比如: - 二维码内容(text) - 尺寸(size) - 背景色(background) - 前景色(foreground) - 纠错等级(errorCorrectionLevel) 这里我们选择使用`qrcode.vue`,因为它提供了更多的配置选项,并且支持Vue3。 安装: ```bash npm install qrcode.vue@next --save ``` 在组件中使用: 1. 引入组件 2. 绑定需要生成二维码的文本 3. 配置其他可选参数 示例代码: ```vue <template> <div> <qrcode-vue :value="qrText" :size="size" :background="background" :foreground="foreground" :level="level" ></qrcode-vue> <div> <label>二维码内容:</label> <input type="text" v-model="qrText" /> </div> <div> <label>尺寸:</label> <input type="number" v-model="size" /> </div> <div> <label>背景色:</label> <input type="color" v-model="background" /> </div> <div> <label>前景色:</label> <input type="color" v-model="foreground" /> </div> <div> <label>纠错等级:</label> <select v-model="level"> <option value="L">L ()</option> <option value="M">M ()</option> <option value="Q">Q ()</option> <option value="H">H (最高)</option> </select> </div> </div> </template> <script> import { defineComponent, ref } from 'vue' import QrcodeVue from 'qrcode.vue' export default defineComponent({ components: { QrcodeVue }, setup() { const qrText = ref('https://example.com') const size = ref(200) const background = ref('#ffffff') const foreground = ref('#000000') const level = ref('M') // 纠错等级:L, M, Q, H return { qrText, size, background, foreground, level } } }) </script> ``` 说明: - `value`:二维码内容,必填。 - `size`:二维码尺寸,单位是像素。 - `background`:背景色(通常指空白处的颜色)。 - `foreground`:前景色(通常指二维码点的颜色)。 - `level`:纠错等级,可选值为L、M、Q、H,分别对应不同的纠错能力。等级越高,纠错能力越强,但二维码也会更复杂。 这样,用户就可以通过输入框和颜色选择器来配置二维码了。 注意:`qrcode.vue`使用的是QR Code的编码规范,能够满足一般需求。如果需要更高级的配置,可以查看其文档。 另外,引用[3]中提到的通过终端显示QR码,是使用Expo开发时的一种调试方式,与我们现在要做的在Vue3应用中生成二维码不同。 因此,我们使用`qrcode.vue`库来实现。 如果用户需要生成二维码后下载,可以添加下载功能。但当前需求是生成可配置的二维码,所以上述代码已满足。 如果有其他需求,比如下载二维码,可以添加一个按钮,并使用canvas将二维码图像转换为可下载的URL。 示例下载功能(扩展): 在模板中添加: ```vue <button @click="downloadQR">下载二维码</button> ``` 在setup中添加: ```javascript const downloadQR = () => { const canvas = document.querySelector('canvas') // 获取canvas元素 if (canvas) { const link = document.createElement('a') link.href = canvas.toDataURL('image/png') link.download = 'qrcode.png' link.click() } } ``` 但注意:由于我们的二维码组件是封装好的,直接获取canvas可能不够健壮(如果有多个canvas)。我们可以通过给qrcode组件添加ref来获取其canvas元素。 修改模板: ```vue <qrcode-vue ref="qrCode" ... ></qrcode-vue> ``` 然后: ```javascript import { ref } from 'vue' // ... const qrCode = ref(null) const downloadQR = () => { if (qrCode.value) { const canvas = qrCode.value.$el // 组件根元素就是canvas const link = document.createElement('a') link.href = canvas.toDataURL('image/png') link.download = 'qrcode.png' link.click() } } return { // ...其他 qrCode, downloadQR } ``` 这样下载功能就实现了。 综上所述,我们使用`qrcode.vue`库在Vue3中生成可配置的二维码,并提供了下载功能作为扩展。 注意:由于`qrcode.vue`内部使用canvas绘制,所以下载功能可以直接使用canvas的toDataURL方法。 如果用户需要更高级的配置,可以查阅`qrcode.vue`的文档:https://www.npmjs.com/package/qrcode.vue 以上代码在Vue3项目中可以运行。 注意:安装时请使用支持Vue3的版本(即qrcode.vue@next)。 如果用户使用的是Vue2,则需要安装旧版本,但这里需求是Vue3。 因此,我们使用`qrcode.vue@next`。 如果安装过程中出现问题,可以尝试使用`npm install qrcode.vue@3.0.0`(具体版本号以npm仓库为准)。 现在,用户可以在Vue3应用中生成可配置的二维码了。</think>在 Vue3 应用中生成可配置二维码,推荐使用 `vue-qrcode` 或 `qrcode.vue` 库。以下是完整实现方案: ### 安装依赖 ```bash npm install vue-qrcode@next qrcode # 或 yarn add vue-qrcode@next qrcode ``` ### 基础实现 ```vue <template> <div class="qrcode-generator"> <!-- 二维码显示区域 --> <vue-qrcode :value="qrValue" :size="qrSize" :foreground="fgColor" :background="bgColor" :margin="margin" :error-correction-level="errorLevel" class="qrcode-display" /> <!-- 配置面板 --> <div class="config-panel"> <label>二维码内容:</label> <input v-model="qrValue" type="text" /> <label>尺寸:</label> <input v-model.number="qrSize" type="range" min="100" max="500" step="10"> <span>{{ qrSize }}px</span> <label>前景色:</label> <input v-model="fgColor" type="color"> <label>背景色:</label> <input v-model="bgColor" type="color"> <label>边距:</label> <input v-model.number="margin" type="range" min="0" max="20"> <label>纠错等级:</label> <select v-model="errorLevel"> <option value="L">L ()</option> <option value="M">M ()</option> <option value="Q">Q ()</option> <option value="H">H (最高)</option> </select> </div> </div> </template> <script setup> import { ref } from 'vue'; import VueQrcode from 'vue-qrcode'; // 二维码配置参数 const qrValue = ref('https://vuejs.org/'); const qrSize = ref(200); const fgColor = ref('#000000'); const bgColor = ref('#ffffff'); const margin = ref(2); const errorLevel = ref('M'); </script> <style scoped> .qrcode-generator { display: flex; gap: 2rem; max-width: 800px; margin: 0 auto; } .qrcode-display { border: 1px solid #eee; padding: 10px; } .config-panel { display: grid; grid-template-columns: auto 1fr; gap: 1rem; align-items: center; } label { font-weight: bold; } </style> ``` ### 高级功能扩展 1. **添加下载功能** ```vue <template> <button @click="downloadQR">下载二维码</button> </template> <script setup> // ...其他代码 const downloadQR = () => { const canvas = document.querySelector('.qrcode-display canvas'); const link = document.createElement('a'); link.href = canvas.toDataURL('image/png'); link.download = 'qrcode.png'; link.click(); }; </script> ``` 2. **动态内容生成** ```vue <template> <input v-model="dynamicText" placeholder="输入动态内容"> <button @click="generateDynamicQR">生成动态码</button> </template> <script setup> const dynamicText = ref(''); const generateDynamicQR = () => { qrValue.value = `${qrValue.value.split('?')[0]}?t=${Date.now()}&d=${dynamicText.value}`; }; </script> ``` 3. **添加Logo(需qrcode库)** ```vue <script setup> import QRCode from 'qrcode'; // ...其他代码 const generateQRWithLogo = async () => { const canvas = await QRCode.toCanvas(qrValue.value, { width: qrSize.value, margin: margin.value, color: { dark: fgColor.value, light: bgColor.value }, errorCorrectionLevel: errorLevel.value }); // 添加Logo到canvas中心 const ctx = canvas.getContext('2d'); const img = new Image(); img.src = '/path/to/logo.png'; img.onload = () => { const logoSize = qrSize.value * 0.2; const center = qrSize.value / 2 - logoSize / 2; ctx.drawImage(img, center, center, logoSize, logoSize); }; }; </script> ``` ### 配置参数说明 | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `value` | String | `''` | 二维码内容(URL/文本) | | `size` | Number | `128` | 二维码尺寸(像素) | | `foreground` | String | `#000000` | 二维码颜色 | | `background` | String | `#ffffff` | 背景颜色 | | `margin` | Number | `0` | 二维码边距 | | `error-correction-level` | String | `M` | 纠错等级(L/M/Q/H) | ### 最佳实践建议 1. **错误纠正级别选择**: - 普通文本使用 `M`(15%容错) - 重要数据使用 `H`(30%容错) - 带Logo二维码必须使用 `H` 级别 2. **尺寸优化**: - 最小尺寸不低于 100×100px - 移动端推荐 200×200px - 打印场景建议 300×300px 3. **性能优化**: ```vue <vue-qrcode :value="throttledValue" /> ``` ```js import { throttle } from 'lodash-es'; const throttledValue = throttle(qrValue, 500); ``` ### 备选方案 1. **纯JS方案(qrcode)**: ```js import QRCode from 'qrcode'; const generateQR = async () => { const url = await QRCode.toDataURL(text.value, options); qrUrl.value = url; }; ``` 2. **二维码扫描功能集成**: ```bash npm install vue-qrcode-reader ``` [^1]: 关于 Vue 组件生态系统的更多信息 [^2]: Vue 插件集成配置示例 [^3]: 二维码在应用中的基本使用场景
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值