- React-native-vector-icons
https://oblador.github.io/react-native-vector-icons/
👉貌似这个库的功能还挺强的,可以自定义生成图标iconSets:https://www.jianshu.com/p/c900f6a0797f
react-native-vector-icons 使用
- 引入iconfont
看上去挺麻烦的
- svg✔
可以渲染 svg ,也可以渲染图标和图像
👉https://blog.csdn.net/weixin_42341232/article/details/108900967
Svg封装使用
1、安装依赖
react-native-svg 为你在Android和iOS平台上的React Native项目提供SVG支持。
react-native-svg-transformer 使你能够在React Native项目中导入本地SVG文件
yarn add react-native-svg
yarn add react-native-svg-transformer --dev
2、修改metro.config.js
const { getDefaultConfig } = require('metro-config');
module.exports = (async () => {
const {
resolver: { sourceExts, assetExts },
} = await getDefaultConfig();
return {
transformer: {
babelTransformerPath: require.resolve('react-native-svg-transformer'),
},
resolver: {
assetExts: assetExts.filter(ext => ext !== 'svg'),
sourceExts: [...sourceExts, 'svg'],
},
};
})();
3、下载svg图标 iconfont
下载svg文件,存储到项目中 src\assets\svgs
4、封装处理svg源文件的工具函数 getSvg.js
在当前目录执行 node ./getSvg.js 命令
截取svg源文件,最终生成 svgs.js 文件,以key: value 的形式导出,配合下一步封装的Svg公共组件,在页面中就可以直接使用svg名字加载图标了😍
//导入node的文件模块
var fs = require('fs');
var path = require('path');
//定义想要处理的svg文件夹路径
const svgDir = path.resolve(__dirname, './svgs');
console.log('svgDir=', svgDir);
// 读取单个文件
function readfile(filename) {
return new Promise((resolve, reject) => {
fs.readFile(path.join(svgDir, filename), 'utf8', function (err, data) {
console.log(data.replace(/<\?xml.*?\?>|<\!--.*?-->|<!DOCTYPE.*?>/g, ''));
if (err) {
reject(err);
}
resolve({
[filename.slice(0, filename.lastIndexOf('.'))]: data,
});
});
});
}
// 读取SVG文件夹下所有svg
function readSvgs() {
return new Promise((resolve, reject) => {
fs.readdir(svgDir, function (err, files) {
if (err) {
reject(err);
}
Promise.all(files.map(filename => readfile(filename)))
.then(data => resolve(data))
.catch(err => reject(err));
});
});
}
// 在当前的目录下生成svgs.js
readSvgs()
.then(data => {
let svgFile =
'export default ' + JSON.stringify(Object.assign.apply(this, data));
fs.writeFile(path.resolve(__dirname, './svgs.js'), svgFile, function (err) {
if (err) {
throw new Error(err);
}
});
})
.catch(err => {
throw new Error(err);
});
5、封装Svg.js组件
import React, {Component} from 'react';
import {SvgXml} from 'react-native-svg';
import svgs from '../assets/svgs.js';
// const xml = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1655121069194" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4898" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M0 778.112L620.672 485.12 0 192l164.288 293.12z" fill="#1F7BFF" fill-opacity=".1" p-id="4899"></path><path d="M341.312 778.112l620.672-293.056L341.312 192 505.6 485.12z" fill="#1F7BFF" p-id="4900"></path></svg>`;
export default class Svg extends Component {
render() {
const {color, size, style, icon} = this.props;
console.log(color);
const svgXmlData = svgs[icon];
// console.log('svgXmlData=', svgXmlData);
if (!svgXmlData) {
const err_msg = `没有"${icon}"这个svg文件`;
throw new Error(err_msg);
}
return (
<SvgXml
width={size}
height={size}
xml={svgXmlData}
fill={color}
style={style}
/>
);
}
}
6、页面组件中使用
import Svg from '~/components/Svg';
<Svg icon="male" size={px2dp(45)} style={styles.iconHuman} />
<Svg icon="female" size={px2dp(45)} style={styles.iconHuman} />
可能会遇到的问题
如果启动失败,尝试下面的操作
rm -rf node_modules yarn.lock
yarn
react-native start --reset-cache