自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用React創(chuàng)建QR code生成器

譯文 精選
開(kāi)發(fā) 前端
在本教程中,你將學(xué)習(xí)如何使用JavaScript庫(kù)React創(chuàng)建二維碼。React為開(kāi)發(fā)人員提供了重用組件的方式,使得構(gòu)建前端應(yīng)用程序變得輕而易舉。

?譯者 | 趙青窕

審校 | 孫淑娟

創(chuàng)建二維碼生成器(Quick Response Code Generator)就是將圖像格式轉(zhuǎn)換為文本格式進(jìn)行轉(zhuǎn)換。二維碼(QR code)是利用圖像數(shù)據(jù)來(lái)代表文本信息,它有很多應(yīng)用場(chǎng)景,如餐廳菜單,音樂(lè)會(huì)門(mén)票,在線(xiàn)日歷邀請(qǐng)、支付等場(chǎng)景。

在本教程中,你將學(xué)習(xí)如何使用JavaScript庫(kù)React創(chuàng)建二維碼。React為開(kāi)發(fā)人員提供了重用組件的方式,使得構(gòu)建前端應(yīng)用程序變得輕而易舉。

1、前提條件

要充分理解本文,你需要具備以下知識(shí)和環(huán)境:

  • 了解React.js基本內(nèi)容
  • 你的環(huán)境需要滿(mǎn)足Node >= 14.0.0,npm >= 5.6

2、準(zhǔn)備工作

首先,打開(kāi)終端并運(yùn)行以下命令:

npx create-react-app qrcode-generator

上面的命令附帶了必要的文件,并安裝了創(chuàng)建React應(yīng)用程序所需的軟件包。

接下來(lái),使用下面的命令切換到自己構(gòu)建的項(xiàng)目目錄下,并運(yùn)行開(kāi)發(fā)服務(wù)器(Development Server),從而可以訪(fǎng)問(wèn)http://localhost:3000,以瀏覽器的形式預(yù)覽應(yīng)用。

cd qrcode-generator

npm start

最后,讓我們使用下面的命令安裝創(chuàng)建二維碼生成器所需的依賴(lài)庫(kù):

npm install qrcode.react

qrcode.react:一個(gè)React組件,用于生成二維碼,并將其呈現(xiàn)給DOM。

3、創(chuàng)建二維碼生成器

二維碼生成器的創(chuàng)建將從創(chuàng)建包含二維碼結(jié)構(gòu)的文件和組件開(kāi)始。在src目錄中,創(chuàng)建一個(gè)名為components的文件夾,并在文件夾中創(chuàng)建一個(gè)名為QrCode.js的文件。下面是對(duì)應(yīng)的代碼實(shí)現(xiàn)方式:

// src/components/QrCode.js

import { useState } from "react";
import { QRCodeCanvas } from "qrcode.react";

const QrCode = () => {
const [url, setUrl] = useState("");

const downloadQRCode = (e) => {
e.preventDefault();
setUrl("");
};

const qrCodeEncoder = (e) => {
setUrl(e.target.value);
};

const qrcode = (
<QRCodeCanvas
id="qrCode"
value={url}
size={300}
bgColor={"#00ff00"}
level={"H"}
/>
);
return (
<div className="qrcode__container">
<div>{qrcode}</div>
<div className="input__group">
<form notallow={downloadQRCode}>
<label>Enter URL</label>
<input
type="text"
value={url}
notallow={qrCodeEncoder}
placeholder="https://hackernoon.com"
/>
<button type="submit" disabled={!url}>
Download QR code
</button>
</form>
</div>
</div>
);
};

export default QrCode;

上面的代碼片段做了如下操作:

  • Import useState用于聲明變量的初始狀態(tài),url設(shè)置為空字符串, setState函數(shù)和setUrl用于更新?tīng)顟B(tài);
  • 庫(kù)qrcode.react用于呈現(xiàn)生成的二維碼;
  • 接下來(lái),使用from element中,附加到onSubmit方法中的downloadQRCode函數(shù),該過(guò)程由submit事件觸發(fā);
  • 在input元素中,帶有函數(shù)' qrCodeEncoder '的onChange事件處理程序用來(lái)接收用戶(hù)的輸入,并根據(jù)獲取的輸入值更改二維碼;
  • 創(chuàng)建一個(gè)變量qrcode。它接受QRCodeCanvas組件,并傳遞一些可用的自定義屬性,使二維碼可以在瀏覽器上顯示出來(lái)。
  • 最后,button元素將被禁用,直到接收到用戶(hù)輸入數(shù)據(jù)。

