QrCodeView.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <template>
  2. <div class="wrapper relative">
  3. <img :src="dataUrl" width="100%" height="100%" />
  4. </div>
  5. </template>
  6. <script>
  7. import QrCode from 'qrcode'
  8. export default {
  9. name: 'QrCodeView',
  10. props: {
  11. code: {
  12. type: String,
  13. required: true
  14. }
  15. },
  16. data: () => ({
  17. dataUrl: ''
  18. }),
  19. methods: {
  20. genQRCode () {
  21. const { qrCodeCanvas } = this.$refs
  22. const { code } = this
  23. if (code) {
  24. QrCode.toDataURL(code, {
  25. margin: 0
  26. }, (error, url) => {
  27. if (error) {
  28. console.error(error)
  29. } else {
  30. this.dataUrl = url
  31. }
  32. })
  33. } else {
  34. const ctx = qrCodeCanvas.getContext('2d')
  35. ctx.clearRect(0, 0, qrCodeCanvas.width, qrCodeCanvas.height)
  36. }
  37. },
  38. render () {
  39. this.genQRCode()
  40. },
  41. clearResizeTimer () {
  42. clearTimeout(this.resizeTimer)
  43. },
  44. onWindowResize () {
  45. this.clearResizeTimer()
  46. this.resizeTimer = setTimeout(() => {
  47. this.render()
  48. }, 100)
  49. }
  50. },
  51. watch: {
  52. code () {
  53. this.genQRCode()
  54. }
  55. },
  56. created () {
  57. window.addEventListener('resize', this.onWindowResize)
  58. },
  59. mounted () {
  60. this.render()
  61. },
  62. beforeDestroy () {
  63. this.clearResizeTimer()
  64. window.removeEventListener('resize', this.onWindowResize)
  65. }
  66. }
  67. </script>
  68. <style lang="scss"></style>