在網(wǎng)站上獲取代碼(網(wǎng)站上的代碼可以復(fù)制下來嗎)
譯者 | 趙青窕
審校 | 孫淑娟
創(chuàng)建二維碼生成器(Quick Response Code Generator)就是將圖像格式轉(zhuǎn)換為文本格式進(jìn)行轉(zhuǎn)換。二維碼(QR code)是利用圖像數(shù)據(jù)來代表文本信息,它有很多應(yīng)用場景,如餐廳菜單,音樂會門票,在線日歷邀請、支付等場景。
在本教程中,你將學(xué)習(xí)如何使用Java庫React創(chuàng)建二維碼。React為開發(fā)人員提供了重用組件的方式,使得構(gòu)建前端應(yīng)用程序變得輕而易舉。
前提條件
要充分理解本文,你需要具備以下知識和環(huán)境:
了解React.js基本內(nèi)容
你的環(huán)境需要滿足Node = 14.0.0,npm = 5.6
了解React.js基本內(nèi)容
你的環(huán)境需要滿足Node = 14.0.0,npm = 5.6
準(zhǔn)備工作
首先,打開終端并運行以下命令:
npx create-react-app qrcode-generator
上面的命令附帶了必要的文件,并安裝了創(chuàng)建React應(yīng)用程序所需的軟件包。
接下來,使用下面的命令切換到自己構(gòu)建的項目目錄下,并運行開發(fā)服務(wù)器(Development Server),從而可以訪問http://localhost:3000,以瀏覽器的形式預(yù)覽應(yīng)用。
展開全文
cdqrcode-generator
npm start
最后,讓我們使用下面的命令安裝創(chuàng)建二維碼生成器所需的依賴庫:
npm install qrcode.react
qrcode.react:一個React組件,用于生成二維碼,并將其呈現(xiàn)給DOM。
創(chuàng)建二維碼生成器
二維碼生成器的創(chuàng)建將從創(chuàng)建包含二維碼結(jié)構(gòu)的文件和組件開始。在src目錄中,創(chuàng)建一個名為components的文件夾,并在文件夾中創(chuàng)建一個名為QrCode.js的文件。下面是對應(yīng)的代碼實現(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 onSubmit={downloadQRCode}
labelEnter URL/label
input
type= "text"
value={url}
onChange={qrCodeEncoder}
placeholder= "https://hackernoon.com"
/
button type= "submit"disabled={!url}
Download QR code
/button
/form
/div
/div
);
};
exportdefault QrCode;
左右滑動查看完整代碼
上面的代碼片段做了如下操作:
Import useState用于聲明變量的初始狀態(tài),url設(shè)置為空字符串, setState函數(shù)和setUrl用于更新狀態(tài);
庫qrcode.react用于呈現(xiàn)生成的二維碼;
接下來,使用from element中,附加到onSubmit方法中的downloadQRCode函數(shù),該過程由submit事件觸發(fā);
在input元素中,帶有函數(shù)' qrCodeEncoder '的onChange事件處理程序用來接收用戶的輸入,并根據(jù)獲取的輸入值更改二維碼;
創(chuàng)建一個變量qrcode。它接受QRCodeCanvas組件,并傳遞一些可用的自定義屬性,使二維碼可以在瀏覽器上顯示出來。
最后,button元素將被禁用,直到接收到用戶輸入數(shù)據(jù)。
Import useState用于聲明變量的初始狀態(tài),url設(shè)置為空字符串, setState函數(shù)和setUrl用于更新狀態(tài);
庫qrcode.react用于呈現(xiàn)生成的二維碼;
接下來,使用from element中,附加到onSubmit方法中的downloadQRCode函數(shù),該過程由submit事件觸發(fā);
在input元素中,帶有函數(shù)' qrCodeEncoder '的onChange事件處理程序用來接收用戶的輸入,并根據(jù)獲取的輸入值更改二維碼;
創(chuàng)建一個變量qrcode。它接受QRCodeCanvas組件,并傳遞一些可用的自定義屬性,使二維碼可以在瀏覽器上顯示出來。
最后,button元素將被禁用,直到接收到用戶輸入數(shù)據(jù)。
設(shè)計二維碼應(yīng)用程序
在src文件夾中,創(chuàng)建樣式表(stylessheet)styles.css,該部分負(fù)責(zé)應(yīng)用程序的顯示效果, 下面是對應(yīng)的代碼實現(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;
}
}
左右滑動查看完整代碼
接下來,在app的入口app .js中導(dǎo)入QrCode.js文件和樣式表:
// src/App.js
import QrCode from "./components/QrCode";
import "./styles.css";
exportdefault functionApp{
return(
div className= "section container"
QrCode /
/div
);
}
左右滑動查看完整代碼
完成上面步驟后,app顯示如下圖所示:
用戶可以選擇下載生成的二維碼,使得它可以應(yīng)用在各種各樣的用例中。從打二維碼的打印到將其嵌入網(wǎng)站,這樣的例子不勝枚舉。
回到components/QrCode.js文件,讓我們更新代碼庫,以使用refs來訪問文檔對象模型節(jié)點(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
);
};
exportdefault QrCode;
左右滑動查看完整代碼
現(xiàn)在,讓我們更新QrCode.js文件中的downloadQRCode函數(shù),以便能夠單擊下載二維碼按鈕并將下載后的文件保存為圖像文件。
// src/components/QrCode.js
// imports
const QrCode = = {
// state
// useRef
const downloadQRCode = (e) = {
e.preventDefault;
letcanvas = qrRef.current.querySelector( "canvas");
letimage = canvas.toDataURL( "image/png");
letanchor = document.( "a");
anchor.href = image;
anchor.download = `qr-code.png`;
document.body.(anchor);
anchor.click;
document.body.removeChild(anchor);
setUrl( "");
};
...
return(
div className= "qrcode__container"
div ref={qrRef}{qrcode}/div
{/* form input container */}
/div
);
};
exportdefault QrCode;
左右滑動查看完整代碼
在downloadQRCode函數(shù)中,主要完成了以下任務(wù):
它使用ref對象的.current屬性來獲取當(dāng)前值,以便知道節(jié)點何時發(fā)生變化;
利用qrcode.react組件在DOM中生成canvas元素,可以動態(tài)創(chuàng)建內(nèi)容;
canvas被追加到toDataURL方法中,且指定器類型為文件格式image/png;
接下來,創(chuàng)建錨元素(Anchor Element),并將href設(shè)置為單擊按鈕時下載二維碼的圖像;
anchor被附加到文檔主體,一旦二維碼下載后,它就會被刪除;
最后,使用setUrl變量更新狀態(tài)url,該操作在執(zhí)行submit后會清除二維碼對應(yīng)的輸入。
它使用ref對象的.current屬性來獲取當(dāng)前值,以便知道節(jié)點何時發(fā)生變化;
利用qrcode.react組件在DOM中生成canvas元素,可以動態(tài)創(chuàng)建內(nèi)容;
canvas被追加到toDataURL方法中,且指定器類型為文件格式image/png;
接下來,創(chuàng)建錨元素(Anchor Element),并將href設(shè)置為單擊按鈕時下載二維碼的圖像;
anchor被附加到文檔主體,一旦二維碼下載后,它就會被刪除;
最后,使用setUrl變量更新狀態(tài)url,該操作在執(zhí)行submit后會清除二維碼對應(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;
letcanvas = qrRef.current.querySelector( "canvas");
letimage = canvas.toDataURL( "image/png");
letanchor = document.( "a");
anchor.href = image;
anchor.download = `qr-code.png`;
document.body.(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 onSubmit={downloadQRCode}
labelEnter URL/label
input
type= "text"
value={url}
onChange={qrCodeEncoder}
placeholder= "https://hackernoon.com"
/
button type= "submit"disabled={!url}
Download QR code
/button
/form
/div
/div
);
};
exportdefault QrCode;
上述代碼對應(yīng)的應(yīng)用程序如下圖所示:
本教程描述了創(chuàng)建二維碼生成器的過程,以及如何下載以供后續(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
二維碼簡介:
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ū)動開發(fā)。
三連給小編加雞腿!
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。