当前位置:首页 > VUE

vue实现扫码

2026-01-08 06:50:06VUE

Vue 实现扫码功能

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

使用 html5-qrcode

安装 html5-qrcode 库:

npm install html5-qrcode

在 Vue 组件中实现扫码:

<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: ''
    }
  },
  mounted() {
    const html5Qrcode = new Html5Qrcode('qr-reader')
    html5Qrcode.start(
      { facingMode: 'environment' },
      { fps: 10, qrbox: 250 },
      (decodedText) => {
        this.result = decodedText
      },
      (errorMessage) => {
        console.error(errorMessage)
      }
    )
  }
}
</script>

使用原生 API 实现

通过浏览器原生 API 调用摄像头并解析二维码:

<template>
  <div>
    <video ref="video" width="400" height="300" autoplay></video>
    <canvas ref="canvas" width="400" height="300" style="display: none"></canvas>
    <button @click="scanQR">开始扫描</button>
    <p>扫描结果: {{ result }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      result: '',
      interval: null
    }
  },
  methods: {
    async scanQR() {
      const stream = await navigator.mediaDevices.getUserMedia({ video: true })
      this.$refs.video.srcObject = stream

      this.interval = setInterval(() => {
        const canvas = this.$refs.canvas
        const context = canvas.getContext('2d')
        context.drawImage(this.$refs.video, 0, 0, canvas.width, canvas.height)
        const imageData = context.getImageData(0, 0, canvas.width, canvas.height)
        // 这里需要添加二维码解析逻辑
        // 可以使用第三方库如 jsQR 来解析
      }, 500)
    }
  },
  beforeDestroy() {
    if (this.interval) clearInterval(this.interval)
    if (this.$refs.video.srcObject) {
      this.$refs.video.srcObject.getTracks().forEach(track => track.stop())
    }
  }
}
</script>

移动端适配

对于移动端设备,需要考虑权限请求和横竖屏适配:

<template>
  <div class="scanner-container">
    <qrcode-stream
      @decode="onDecode"
      :torch="torchActive"
      @torch-compatibility="onTorchCompatibility"
    ></qrcode-stream>
    <button @click="toggleTorch">切换闪光灯</button>
  </div>
</template>

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

export default {
  components: { QrcodeStream },
  data() {
    return {
      result: '',
      torchActive: false,
      hasTorch: false
    }
  },
  methods: {
    onDecode(decodedString) {
      this.result = decodedString
    },
    onTorchCompatibility({ compatible }) {
      this.hasTorch = compatible
    },
    toggleTorch() {
      if (this.hasTorch) {
        this.torchActive = !this.torchActive
      }
    }
  }
}
</script>

<style>
.scanner-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
</style>

以上方法提供了从简单到复杂的多种实现方案,可以根据项目需求选择合适的方案。对于生产环境,推荐使用成熟的第三方库如 vue-qrcode-readerhtml5-qrcode,它们已经处理了大多数兼容性和性能问题。

vue实现扫码

标签: vue
分享给朋友:

相关文章

订单 vue实现

订单 vue实现

Vue 实现订单功能 数据模型设计 订单功能通常需要设计以下数据结构: // 订单数据结构 const order = { id: '', // 订单ID userId…

vue双向实现

vue双向实现

Vue 双向数据绑定的实现原理 Vue 的双向数据绑定主要通过 v-model 指令实现,其核心是结合了数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。 数据…

vue实现目录

vue实现目录

Vue 实现目录功能 在 Vue 中实现目录功能通常需要动态生成目录结构,并支持点击跳转到对应内容区域。以下是几种常见实现方式: 基于滚动监听和动态生成 安装依赖(如需): npm inst…

vue实现头像剪切

vue实现头像剪切

Vue 实现头像剪切的实现方法 使用 vue-cropperjs 库 vue-cropperjs 是一个基于 cropperjs 的 Vue 组件,专门用于图片裁剪。安装方式如下: npm inst…

vue实现皮肤切换

vue实现皮肤切换

实现皮肤切换的基本思路 在Vue中实现皮肤切换功能,通常涉及动态修改CSS变量或类名。核心是通过状态管理当前主题,并在组件中应用对应的样式。 使用CSS变量实现主题切换 CSS变量(自定义属性)是…

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序 在 Vue 中实现冒泡排序,可以通过数据绑定和响应式特性动态展示排序过程。以下是一个完整的实现示例,包含代码和详细说明。 数据准备 在 Vue 的 data 中定义一个数组作为…