- 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-svgyarn 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文件夹下所有svgfunction 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.jsreadSvgs().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 (<SvgXmlwidth={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.lockyarnreact-native start --reset-cache
