当前位置:首页 > VUE

vue扫码功能实现

2026-02-22 16:27:50VUE

使用 vue-qrcode-reader 库实现扫码功能

安装 vue-qrcode-reader 库

npm install vue-qrcode-reader

在 Vue 组件中引入并使用

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

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

export default {
  components: { QrcodeStream },
  data() {
    return {
      result: ''
    }
  },
  methods: {
    onDecode(decodedString) {
      this.result = decodedString
    }
  }
}
</script>

使用 Html5Qrcode 实现扫码功能

安装 html5-qrcode 库

npm install html5-qrcode

Vue 组件实现

<template>
  <div>
    <div id="reader" style="width: 300px; height: 300px"></div>
    <p>扫描结果: {{ result }}</p>
  </div>
</template>

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

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

    this.html5QrCode.start(
      { facingMode: "environment" },
      config,
      this.onScanSuccess
    ).catch(err => {
      console.error("扫码启动失败:", err)
    })
  },
  beforeUnmount() {
    this.html5QrCode.stop().then(() => {
      console.log("扫码器已停止")
    }).catch(err => {
      console.error("停止扫码器失败:", err)
    })
  },
  methods: {
    onScanSuccess(decodedText) {
      this.result = decodedText
    }
  }
}
</script>

使用原生 API 实现扫码功能

利用浏览器的 MediaDevices API 和 jsQR 库

npm install jsqr

Vue 组件实现

<template>
  <div>
    <video ref="video" autoplay playsinline></video>
    <button @click="stopScan">停止扫描</button>
    <p>扫描结果: {{ result }}</p>
  </div>
</template>

<script>
import jsQR from 'jsqr'

export default {
  data() {
    return {
      result: '',
      videoStream: null,
      animationFrame: null
    }
  },
  mounted() {
    this.startScan()
  },
  beforeUnmount() {
    this.stopScan()
  },
  methods: {
    async startScan() {
      const stream = await navigator.mediaDevices.getUserMedia({
        video: { facingMode: "environment" }
      })
      this.videoStream = stream
      this.$refs.video.srcObject = stream

      this.scanQRCode()
    },
    scanQRCode() {
      const video = this.$refs.video
      const canvas = document.createElement('canvas')
      const context = canvas.getContext('2d')

      const scan = () => {
        if (video.readyState === video.HAVE_ENOUGH_DATA) {
          canvas.width = video.videoWidth
          canvas.height = video.videoHeight
          context.drawImage(video, 0, 0, canvas.width, canvas.height)

          const imageData = context.getImageData(0, 0, canvas.width, canvas.height)
          const code = jsQR(imageData.data, imageData.width, imageData.height)

          if (code) {
            this.result = code.data
          }
        }

        this.animationFrame = requestAnimationFrame(scan)
      }

      this.animationFrame = requestAnimationFrame(scan)
    },
    stopScan() {
      if (this.animationFrame) {
        cancelAnimationFrame(this.animationFrame)
      }
      if (this.videoStream) {
        this.videoStream.getTracks().forEach(track => track.stop())
      }
    }
  }
}
</script>

移动端扫码优化建议

添加权限请求处理

methods: {
  async requestCameraPermission() {
    try {
      const permission = await navigator.permissions.query({ name: 'camera' })
      permission.onchange = () => {
        if (permission.state === 'granted') {
          this.startScan()
        } else {
          console.warn('相机权限被拒绝')
        }
      }
    } catch (err) {
      console.warn('权限API不支持:', err)
    }
  }
}

添加扫描框UI指示

.qr-scanner-overlay {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 200px;
  height: 200px;
  border: 2px solid #4CAF50;
  background: rgba(0, 0, 0, 0.3);
}

常见问题处理

解决相机访问失败

navigator.mediaDevices.getUserMedia({
  video: { facingMode: "environment" }
}).catch(err => {
  console.error("无法访问相机:", err)
  // 尝试使用用户前置摄像头
  return navigator.mediaDevices.getUserMedia({
    video: true
  })
})

处理低光照环境

vue扫码功能实现

const constraints = {
  video: {
    facingMode: "environment",
    torch: true,  // 部分浏览器支持
    brightness: { ideal: 0.8 }
  }
}

这些方法提供了从简单到复杂的多种Vue扫码实现方案,可根据项目需求选择合适的方案。

标签: 功能vue
分享给朋友:

相关文章

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue实现钟表

vue实现钟表

使用 Vue 实现动态钟表 以下是一个基于 Vue 3 的动态钟表实现方案,包含时分秒指针和数字时间显示。 模板部分 <template> <div class="cloc…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue实现jqueryui

vue实现jqueryui

Vue 实现 jQuery UI 功能 在 Vue 项目中实现类似 jQuery UI 的功能,可以通过原生 Vue 组件或第三方库来实现。以下是几种常见 jQuery UI 功能的 Vue 替代方案…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue实现弹幕

vue实现弹幕

Vue 实现弹幕功能 弹幕功能通常包括动态生成、滚动显示、颜色和速度随机化等特性。以下是基于 Vue 3 的实现方法。 核心思路 使用 CSS 动画控制弹幕从右向左滚动。 动态生成弹幕数据,随机设置…