react批量引入svg图标

PS:也不只在react中用,其他框架也可,生态圈不一样配置会不同,但是能提供整体的思路,可以参考。

在批量引入之前,我们需要安装一个包并配置到typescript.json文件中。

复制代码
1. 安装:
	yarn add -D @type/webpack-env
2. 配置typescript.json
	"compilerOptions": {
		"types": ["@types/webpack-env"]
	}

批量引入处理并导出封装组件

在src文件下新建一个icon文件,然后新建一个.tsx文件

注:这块代码可直接copy走

复制代码
import Icon from '@ant-design/icons';


// 批量引入
const importAll = (requireContext: __WebpackModuleApi.RequireContext) => {
  const requireAll = requireContext.keys().map(key => {
    const name = key.replace(/\.\/(.*)\.\w+$/, '$1');
    console.log(name, requireContext(key))
    return { name, value: requireContext(key) };
  })
  return requireAll
}

let routeList: {name: string, value: string}[] = []
try {
  routeList = importAll(require.context('../assets/icons', true, /\.svg$/))
} catch (error) {
  console.log(error);
  routeList = []
}
/**
 * 
 * 导出图标
 * 
 */
const IconFont = (props: {name: string, width?: string | number, className?: string}) => {
  const ListItem = routeList.find(item => item.name === props.name)
  return (
    <Icon
      component={() => (
        <img
          src={ListItem?.value}
          alt=""
          width={props.width || 16}
        />
      )}
      {...props}
    />
  );
};

export {
  IconFont
}

使用方式:

复制代码
// 引入图标
import { IconFont } from '@/icons/sider_left_icon'
<IconFont
    name='library'
    width="23"
    className={styles.library_button_icon}
  />

注:我之所以能直接使用@去默认引入src下的所有文件,是因为我在typescript中配置path

复制代码
"compilerOptions": {
    "paths": {
      "@/*": ["./src/*"]
    },
    "types": ["@types/webpack-env"]
  },

详细了解@types/webpack-env,可点击链接查看

PS:这样的好处:就是我们不需要一遍遍的引入和导出,手动一遍遍编写不同图标多组件,只需要引入一次icon 组件然后给不同的name就可以显示不通的图标,可维护性强。随着项目迭代过多,大量的需要图标时,不用再在需要引入图标的组件中占用较多的位置,也不用再后期图标更改时,全局搜索图标组件进行更改。

相关推荐
工业甲酰苯胺3 小时前
TypeScript枚举类型应用:前后端状态码映射的最简方案
javascript·typescript·状态模式
谢尔登7 小时前
【React Native】ScrollView 和 FlatList 组件
javascript·react native·react.js
然我7 小时前
面试官:如何判断元素是否出现过?我:三种哈希方法任你选
前端·javascript·算法
kk_stoper8 小时前
如何通过API查询实时能源期货价格
java·开发语言·javascript·数据结构·python·能源
晨枫阳8 小时前
前端VUE项目-day1
前端·javascript·vue.js
颜酱8 小时前
抽离ant-design后台的公共查询设置
前端·javascript·ant design
绅士玖8 小时前
JavaScript 设计模式之单例模式🚀
前端·javascript·设计模式
Dream耀8 小时前
useReducer:React界的"灭霸手套",一个dispatch搞定所有状态乱局
前端·javascript·react.js
余大侠在劈柴8 小时前
pdf.js 开发指南:在 Web 项目中集成 PDF 预览功能
前端·javascript·学习·pdf
拾光拾趣录9 小时前
JavaScript屏幕切换检测方案
前端·javascript