4、設(shè)計(jì)二維碼應(yīng)用程序

在src文件夾中,創(chuàng)建樣式表(stylessheet)styles.css,該部分負(fù)責(zé)應(yīng)用程序的顯示效果, 下面是對(duì)應(yīng)的代碼實(shí)現(xiàn)方式:

/* src/styles.css */
*,
*:before,
*:after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--font-color: 230 35% 7%;
}
body {
color: hsl(var(--font-color));
}
img {
max-width: 100%;
display: block;
}
.section {
padding: 2em 0;
display: flex;
min-height: 100vh;
align-items: center;
}
.container {
margin-inline: auto;
max-width: 75rem;
width: 85%;
}
.input__group {
display: flex;
margin-top: 2em;
}
input {
width: 100%;
padding: 1em 0.75em;
border: 1px solid #444343;
border-radius: 3px;
margin-bottom: 2em;
margin-top: 0.75em;
}
button {
border: unset;
background: hsl(231, 77%, 90%);
padding: 1em 0.75em;
color: hsl(var(--font-color));
cursor: pointer;
text-transform: uppercase;
font-weight: bold;
}
@media screen and (min-width: 768px) {
.section {
padding: 0;
}
input {
margin: 0;
}
.qrcode__container {
display: flex;
align-items: center;
}
.input__group {
margin-left: 3em;
}
input {
margin-bottom: 2em;
margin-top: 0.75em;
font-size: 1rem;
}
}

接下來(lái),在app的入口app .js中導(dǎo)入QrCode.js文件和樣式表:

// src/App.js

import QrCode from "./components/QrCode";
import "./styles.css";

export default function App() {
return (
<div className="section container">
<QrCode />
</div>
);
}

完成上面步驟后,app顯示如下圖所示:

圖片

5、下載生成的二維碼

用戶(hù)可以選擇下載生成的二維碼,使得它可以應(yīng)用在各種各樣的用例中。從打二維碼的打印到將其嵌入網(wǎng)站,這樣的例子不勝枚舉。

回到components/QrCode.js文件,讓我們更新代碼庫(kù),以使用refs來(lái)訪(fǎng)問(wèn)文檔對(duì)象模型節(jié)點(diǎn)(DOM Node)。

// src/components/QrCode.js

import { useState, useRef } from "react";
// other import

const QrCode = () => {
const [url, setUrl] = useState("");
const qrRef = useRef(); // include this: call the useRef function
...
const qrcode = (
<QRCodeCanvas
id="qrCode"
value={url}
size={300}
bgColor={"#00ff00"}
level={"H"}
/>
);
return (
<div className="qrcode__container">
<div ref={qrRef}>{qrcode}</div> {/* include this */}
{/* form input container */}
</div>
);
};

export default QrCode;

現(xiàn)在,讓我們更新QrCode.js文件中的downloadQRCode函數(shù),以便能夠單擊下載二維碼按鈕并將下載后的文件保存為圖像文件。

// src/components/QrCode.js

// imports

const QrCode = () => {
// state
// useRef
const downloadQRCode = (e) => {
e.preventDefault();
let canvas = qrRef.current.querySelector("canvas");
let image = canvas.toDataURL("image/png");
let anchor = document.createElement("a");
anchor.href = image;
anchor.download = `qr-code.png`;
document.body.appendChild(anchor);
anchor.click();
document.body.removeChild(anchor);
setUrl("");
};
...
return (
<div className="qrcode__container">
<div ref={qrRef}>{qrcode}</div>
{/* form input container */}
</div>
);
};

export default QrCode;

