1. 需求:移动端用第三方vue-qrcode-reader实现扫一扫功能。
2. 下载vue-qrcode-reader依赖

//   npm 下载
npm install --save vue-qecode-reader
// 如果有版本问题报错(适用于vue2)
npm install --save vue-qrcode-reader@3

3. 在A页面添加扫一扫button,然后点击跳转到B页面,然后扫一扫写在B页面,在扫描到二维码后携带扫到的内容跳转到A页面

<template>
    <div class="saoma">
        <div class="backBtn">
            <Button type="primary" @click="$emit('back')">
                <Icon type="ios-arrow-back" />
                返回
            </Button>
        </div>
        <qrcode-stream  @decode="onDecode" @init="onInit" style="height: 100vh;width:100vw">
            <div>
                <div class="qr-scanner">
                <div class="box">
                    <div class="line"></div>
                    <div class="angle"></div>
                </div>
                </div>
            </div>
        </qrcode-stream>
    </div>
  </template>
  
  <script>
    import {
        QrcodeStream
    } from 'vue-qrcode-reader';
    export default {
        props: {
            operationType: {
                type: String,
                default: '',
            },
        },
        components: {
            QrcodeStream
        },
        data() {
            return {
                result: '', // 扫码结果信息
                error: '' // 错误信息
            }
        },
        methods: {
            onDecode(result) {
                if(result){
                    if(this.operationType == 'login'){
                        this.$emit('login',result)
                    }else if(this.operationType == 'camera'){
                        this.$emit('openCamera',result)
                    }
                }else{
                    this.$Message.warning('未获得扫码结果')
                }
            },
            async onInit(promise) {
                try {
                    await promise
                } catch (error) {
                    console.log('error',error);
                    if (error.name === 'NotAllowedError') {
                        this.$Message.warning('您需要授予相机访问权限')
                    } else if (error.name === 'NotFoundError') {
                        this.$Message.warning('这个设备上没有摄像头')
                    } else if (error.name === 'NotSupportedError') {
                        this.$Message.warning('所需的安全上下文(HTTPS、本地主机)')
                    } else if (error.name === 'NotReadableError') {
                        this.$Message.warning('相机被占用')
                    } else if (error.name === 'OverconstrainedError') {
                    } else if (error.name === 'StreamApiNotSupportedError') {
                        this.$Message.warning('此浏览器不支持流API')
                    }else if(error.name === 'InsecureContextErroe'){
                        this.$Message.warning('请在安全的情况下才访问摄像头')
                    }
                    this.$emit('back')
                }
            },
        }
    }
  </script>
  
  <style scoped>
    .saoma {
        width: 100vw;
        height: 100vh;
    }
    .qr-scanner {
    background-image:
        linear-gradient(0deg,
            transparent 24%,
            rgba(32, 255, 77, 0.1) 25%,
            rgba(32, 255, 77, 0.1) 26%,
            transparent 27%,
            transparent 74%,
            rgba(32, 255, 77, 0.1) 75%,
            rgba(32, 255, 77, 0.1) 76%,
            transparent 77%,
            transparent),
        linear-gradient(90deg,
            transparent 24%,
            rgba(32, 255, 77, 0.1) 25%,
            rgba(32, 255, 77, 0.1) 26%,
            transparent 27%,
            transparent 74%,
            rgba(32, 255, 77, 0.1) 75%,
            rgba(32, 255, 77, 0.1) 76%,
            transparent 77%,
            transparent);
        background-size: 3rem 3rem;
        background-position: -1rem -1rem;
        width: 100%;
        /* height: 100%; */
        height: 100vh;
        position: relative;
        background-color: #1110;
      /* background-color: #111; */
    }
    .qr-scanner .box {
        width: 213px;
        height: 213px;
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        overflow: hidden;
        border: 0.1rem solid rgba(0, 255, 51, 0.2);
        /* background: url('http://resource.beige.world/imgs/gongconghao.png') no-repeat center center; */
    }
    .qr-scanner .line {
        height: calc(100% - 2px);
        width: 100%;
        background: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%);
        border-bottom: 3px solid #00ff33;
        transform: translateY(-100%);
        animation: radar-beam 2s infinite alternate;
        animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99);
        animation-delay: 1.4s;
    }
    .qr-scanner .box:after,
    .qr-scanner .box:before,
    .qr-scanner .angle:after,
    .qr-scanner .angle:before {
        content: '';
        display: block;
        position: absolute;
        width: 3vw;
        height: 3vw;
        border: 0.2rem solid transparent;
    }
    .qr-scanner .box:after,
    .qr-scanner .box:before {
        top: 0;
        border-top-color: #00ff33;
    }
    .qr-scanner .angle:after,
    .qr-scanner .angle:before {
        bottom: 0;
        border-bottom-color: #00ff33;
    }
    .qr-scanner .box:before,
    .qr-scanner .angle:before {
        left: 0;
        border-left-color: #00ff33;
    }
    .qr-scanner .box:after,
    .qr-scanner .angle:after {
        right: 0;
        border-right-color: #00ff33;
    }
    @keyframes radar-beam {
        0% {
            transform: translateY(-100%);
        }
        100% {
            transform: translateY(0);
        }
    }
  </style>

4.注意:需要在本地或者https协议下才可以调用相机,实现扫码。

5.效果图
在这里插入图片描述

GitHub 加速计划 / vu / vue
207.52 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:1 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 3 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