Vue 프로젝트 QRCode 공통 컴포넌트 개발

Vue QRCode 컴포넌트 개발 방법

qrcode 라이브러리 추가

"dependencies": {
  "qrcode": "^1.5.3"
}

Javascript에서 qrcode를 쉽게 그려주는 라이브러리를 추가합니다.
package.json 파일 수정 후 npm install 명령어 실행이 필요합니다.

환경변수 파일에 링크 추가

VITE_BOARD_FRONT_URL=http://10.10.1.86:5173

.env.서버구분 파일에 QRCode 베이스 URL을 작성합니다.

QRCode 공통 컴포넌트 작성

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

<script setup>
import { onMounted, ref } from 'vue';
import QRCode from 'qrcode';

const canvas = ref();

const props = defineProps({
  qrUrl: {
    type: String,
    required: true
  }
})

onMounted(() => {
  if (!props.qrUrl) return;

  // 부모 width 사이즈 정사각형 QR 생성 후 캔버스에 렌더링
  QRCode.toCanvas(canvas.value, props.qrUrl, { margin: 0, width: canvas.value.parentElement.clientWidth })
        .catch(err => console.error(err));
})
</script>

<style scoped>
canvas {
  display: block;
  max-width: 100%;
  max-height: 100%;
}
</style>

캔버스 DOM에 부모 width 크기 QRCode를 그려주는 공통 QR 컴포넌트 예시입니다.
QRCode 생성 시 width를 지정하지 않으면 기본 사이즈 116px로 그려집니다.
현재 부모 사이즈를 벗어나지 않도록 캔버스에 max 사이즈를 부여합니다.

QRCode 컴포넌트 사용 예시

<template>
  <QrCode :qrUrl="qrUrl" v-if="qrUrl" />
</template>

<script setup>
import QrCode from "@/components/common/QrCode.vue";
import { useMainStore } from "@/stores/mainStore.js";
import { storeToRefs } from 'pinia';
import { computed } from "vue";
const mainStore = useMainStore();

const boardFrontUrl = import.meta.env.VITE_BOARD_FRONT_URL;

let { user } = storeToRefs(mainStore);

// 스토어에 입장코드가 있는 경우에만 QR URL 생성 후 렌더링
const qrUrl = computed(() => {
  if (!user.value?.classCode) return null;
  return `${boardFrontUrl}/student/${user.value.classCode}`;
});
</script>

환경변수, 스토어 데이터 기반으로 URL을 생성해서 전달하는 부모 컴포넌트 예시입니다.