当前位置:首页 > VUE

vue实现扫描二维码

2026-01-11 20:28:01VUE

使用 vue-qrcode-reader 实现二维码扫描

安装 vue-qrcode-reader 库

npm install vue-qrcode-reader

在 Vue 组件中引入并使用

<template>
  <div>
    <qrcode-stream @decode="onDecode" @init="onInit" />
    <p v-if="error">{{ error }}</p>
    <p v-if="result">扫描结果: {{ result }}</p>
  </div>
</template>

<script>
import { QrcodeStream } from 'vue-qrcode-reader'

export default {
  components: { QrcodeStream },
  data() {
    return {
      result: '',
      error: ''
    }
  },
  methods: {
    onDecode(result) {
      this.result = result
    },
    async onInit(promise) {
      try {
        await promise
      } catch (error) {
        if (error.name === 'NotAllowedError') {
          this.error = "请授予相机访问权限"
        } else if (error.name === 'NotFoundError') {
          this.error = "未检测到摄像头设备"
        } else {
          this.error = error.message
        }
      }
    }
  }
}
</script>

使用 Html5Qrcode 实现二维码扫描

安装 html5-qrcode 库

npm install html5-qrcode

Vue 组件实现

<template>
  <div>
    <div id="qr-reader" style="width: 300px"></div>
    <p v-if="result">扫描结果: {{ result }}</p>
  </div>
</template>

<script>
import { Html5Qrcode } from 'html5-qrcode'

export default {
  data() {
    return {
      result: '',
      html5QrCode: null
    }
  },
  mounted() {
    this.html5QrCode = new Html5Qrcode("qr-reader")
    const config = { fps: 10, qrbox: 250 }

    this.html5QrCode.start(
      { facingMode: "environment" },
      config,
      this.onScanSuccess,
      this.onScanError
    ).catch(err => {
      console.error("无法启动扫描器:", err)
    })
  },
  beforeDestroy() {
    if (this.html5QrCode && this.html5QrCode.isScanning) {
      this.html5QrCode.stop()
    }
  },
  methods: {
    onScanSuccess(decodedText) {
      this.result = decodedText
    },
    onScanError(errorMessage) {
      console.log(errorMessage)
    }
  }
}
</script>

注意事项

确保在 HTTPS 环境下测试,大多数现代浏览器要求安全上下文才能访问摄像头

移动端适配需要考虑横竖屏切换时的布局调整

扫描区域大小需要根据实际设备调整,过大可能导致性能问题

处理权限拒绝情况,提供友好的用户引导

扫描结果可能需要验证或过滤,防止恶意内容

扩展功能

添加扫描成功后的声音提示

playBeep() {
  const audio = new Audio('beep.mp3')
  audio.play()
}

添加扫描框自定义样式

#qr-reader {
  border: 2px solid #42b983;
  border-radius: 8px;
}

添加多摄像头切换功能

switchCamera() {
  this.html5QrCode.getCameras().then(devices => {
    if (devices && devices.length > 1) {
      const newCameraId = devices.find(device => 
        device.id !== this.currentCameraId
      ).id
      this.html5QrCode.stop()
      this.startScanner(newCameraId)
    }
  })
}

vue实现扫描二维码

标签: 二维码vue
分享给朋友:

相关文章

vue的动画实现

vue的动画实现

Vue 动画实现方式 Vue 提供了多种方式实现动画效果,主要通过内置组件和第三方库支持。 使用 Vue 内置过渡组件 Vue 的 transition 和 transition-group 组件…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template>…

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓、面…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用XM…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-s…