iT邦幫忙

2024 iThome 鐵人賽

DAY 27
1
JavaScript

不會 VueUse 而被提分手的我系列 第 27

D-27 useQRCode 解析與動機 - 複雜後面的本質

  • 分享至 

  • xImage
  •  

生活中的許多情境,我們常常只能看見事物的表象,卻忽略了其背後的意義。而掃描的過程,正是在提醒我,只有透過深入的解讀,才能發掘隱藏的價值和真相。
https://ithelp.ithome.com.tw/upload/images/20241010/201621156FNO9ClX5p.jpg

前言

useQRCode 主要的工作流程可以分為以下幾個部分:

  1. QRCode 產生器初始化
  2. 資料處理與渲染
  3. 狀態管理
  4. 異常處理
  5. 動態更新與效能最佳化

接下來,我們逐一詳細解釋這些部分:

1. QRCode 產生器初始化

useQRCode 中,首先需要初始化一個 QRCode 產生器,這裡基於第三方庫,例如 qrcode 或其他類似的 QRCode生成工具。這個初始化過程中需要設定生成 QRCode 的一些基礎參數,例如大小、顏色、容錯率等。

import QRCode from 'qrcode';

const options = {
  width: 200,
  color: {
    dark: "#000000",
    light: "#FFFFFF"
  },
  errorCorrectionLevel: "H"
};

在上面的程式碼中,useQRCode 設定初始化 QRCode 產生器的參數,包含了寬度、顏色、容錯等級。這些參數可以根據不同應用場景的需求做調整。

2. 資料處理與渲染

useQRCode 的核心功能是將某些特定的文字內容轉換成 QR Code 圖片。這可以通過 QRCode 生成庫來進行,通常會使用 toDataURLtoCanvas 方法來生成圖片資料。

QRCode.toDataURL(text, options, (err, url) => {
  if (err) {
    state.error = err;
  } else {
    state.qrCodeUrl = url;
  }
});

上面的程式碼片段通過 toDataURL 方法將指定的文字 (text) 轉換成 QRCode 圖片的 Data URL,並將生成的 URL 存儲在狀態中 (state.qrCodeUrl)。

3. 狀態管理

useQRCode 通常會管理一些關鍵狀態,例如:生成的 QRCode URL 和異常狀態等。這些狀態通過 Vue 的響應式工具(如 refreactive)進行管理,方便外部組件監控 QRCode 的生成過程和結果。

const state = reactive({
  qrCodeUrl: null,
  error: null,
});

  • qrCodeUrl:存儲生成的 QRCode 圖片 URL,方便在頁面上展示。
  • error:存儲可能出現的錯誤資訊,如果在生成過程中遇到異常,這個狀態會反映錯誤的詳細資訊。

4. 異常處理

在生成 QRCode 的過程中,可能因無效參數或設定錯誤而發生異常。useQRCode 透過捕捉這些異常來確保應用的穩定性,並將錯誤狀態提供給外部元件使用。

if (err) {
  state.error = err;
}

這段程式碼確保在生成 QR Code 時發生錯誤,錯誤訊息會立即被捕捉並更新至 state.error。外部元件可根據 error 狀態向使用者顯示錯誤提示。

5. 動態更新與效能最佳化

QRCode 可能需要根據變化的文字內容動態更新。例如,當用戶輸入新的網址或資訊時,QRCode 需要即時重新生成。為此,useQRCode 通常提供一個重新生成 QRCode 的方法,並利用 watchEffectwatch 監控輸入內容的變化,以觸發更新。

watch(
  () => inputText.value,
  (newText) => {
    generateQRCode(newText);
  }
);

  • watch:監聽輸入文字的變化。
  • generateQRCode:根據新的文字重新生成 QRCode。

這樣的監聽和動態更新機制可以確保 QRCode 與用戶輸入保持同步,並且能避免不必要的重複生成,從而提高效能。

工作流程

  1. 初始化 QRCode 產生器:設定 QRCode 的生成選項(如寬度、顏色、容錯率等)。
  2. 生成 QRCode:使用 toDataURLtoCanvas 方法將文字內容轉換為 QRCode 圖片,並儲存生成的 URL。
  3. 狀態管理:透過響應式狀態管理 QRCode URL 和異常資訊,方便外部元件使用。
  4. 異常處理:捕捉生成 QRCode 過程中的錯誤,並更新錯誤狀態。
  5. 動態更新:監控輸入內容的變化,當文字內容發生改變時,即時重新生成 QRCode。

原始碼部分解釋

1. 型別定義

export interface UseQRCodeOptions {
  width?: number;
  color?: {
    dark?: string;
    light?: string;
  };
  errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';
}

這裡定義了 QRCode 生成選項的介面:

  • width:QRCode 的寬度。
  • color:QR Code 的顏色設定(包括深色和淺色)。
  • errorCorrectionLevel:容錯率等級,有四個級別可選。

2. useQRCode 函式

export function useQRCode(text: Ref<string>, options: UseQRCodeOptions = {}) {
  const state = reactive({
    qrCodeUrl: null,
    error: null,
  });

  const generateQRCode = (inputText: string) => {
    // 使用 QRCode 庫生成 QRCode 圖片
  };

  watch(
    () => text.value,
    (newText) => {
      generateQRCode(newText);
    },
    { immediate: true }
  );

  return {
    ...toRefs(state),
    generateQRCode,
  };
}

  • text:需要生成 QRCode 的文字。
  • options:生成 QRCode 的設定選項。
  • generateQRCode:生成 QRCode 的核心函數,使用傳入的文字和選項進行生成。
  • watch:監聽文字內容的變化,並及時調用 generateQRCode 進行更新。

總結

useQRCode 是一個簡單而實用的工具函式,用於生成 QRCode 圖片。它封裝了 QRCode 的生成過程,並通過 Vue 的響應式系統來管理狀態和處理異常,使得開發者能夠輕鬆實現文字到 QRCode 的轉換,適合用於分享連結、資料卡片等場景。

如果有任何問題或者需要補充的部分,請隨時告訴我!


上一篇
D-26 useQRCode 文件說明與範例 - 會員或載具嗎?
下一篇
D-28 模仿 vueuse 來做一個自己的 useBarCode 吧 1 確認需求
系列文
不會 VueUse 而被提分手的我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言