跳到正文
SvgJsx
语言: 中文

把 SVG 转换为 React 组件

把任意 SVG 图标或插画转换成函数式 React 组件:属性符合 JSX 规范,支持 props 展开,还可选 size 和颜色属性。

快速预设:
将 .svg 文件拖放到这里,或文件通过 FileReader 在本地读取,绝不会上传。
选项
导出方式:
const HeartIcon = (props) => (
  <svg width="24" height="24" viewBox="0 0 24 24" className="icon icon-heart" {...props}>
    <g id="Layer_1" fill="none" stroke="#e11d48" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
      <path d="M19.0001 14.0002c1.4900-1.4600 3.0000-3.2100 3.0000-5.5000A5.5000 5.5000 0 0 0 16.5000 3c-1.7600 0-3.0000.5000-4.5000 2-1.5000-1.5000-2.7400-2-4.5000-2A5.5000 5.5000 0 0 0 2 8.5000c0 2.3000 1.5000 4.0500 3 5.5000l7 7Z" style={{ fillOpacity: "0.15", fill: "#e11d48" }} />
    </g>
  </svg>
);

export default HeartIcon;

预览

转换后 SVG 的预览
原始 SVG
706 B
优化后 SVG
538 B(-24%)
组件
566 B

为什么不能直接把 SVG 粘贴进 React?

把原始 SVG 粘贴进 .jsx 文件,通常会得到一大堆警告,比如 “Invalid DOM property stroke-width”、“Invalid DOM property class”;如果文件里有 style 属性或 XML 声明,甚至会直接编译失败。逐个手动改属性名既慢又容易出错,图标一多更是如此。

这个转换器会自动完成重命名,并把标记包装成可以接收 props 的组件。由于 {...props} 会展开到根 <svg> 上,父组件可以直接传入 className、aria-label、onClick 或自定义 width,而无需再修改图标本身。

React 图标的推荐设置

如果要做可复用的图标组件,我们建议:

  • 开启 currentColor,让图标继承父元素的文字颜色,并自动适配深色模式。
  • 开启 size 属性,用一个值(例如 size={20})同时控制宽和高。
  • 保留 viewBox,移除固定的 width 和 height,让图标可以随 CSS 缩放。
  • 只有当父组件需要访问底层 <svg> 元素(例如用于提示框或动画)时,才使用 forwardRef。

内联组件还是图片文件?

内联 SVG 组件可以用 CSS 设置样式、做动画、在悬停时变色,而且不会产生额外的网络请求。对于体积大、内容固定的插画,普通的 <img src="/file.svg"> 可能更划算,因为浏览器可以单独缓存它。图标和界面图形适合做成组件,大型插画更适合用 img 标签。

常见问题

支持哪些 React 版本?

输出的是普通函数组件,适用于 React 16.8 及更高版本,包括 React 18 和 19。forwardRef 和 memo 是可选项,只有开启时才会被导入。

生成的文件里需要 import React 吗?

不需要。Next.js、Vite 和 Create React App 4+ 使用新的 JSX 转换,不再要求 React 在作用域中。转换器只会导入组件实际用到的内容。

如何从父组件修改图标颜色?

开启 currentColor 选项。fill 和 stroke 会被替换为 currentColor,图标就会使用父元素的 CSS 颜色,例如 Tailwind 的 text-red-600 类。

可以给图标传 onClick 或 aria-label 吗?

可以。组件会把 {...props} 展开到根 <svg> 上,你传入的任何 SVG 属性或事件处理器都会被转发,并覆盖默认值。