react 使用 svg
小于 1 分钟
react 使用 svg
安装依赖
npm i svg-sprite-loader
配置处理 svg 文件
这里使用的 craco 来进行添加新的配置,关于 craco 的其他点可以看craco。
const path = require("path")
const resolve = (dir) => path.resolve(__dirname, dir)
module.exports = {
webpack: {
// alias: {
// "@": resolve("src")
// },
configure: (webpackConfig, { env, paths }) => {
webpackConfig.module.rules[1].oneOf = [
...[
{
test: /.svg$/,
include: resolve("./src/assets/svgs/svg"), // 存放svg的文件夹
loader: "svg-sprite-loader",
options: {
symbolId: "icon-[name]",
},
},
],
...webpackConfig.module.rules[1].oneOf,
]
return webpackConfig
},
},
}
在存放 svg 的文件夹中添加文件
这里存放 svg 文件的路径如下
├─assets
│ └─svgs
│ │ index.js
│ │
│ └─svg
│ 其他svg文件
编写下 svgs/index.js
// 读取所有的svg文件
const req = require.context("./svg", false, /.svg$/)
const requireAll = (requireContext) => requireContext.keys().map(requireContext)
requireAll(req)
编写 SvgIcon 组件
import React, { memo, useMemo } from "react"
import "../assets/svgs/index.js"
const SvgIcon = memo((props) => {
const { className, svgClick, name } = props
return (
<svg className={className || ""} onClick={svgClick}>
<use xlinkHref={"#icon-" + name}></use>
</svg>
)
})
export default SvgIcon
在其他组件中中使用 SvgIcon
import React from "react"
import SvgIcon from "../components/SvgIcon"
const MainContent = () => {
return (
<div>
{/* 这里传入的 name 要跟 svg 文件名一致 */}
<SvgIcon name="interview" className="w-12 h-12" />
</div>
)
}
export default MainContent