安装依赖

首先需要安装核心 SVG 库和 React 组件包。免费版用户安装 free-solid-svg-icons 即可获得全部免费图标。FontAwesome 的 React 组件基于 SVG Core 引擎,将每个图标渲染为内联 SVG 元素,可以精确控制图标样式、尺寸和动画效果。

npm
npm install @fortawesome/react-fontawesome @fortawesome/free-solid-svg-icons @fortawesome/fontawesome-svg-core
yarn
yarn add @fortawesome/react-fontawesome @fortawesome/free-solid-svg-icons @fortawesome/fontawesome-svg-core
额外样式包(按需选择)
# Regular 风格(空心图标) npm install @fortawesome/free-regular-svg-icons # 品牌图标 npm install @fortawesome/free-brands-svg-icons

提示:如果使用 Pro 版图标,请将 free- 替换为 pro- 并配置 Pro 认证 Token。

基本用法

安装完成后,使用 FontAwesomeIcon 组件渲染图标。该组件会将导入的图标定义转换为内联 SVG 元素,而非传统的字体图标方式,从而获得更好的性能和可访问性。与传统的 CSS 类名方式相比,SVG 方式可以精确控制每个图标的颜色、尺寸和动画,并且不会因为字体加载延迟导致图标显示为乱码。FontAwesomeIcon 组件自动处理了 <svg> 元素的创建、属性设置和无障碍标注,开发者只需关注图标的业务含义即可。

import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faStar, faHome, faUser, faGear } from '@fortawesome/free-solid-svg-icons' function MyComponent() { return ( <div> <FontAwesomeIcon icon={faStar} /> <FontAwesomeIcon icon={faHome} size="2x" /> <FontAwesomeIcon icon={faUser} spin /> <FontAwesomeIcon icon={faGear} className="custom-icon" /> </div> ) }

icon 属性接收一个导入的图标定义对象;size 支持 xssmlg2x10xspinpulse 是布尔属性,无需赋值即可启用动画。

按需导入

直接导入单个图标对象支持 tree-shaking 优化,避免打包所有图标导致体积过大。建议在项目中始终使用显式导入而非字符串引用。tree-shaking 是现代构建工具(Webpack、Vite、Rollup)的静态分析功能,可以识别并移除未被使用的导出。通过从独立路径导入每个图标,构建工具可以精确地只打包实际使用到的图标,大幅减小最终产物的体积——如果项目中只使用了 20 个图标,打包就只包含这 20 个,而非整个图标库的数万个图标。

// ✅ 推荐:直接导入图标对象,支持 tree-shaking import { faHome } from '@fortawesome/free-solid-svg-icons/faHome' import { faUser } from '@fortawesome/free-solid-svg-icons/faUser' import { faGear } from '@fortawesome/free-solid-svg-icons/faGear' // 或者从主入口批量导入(不推荐用于生产) // import { faHome, faUser, faGear } from '@fortawesome/free-solid-svg-icons' // 使用 library 添加全局图标 import { library } from '@fortawesome/fontawesome-svg-core' library.add(faHome, faUser, faGear) // 之后在任意组件中通过字符串引用 // <FontAwesomeIcon icon="fa-solid fa-home" />

使用 library.add() 全局注册后,可以通过字符串方式引用图标(如 "fa-solid fa-home"),方便但不支持 tree-shaking。生产环境推荐始终使用对象导入。

常用 Props 速查

属性类型说明示例
iconIconDefinition图标对象,必填{faHome}
sizestring图标尺寸,从 xs 到 10x"2x"
spinboolean连续旋转动画{true}
pulseboolean8 步脉冲旋转{true}
beatboolean缩放跳动动画{true}
fadeboolean淡入淡出效果{true}
flipstring翻转方向"horizontal"
rotationnumber旋转角度{90}
classNamestring附加 CSS 类名"my-icon"
styleobject内联样式对象{{ color: 'red' }}
titlestringSVG title 标签(无障碍)"首页"

TypeScript 支持

