need: Plugins: Plugin Download npm install --save vue-qrcode-reader Notice: <template> <div> <p class="error">{{ error }}</p> <!--Error message--> <p class="decode-result"> Scan Results: {{ result }} </p> <!--Scan Results--> <qrcode-stream @decode="onDecode" @init="onInit" style="height: 100vh;"> <div> <div class="qr-scanner"> <div class="box"> <div class="line"></div> <div class="angle"></div> </div> </div> </div> </qrcode-stream> </div> </template> <script> // Download the plugin // cnpm install --save vue-qrcode-reader // Import import { QrcodeStream } from 'vue-qrcode-reader' export default { // Register components: { QrcodeStream }, data() { return { result: '', // Scan result information error: '' // Error message } }, methods: { onDecode(result) { alert(result) this.result = result }, async onInit(promise) { try { await promise } catch (error) { if (error.name === 'NotAllowedError') { this.error = 'ERROR: You need to grant camera access' } else if (error.name === 'NotFoundError') { this.error = 'ERROR: There is no camera on this device' } else if (error.name === 'NotSupportedError') { this.error = 'ERROR: Security context required (HTTPS, localhost)' } else if (error.name === 'NotReadableError') { this.error = 'ERROR: The camera is occupied' } else if (error.name === 'OverconstrainedError') { this.error = 'ERROR: Camera installation is inappropriate' } else if (error.name === 'StreamApiNotSupportedError') { this.error = 'ERROR: This browser does not support the streaming API' } } } } } </script> <style scoped> .error { font-weight: bold; color: red; } </style> <style scoped> /* * { margin: 0; padding: 0; } body { height: 700px; margin: 0; } */ .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> OK, let's implement the code scanning function in a code vue project Project address: https://github.com/wkl007/vue-scan-demo.git <div class="scan"> <div id="bcid"> <div style="height:40%"></div> <p class="tip">...Loading...</p> </div> <footer> <button @click="startRecognize">1. Create a control</button> <button @click="startScan">2. Start scanning</button> <button @click="cancelScan">3. End scanning</button> <button @click="closeScan">4. Close the control</button> </footer> </div> </template> <script type='text/ecmascript-6'> let scan = null export default { data () { return { codeUrl: '', } }, methods: { // Create a scanning control startRecognize () { let that = this if (!window.plus) return scan = new plus.barcode.Barcode('bcid') scan.onmarked = onmarked function onmarked (type, result, file) { switch (type) { case plus.barcode.QR: type = 'QR' break case plus.barcode.EAN13: type = 'EAN13' break case plus.barcode.EAN8: type = 'EAN8' break default: type = 'Other' + type break } result = result.replace(/\n/g, '') that.codeUrl = result alert(result) that.closeScan() } }, // Start scanning startScan () { if (!window.plus) return scan.start() }, // Close the scan cancelScan () { if (!window.plus) return scan.cancel() }, // Close the barcode recognition control closeScan () { if (!window.plus) return scan.close() }, } } </script> <style lang="less"> .scan { height: 100%; #bcid { width: 100%; position: absolute; left: 0; right: 0; top: 0; bottom: 3rem; text-align: center; color: #fff; background: #ccc; } footer { position: absolute; left: 0; bottom: 1rem; height: 2rem; line-height: 2rem; z-index: 2; } } </style> This is the end of this article about Vue's implementation of the code scanning function with styles. For more relevant Vue code scanning function content, please search 123WORDPRESS.COM's previous articles or continue to browse the following related articles. I hope everyone will support 123WORDPRESS.COM in the future! You may also be interested in:
|
<<: Briefly understand the two common methods of creating files in Linux terminal
>>: Baota Linux panel command list
In a page, there are many controls (elements or ta...
Table of contents 1. Environment 2. Preparation 3...
Recently, when upgrading the Zabbix database from...
When I first used docker, I didn't use docker...
Forgot your MySQL password twice? At first I did ...
1. Replication Principle The master server writes...
The following graph shows how time-consuming it is...
Recently, we have been capturing SQL online for o...
Note: You cannot use scoped animations! ! ! ! via...
Table of contents Preface 1. Less 2. Import your ...
MySQL is the most popular relational database man...
Preface MySQL is a high-speed, high-performance, ...
Table of contents Install and configure dnsmasq I...
In order to enhance the ability to write JavaScri...
Speaking of Nestjs exception filter, we have to m...