最近RN项目有生成二维码的需求,百度了一下,一些文章推荐的主要有
react-native-qrcode-svg 和 react-native-qrcode,我们来分析一下。
react-native-qrcode-svg
react-native-qrcode-svg
是基于node-qrcode 和react-native-svg
-
node-qrcode
是纯js实现的生成二维码的库 -
react-native-svg
是有原生依赖的让rn
支持svg
的库
原理:
1、先使用node-qrcode
的create
方法生成如下的对象,
2、将生成的对象的modules.data
生成svg的path
3、将path绘制到react-native-svg
上,并且可以加上logo,就得到了二维码了
react-native-qrcode
react-native-qrcode
是基于 qr.js 和rn自带的WebView
(而目前高版本的RN,自带WebView已经从RN中移除了,需要使用community版本的WebView),原理是利用web
端的canvas
绘制二维码,再用WebView
展示,这里不建议使用这个库
show magic
可以看到前者太重了(依赖react-native-svg
,有原生依赖),后者太老了(包括qr.js
也是很多年没维护),那么有没有更简单的方法实现二维码呢?
其实有一个纯js
的库qrcode-generator 提供了生成base64
二维码图片的功能,然后直接用react native
的Image
组件加载base64
图片就可以了。
示例:
import React, { useState, useEffect } from 'react';
import { Image } from 'react-native';
import QRCode from 'qrcode-generator';
export default ({text, style}) => {
const [base64Img, setBase64Img] = useState(undefined);
useEffect(() => {
const typeNumber = 4;
const errorCorrectionLevel = 'L';
const qr = QRCode(typeNumber, errorCorrectionLevel);
qr.addData(text);
qr.make();
setBase64Img(qr.createDataURL());
}, [text]);
return (
base64Img ?
<Image source={{ uri: base64Img }} style={style} resizeMode="contain"/>
:
null
);
};
使用
<CustomQrCode text='hello world' style={{width: 50, height: 50}} />