当前位置:首页 > VUE

vue实现扫码

2026-02-10 22:06:33VUE

Vue 实现扫码功能的方法

使用 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>

使用 html5-qrcode

安装依赖:

npm install html5-qrcode

实现代码:

<template>
  <div>
    <div id="qr-reader" style="width: 500px"></div>
    <p>扫描结果: {{ 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,
      (decodedText) => {
        this.result = decodedText
      },
      (errorMessage) => {
        console.log(errorMessage)
      }
    )
  },
  beforeDestroy() {
    if (this.html5QrCode && this.html5QrCode.isScanning) {
      this.html5QrCode.stop()
    }
  }
}
</script>

使用原生 API 实现

通过浏览器原生 API 访问摄像头:

<template>
  <div>
    <video ref="video" autoplay playsinline></video>
    <canvas ref="canvas" style="display: none;"></canvas>
    <p>扫描结果: {{ result }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      result: '',
      mediaStream: null
    }
  },
  methods: {
    async initCamera() {
      try {
        this.mediaStream = await navigator.mediaDevices.getUserMedia({
          video: { facingMode: 'environment' }
        })
        this.$refs.video.srcObject = this.mediaStream
      } catch (err) {
        console.error('摄像头访问失败:', err)
      }
    },

    scanQR() {
      const canvas = this.$refs.canvas
      const video = this.$refs.video
      const context = canvas.getContext('2d')

      canvas.width = video.videoWidth
      canvas.height = video.videoHeight
      context.drawImage(video, 0, 0, canvas.width, canvas.height)

      try {
        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
        }
      } catch (e) {
        console.log(e)
      }

      requestAnimationFrame(this.scanQR)
    }
  },
  mounted() {
    this.initCamera()
    this.scanQR()
  },
  beforeDestroy() {
    if (this.mediaStream) {
      this.mediaStream.getTracks().forEach(track => track.stop())
    }
  }
}
</script>

移动端优化建议

对于移动端设备,建议添加以下优化:

vue实现扫码

  • 设置合适的视频尺寸和扫描框大小
  • 添加权限请求处理
  • 考虑横竖屏适配问题
  • 添加扫描成功后的反馈提示

注意事项

  • 需要在 HTTPS 环境下或 localhost 才能正常使用摄像头
  • 首次使用需要用户授权摄像头权限
  • 不同浏览器对摄像头的支持程度可能不同
  • 生产环境建议使用成熟的扫码库而非原生实现

以上方法可以根据项目需求选择适合的方案,第三方库通常提供更好的兼容性和功能支持。

标签: vue
分享给朋友:

相关文章

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…

vue实现定时

vue实现定时

Vue 实现定时功能的方法 使用 setInterval 和 clearInterval 在 Vue 中可以通过 setInterval 和 clearInterval 实现定时功能。在组件的 mou…

vue实现链接

vue实现链接

Vue 实现链接的方法 在 Vue 中实现链接可以通过多种方式,包括使用 <router-link>、<a> 标签或编程式导航。以下是几种常见的方法: 使用 <rout…

实现vue vm

实现vue vm

Vue VM 实现方法 Vue VM(ViewModel)是 Vue.js 的核心概念之一,负责连接视图(View)和数据模型(Model)。以下是实现 Vue VM 的几种方法: 使用 Vue 实…

vue实现左右拉伸

vue实现左右拉伸

实现左右拉伸布局的方法 使用CSS Flexbox布局 Flexbox可以轻松实现左右拉伸的效果。通过设置display: flex和flex-grow属性,可以让元素填充可用空间。 <div…

实现vue页面回退

实现vue页面回退

监听浏览器返回事件 在Vue组件中使用beforeRouteLeave导航守卫,可以监听路由变化。该方法在离开当前路由前触发,适用于需要确认或保存数据的场景。 beforeRouteLeave(…