前言:相信很多同窗在實際工做中作項目的時候會遇到點擊造成二維碼,跳轉新的頁面展現二維碼的項目需求。解決問題的思路實際有不少種,今天筆者介紹一個簡單實現的思路,供你們參考,實際實現這個小功能實際上是特別簡單的。前端
一 demo效果
二 思考如何讓實現
如何實現這個需求呢node
首先咱們須要生成二維碼,並且要打開一個新的頁面展現,那麼咱們須要img
標籤來展現圖片的載體,那麼生成圖片src
必不可少的。不管咱們的項目是spa
,仍是多頁面應用,咱們這裏都要用base64
儲存圖片的信息。因此須要把生成的二維碼轉化成base64
。接下來讓咱們整理一下思路。api
梳理具體思路瀏覽器
第一步:咱們須要將目標二維碼連接生成二維碼。緩存
第二步:將上一步生成的二維碼轉化成base64
格式url
,並保存url
。微信
第三步:打開新頁面,獲取保存的url
,展現生成的二維碼。app
1 引入arale-qrcode
庫
首先咱們須要將鏈接繪製成二維碼,那麼我在這裏給你們推薦一個造成二維碼的庫arale-qrcode
。它能夠根據傳入的二維碼連接生成svg
或table形式的
dom
節點。dom
import AraleQRCode from 'arale-qrcode'
const result = new AraleQRCode({
render: "svg", /* 生成的類型 'svg' or 'table dom元素類型 */
text:'https://juejin.im/post/6895011670301605896', /* 二維碼的連接*/
size: 100 /* 二維碼的大小 */
})
console.log(result)
咱們看看AraleQRCode
把二維碼連接變成了什麼東西。svg
沒錯,AraleQRCode
把咱們的二維碼變成了,真是的dom
的節點,若是是在當前頁面展現,如今已經知足需求了,然而這不是咱們想要的,由於咱們的要在新的頁面中展現生成的二維碼。接下來咱們想的是怎麼把當前的node節點轉化成
base64
post
2 XMLSerializer
序列化xml
接下來咱們可能用到一個不怎麼經常使用的api XMLSerializer
,它的做用是什麼? XMLSerializer
對象使你可以把一個XML
文檔或Node
對象轉化或「序列化」爲未解析的 XML
標記的一個字符串。具體使用咱們不須要帶參數去實例化它,而後調用serializeToString
方法 node
對象變成一個字符串。
例子:
const div = document.createElement('div')
div.innerText = 'hello,world'
const result = new XMLSerializer().serializeToString(div)
console.log(result)
咱們看看XMLSerializer
到底作了什麼。
沒錯,這樣就將一個真實dom
變成了字符串。回到正題上來,咱們須要上一步生成的svg xml
文檔轉換成字符串。
import AraleQRCode from 'arale-qrcode'
const result = new AraleQRCode({
render: "svg", /* 生成的類型 'svg' or 'table dom元素類型 */
text:'https://juejin.im/post/6895011670301605896', /* 二維碼的連接*/
size: 100 /* 二維碼的大小 */
})
const svgXml = new XMLSerializer().serializeToString(result)
console.log(svgXml)
打印結果以下:
注意:XMLSerializer
對於ie
瀏覽器存在着兼容性,因此咱們要作額外的兼容處理。
3 window.btoa
轉化成url
,跨頁面傳遞url
接下來咱們須要把新出爐的svg
字符竄轉成base64
格式。咱們能夠經過 window.btoa
方法。建立一個base-64
編碼的字符串。除了用到window.btoa
外,咱們還須要二次轉碼 encodeURIComponent
字符串做爲 URI
組件進行編碼和解碼。 unescape
可對編碼的字符串進行解碼。
const src = 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(svgXml)))
終於生成了咱們想要的base64
格式的圖片url
,接下來咱們作的是跨頁面傳遞url。
這裏有一個小技巧,因爲咱們用的是打開一個新窗口,並且生成的base64
文件不會很大,因此咱們這裏用本地存儲localStorage
再好不過。
localStorage.setItem('image',src)
window.open('http://localhost:8888/image')
將上一步的src
保存起來。這樣就完成了url
的生成到保存。
完整的代碼以下
生成二維碼頁面
const index = () => {
const text = ()=>{
const result = new AraleQRCode({
render: "svg", /* 生成的類型 'svg' or 'table dom元素類型 */
text:'https://juejin.im/post/6895011670301605896', /* 二維碼的連接*/
size: 100 /* 二維碼的大小 */
})
const svgXml = new XMLSerializer().serializeToString(result)
const src = 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(svgXml)))
localStorage.setItem('image',src)
window.open('http://localhost:8888/image')
}
return <div className="page" >
<p className="cur" > 當前url: <span> https://juejin.im/post/6895011670301605896 </span> </p>
<div className="btns" >
<button onClick={text } >點擊生成二維碼</button>
</div>
</div>
}
接受二維碼頁面
function index(){
const img:any = localStorage.getItem('image')
localStorage.removeItem('image')
return <div className="mast" >
<div className="img_content" > <img src={img} /></div>
</div>
}
注意:當咱們接受到url的時候,別忘了清除本地緩存。
三 寫在後面
上面總結了一個生成+跨頁面展示二維碼的具體實現方案,並且已經應用在真正的項目中了,在實際工做中,同窗們若是遇到相似問題,但願這篇文章能給你們帶來解決此類問題的思路。
最後謝謝你們閱讀,你們若是以爲還不錯的話,就 點贊 + 關注 一波,持續分享技術文章。
本文分享自微信公衆號 - 前端公蝦米(gh_0b53c67e23b7)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。