@fortawesome/react-fontawesome 内置了完整的 TypeScript 类型定义,无需额外安装类型包。图标定义类型为 IconDefinition,所有 Props 接口为 FontAwesomeIconProps。使用 TypeScript 可以获得完善的智能提示和编译时类型检查。图标对象的结构包含 prefixiconNameicon(SVG 路径数组)等属性,类型系统会确保传递给 icon 属性的值符合规范的图标定义格式。

import { FontAwesomeIcon, FontAwesomeIconProps } from '@fortawesome/react-fontawesome' import { IconDefinition } from '@fortawesome/fontawesome-svg-core' import { faHome } from '@fortawesome/free-solid-svg-icons/faHome' // 类型安全的组件 interface IconButtonProps { icon: IconDefinition label: string onClick: () => void } function IconButton({ icon, label, onClick }: IconButtonProps) { return ( <button onClick={onClick} className="btn btn-outline-primary"> <FontAwesomeIcon icon={icon} className="me-2" /> {label} </button> ) } // 使用示例:<IconButton icon={faHome} label="首页" onClick={handleClick} />

TypeScript 还会对 sizeflip 等枚举值进行类型校验,避免拼写错误。

常见场景

按钮中的图标

为按钮添加图标可以提升可点击元素的视觉辨识度,操作反馈更直观。

import { faDownload, faTrashCan, faPenToSquare } from '@fortawesome/free-solid-svg-icons' function ActionButtons() { return ( <div className="d-flex gap-2"> <button className="btn btn-success"> <FontAwesomeIcon icon={faDownload} className="me-1" /> 下载 </button> <button className="btn btn-outline-primary"> <FontAwesomeIcon icon={faPenToSquare} className="me-1" /> 编辑 </button> <button className="btn btn-outline-danger"> <FontAwesomeIcon icon={faTrashCan} /> 删除 </button> </div> ) }

导航菜单图标

侧边栏或顶部导航中使用 fa-fw 固定宽度类名,让图标对齐更整齐。

import { faHouse, faGear, faBell, faUser } from '@fortawesome/free-solid-svg-icons' const navItems = [ { icon: faHouse, label: '首页', path: '/' }, { icon: faUser, label: '个人中心', path: '/profile' }, { icon: faBell, label: '通知', path: '/notifications' }, { icon: faGear, label: '设置', path: '/settings' }, ] function Sidebar() { return ( <nav className="sidebar"> {navItems.map(item => ( <a key={item.path} href={item.path} className="nav-item"> <FontAwesomeIcon icon={item.icon} fixedWidth className="me-2" /> {item.label} </a> ))} </nav> ) }

动态图标切换

根据状态动态切换图标是实现交互反馈的常用模式。

import { useState } from 'react' import { faStar as faStarSolid } from '@fortawesome/free-solid-svg-icons' import { faStar as faStarRegular } from '@fortawesome/free-regular-svg-icons' function StarToggle() { const [liked, setLiked] = useState(false) return ( <button onClick={() => setLiked(!liked)} className="btn btn-link"> <FontAwesomeIcon icon={liked ? faStarSolid : faStarRegular} style={{ color: liked ? 'gold' : '#adb5bd' }} size="2x" /> <span className="ms-2">{liked ? '已收藏' : '点击收藏'}</span> </button> ) }

自定义图标组件封装

封装统一的图标组件,统一管理图标风格和尺寸,方便全局复用。

import { IconDefinition } from '@fortawesome/fontawesome-svg-core' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' interface IconProps { icon: IconDefinition size?: 'sm' | 'lg' | '2x' | '3x' color?: string spin?: boolean } function AppIcon({ icon, size = 'lg', color, spin }: IconProps) { return ( <FontAwesomeIcon icon={icon} size={size} spin={spin} style={color ? { color } : undefined} className="app-icon" /> ) } // 使用方式 // <AppIcon icon={faHome} color="#528dd7" /> // <AppIcon icon={faSpinner} spin size="3x" />

封装后可以统一添加动画、颜色主题、点击事件等逻辑,减少重复代码。建议在项目初期就建立这样的抽象层。

分享此页:

相关阅读