6

我正在努力解决以下问题:我使用 Vue 3 和 Typescript 使用以下代码创建了一个 QRCode 组件:

<template>
  <canvas ref="qrcodeVue"> </canvas>
</template>

<script lang="ts">
import QRCode from "qrcode";
import { Vue, Options } from "vue-class-component";
import { ref } from "vue";

@Options({
  props: {
    value: {
      type: String,
      required: true
    },
    size: {
      type: [Number, String],
      validator: (s: [number | string]) => isNaN(Number(s)) !== true
    },
    level: {
      type: String,
      validator: (l: string) => ["L", "Q", "M", "H"].indexOf(l) > -1
    },
    background: String,
    foreground: String
  }
})
export default class QRCodeVue extends Vue {
  value = "";
  size: number | string = 100;
  level: "L" | "Q" | "M" | "H" = "L";
  background = "#ffffff";
  foreground = "#0000ff";

  mounted() {
    const _size = Number(this.size);
    const scale = window.devicePixelRatio || 1;
    const qrcodeVue = ref<HTMLCanvasElement | null>(null);

    QRCode.toCanvas(qrcodeVue, this.value, {
      scale: scale,
      width: _size,
      color: { dark: this.foreground, light: this.background },
      errorCorrectionLevel: this.level
    });
  }
}
</script>

qrcodeVue总是指什么,我从来没有接触到画布本身。我错过了什么?我应该把这段ref()代码放在哪里?我也尝试过defineComponent同样的结果。感谢您提供任何线索。

(顺便说一句,我也尝试使用 npmqrcode-vue包,但它似乎不支持 Vue 3)

4

1 回答 1

5

您必须首先将 ref 声明qrcodeVue为类属性,而不是 inside mounted

只有这样它才可用并使用 ref 元素填充mounted

export default class QRCodeVue extends Vue {
  qrcodeVue = ref<HTMLCanvasElement | null>(null); // not inside mounted

  mounted() {
    console.log(this.qrcodeVue);  // now it's available
  }
}

这等效于以下 Vue 3setup语法:

setup() {
  const qrcodeVue = ref(null);
  onMounted(() => {
    console.log(qrcodeVue.value);
  })
  return {
    qrcodeVue
  }
}
于 2020-12-29T05:54:47.100 回答