在downloadQRCode函數(shù)中,主要完成了以下任務(wù):

  • 它使用ref對(duì)象的.current屬性來(lái)獲取當(dāng)前值,以便知道節(jié)點(diǎn)何時(shí)發(fā)生變化;
  • 利用qrcode.react組件在DOM中生成canvas元素,可以動(dòng)態(tài)創(chuàng)建內(nèi)容;
  • canvas被追加到toDataURL方法中,且指定器類(lèi)型為文件格式image/png;
  • 接下來(lái),創(chuàng)建錨元素(Anchor Element),并將href設(shè)置為單擊按鈕時(shí)下載二維碼的圖像;
  • anchor被附加到文檔主體,一旦二維碼下載后,它就會(huì)被刪除;
  • 最后,使用setUrl變量更新?tīng)顟B(tài)url,該操作在執(zhí)行submit后會(huì)清除二維碼對(duì)應(yīng)的輸入。

最后的完整代碼如下:

import { useState, useRef } from "react";
import { QRCodeCanvas } from "qrcode.react";

const QrCode = () => {
const [url, setUrl] = useState("");
const qrRef = useRef();
const downloadQRCode = (e) => {
e.preventDefault();
let canvas = qrRef.current.querySelector("canvas");
let image = canvas.toDataURL("image/png");
let anchor = document.createElement("a");
anchor.href = image;
anchor.download = `qr-code.png`;
document.body.appendChild(anchor);
anchor.click();
document.body.removeChild(anchor);
setUrl("");
};
const qrCodeEncoder = (e) => {
setUrl(e.target.value);
};

const qrcode = (
<QRCodeCanvas
id="qrCode"
value={url}
size={300}
bgColor={"#00ff00"}
level={"H"}
/>
);
return (
<div className="qrcode__container">
<div ref={qrRef}>{qrcode}</div>
<div className="input__group">
<form notallow={downloadQRCode}>
<label>Enter URL</label>
<input
type="text"
value={url}
notallow={qrCodeEncoder}
placeholder="https://hackernoon.com"
/>
<button type="submit" disabled={!url}>
Download QR code
</button>
</form>
</div>
</div>
);
};

export default QrCode;

上述代碼對(duì)應(yīng)的應(yīng)用程序如下圖所示:

圖片

本教程描述了創(chuàng)建二維碼生成器的過(guò)程,以及如何下載以供后續(xù)使用。

參考資料:

二維碼:

https://github.com/zpao/qrcode.react?ref=hackernoon.com

錨元素(The anchor element):

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a?ref=hackernoon.com

二維碼簡(jiǎn)介:

https://en.wikipedia.org/wiki/QR_code?ref=hackernoon.com

https://hackernoon.com/how-to-build-a-qr-code-generator-in-react

譯者介紹

趙青窕,51CTO社區(qū)編輯,從事多年驅(qū)動(dòng)開(kāi)發(fā)。?

責(zé)任編輯:武曉燕 來(lái)源: 51CTO技術(shù)棧
相關(guān)推薦

2022-02-22 08:20:04

React工具PDF 文件

2021-11-04 09:00:00

JavaSpring BootURL

2024-12-23 08:00:00

2022-10-17 18:29:55

2021-12-10 09:45:19

生成器配置代碼

2015-08-25 11:07:58

2017-07-01 16:02:39

分布式ID生成器

2025-01-23 08:36:27

CSS開(kāi)發(fā)工具

2010-09-07 16:31:17

SQL語(yǔ)句insert

2021-04-22 21:15:38

Generator函數(shù)生成器

2011-12-23 13:42:05

JavaScript

2024-11-01 15:51:06

2023-09-24 22:34:41

SpringBootRust

2023-07-02 14:14:37

ChatGPTMidjourney

2017-09-06 09:26:03

Python生成器協(xié)程

2021-12-04 22:07:44

Python

2015-08-25 15:54:17

程序員代碼生成器

2021-07-23 11:24:54

Create Inc開(kāi)源G代碼生成器

2024-08-19 00:00:00

表單生成器開(kāi)發(fā)開(kāi)源

2023-05-17 16:02:00

CSS工具代碼生成器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)