- 前端
- UI组件
【免费下载链接】rsuite
🧱 A suite of React components .
本文基于 rsuite 开源仓库(
gh_mirrors/rs/rsuite)中的 Avatar 官方文档 及其配套示例、源码编写,全面讲解Avatar(头像)与AvatarGroup(头像组)两个组件的用法、全部属性、常见场景(文字头像、图标头像、图片头像、尺寸、边框、颜色、加载回退、堆叠头像、角标)以及底层实现原理。读完本文,你将能够在 rsuite 项目中熟练使用头像组件构建用户列表、品牌标识、消息角标等界面,并理解其图片预加载与回退机制的工作方式。
一、组件概览与导入方式
Avatar用于展示用户头像或品牌标识,是社交类、IM 类、企业后台类界面中最常用的基础组件之一。AvatarGroup则用于将多个头像聚合展示(如「最近参与人」「团队成员」列表)。
从 rsuite 主包导入即可使用:
import { Avatar, AvatarGroup } from 'rsuite';组件默认的classPrefix为avatar(头像组为avatar-group),最终渲染的 DOM 根节点是一个div元素,图片加载成功后会渲染内部<img>标签。
二、基础用法
2.1 基础示例(Basic)
最典型的用法是把图片地址传给src,配合circle属性渲染圆形头像;不传src时则渲染一个默认占位头像:
import { AvatarGroup, Avatar } from 'rsuite'; const App = () => ( <AvatarGroup spacing={6}> <Avatar src="https://i.pravatar.cc/150?u=1" /> <Avatar circle /> <Avatar src="https://i.pravatar.cc/150?u=2" circle /> </AvatarGroup> ); ReactDOM.render(<App />, document.getElementById('root'));对应完整示例见 basic.md。
2.2 文字头像(Character avatar)
当没有src时,children会被渲染为头像内容,因此可以放单个字符(如姓氏首字母)甚至 emoji。此时可以用color设置背景色,或通过bg属性(继承自Box)传入渐变等 CSS 背景:
import { AvatarGroup, Avatar } from 'rsuite'; const App = () => ( <> <AvatarGroup spacing={6}> <Avatar color="green">R</Avatar> <Avatar bg="linear-gradient(45deg, #4CAF50, #2196F3)">X</Avatar> <Avatar color="blue">👍</Avatar> </AvatarGroup> <hr /> <AvatarGroup spacing={6}> <Avatar circle color="green"> R </Avatar> <Avatar circle bg="linear-gradient(45deg, #4CAF50, #2196F3)"> X </Avatar> <Avatar circle color="blue"> 👍 </Avatar> </AvatarGroup> </> );提示:示例中使用的
bg属性来自 rsuite 的Box能力,Avatar.tsx 中将剩余 props 透传给StyledBox,因此Box支持的样式属性(如bg、padding等)同样生效。
2.3 图标头像(Icon avatars)
children还可以是任意 React 元素,因此可以轻松放入图标库组件(如react-icons):
import { AvatarGroup, Avatar } from 'rsuite'; import { FaUserLarge } from 'react-icons/fa6'; import { FcBusinessman, FcCustomerSupport } from 'react-icons/fc'; const App = () => ( <AvatarGroup spacing={6}> <Avatar> <FaUserLarge /> </Avatar> <Avatar> <FaUserLarge size={30} /> </Avatar> <Avatar> <FcBusinessman size={30} /> </Avatar> <Avatar> <FcCustomerSupport size={30} /> </Avatar> </AvatarGroup> );2.4 图片头像(Image avatars)
通过src+alt展示真实用户头像,circle使其呈圆形。alt会同时透传给内部<img>与回退元素,详见下文「回退策略」:
import { AvatarGroup, Avatar } from 'rsuite'; const App = () => ( <AvatarGroup spacing={6}> <Avatar circle src="https://i.pravatar.cc/150?u=1" alt="Avatar" /> <Avatar circle src="https://i.pravatar.cc/150?u=2" alt="Avatar" /> {/* …… 更多用户 */} </AvatarGroup> );三、外观定制
3.1 尺寸(Size)
size支持'xs' | 'sm' | 'md' | 'lg' | 'xl'五档(类型定义见 size.md),默认'md':
import { AvatarGroup, Avatar } from 'rsuite'; const App = () => ( <> <AvatarGroup spacing={6}> <Avatar size="xl" circle src="https://i.pravatar.cc/150?u=1" /> <Avatar size="lg" circle src="https://i.pravatar.cc/150?u=1" /> <Avatar size="md" circle src="https://i.pravatar.cc/150?u=1" /> <Avatar size="sm" circle src="https://i.pravatar.cc/150?u=1" /> <Avatar size="xs" circle src="https://i.pravatar.cc/150?u=1" /> </AvatarGroup> <hr /> <AvatarGroup spacing={6}> <Avatar size="xl" circle /> <Avatar size="lg" circle /> <Avatar size="md" circle /> <Avatar size="sm" circle /> <Avatar size="xs" circle /> </AvatarGroup> </> );从源码看,size最终经由StyledBox以 CSS 变量(--rs-avatar-size等)的方式驱动样式(见 Avatar.tsx 与 styles/index.scss),因此切档无需额外写样式类。
3.2 边框(Bordered)
bordered(5.59.0 版本新增)为头像添加描边,适合在浅色背景或堆叠场景中区隔相邻头像:
import { AvatarGroup, Avatar } from 'rsuite'; const App = () => ( <AvatarGroup spacing={20}> <Avatar bordered src="https://i.pravatar.cc/150?u=1" /> <Avatar bordered circle src="https://i.pravatar.cc/150?u=2" /> </AvatarGroup> );3.3 颜色(Color)
color(5.59.0 版本新增)设置头像背景色。它的类型为ColorScheme | CSSProperties['color'],即可以传语义色名、带深浅度的色阶或任意 CSS 颜色值:
import { AvatarGroup, Avatar } from 'rsuite'; const App = () => ( <> <AvatarGroup spacing={14}> <Avatar color="red" bordered circle src="https://i.pravatar.cc/150?u=1" /> <Avatar color="orange" bordered circle src="https://i.pravatar.cc/150?u=1" /> <Avatar color="yellow" bordered circle src="https://i.pravatar.cc/150?u=1" /> <Avatar color="green" bordered circle src="https://i.pravatar.cc/150?u=1" /> <Avatar color="cyan" bordered circle src="https://i.pravatar.cc/150?u=1" /> <Avatar color="blue" bordered circle src="https://i.pravatar.cc/150?u=1" /> <Avatar color="violet" bordered circle src="https://i.pravatar.cc/150?u=1" /> </AvatarGroup> <hr /> <AvatarGroup spacing={6}> <Avatar color="red" circle /> <Avatar color="orange" circle /> <Avatar color="yellow" circle /> <Avatar color="green" circle /> <Avatar color="cyan" circle /> <Avatar color="blue" circle /> <Avatar color="violet" circle /> </AvatarGroup> </> );ColorScheme的完整定义(见 color-scheme.md)如下,除 7 种基础色外,还支持带深浅度的写法(如red.500、blue.50):
type Color = 'red' | 'orange' | 'yellow' | 'green' | 'cyan' | 'blue' | 'violet'; type ShadeValue = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900; // Color with shade type (e.g., red.50, blue.500) type ColorShade = `${Colours}.${ShadeValue}` | `${ColorGray}.${ShadeValue}`; // Combined type that allows both basic colors and colors with shades type ColorScheme = Color | ColorShade;因此你还可以写<Avatar color="red.600">,或用任意 CSS 色值<Avatar color="#ff6b81">。
四、加载回退策略(Avatar Fallbacks)
官方文档明确了两级回退规则(对应 fallback.md):
- 有
alt属性时:图片加载失败后,渲染alt文本作为替代; - 没有
alt属性时:渲染默认占位头像(一个内置的人物图标)。
import { AvatarGroup, Avatar } from 'rsuite'; const App = () => ( <AvatarGroup spacing={6}> <Avatar circle src="https://images.unsplash.com/broken" alt="Alt" /> <Avatar circle src="https://images.unsplash.com/broken" /> </AvatarGroup> );源码级原理:useImage预加载机制
回退能力由 src/Avatar/useImage.ts 实现。核心逻辑如下:
- 组件维护
pending | loading | error | loaded四种状态; - 只要传入了
src,就会在useEffect中把状态置为loading,随后用useIsomorphicLayoutEffect在布局阶段同步触发loadImge(); loadImge()内部不直接渲染<img>,而是先用new Image()在内存中预加载,分别绑定onload/onerror回调;只有状态变为loaded时才真正渲染<img>标签(见 Avatar.tsx 的const image = loaded ? <img {...imageProps} className={prefix\image`} /> : placeholder;`);- 加载失败时调用
onError?.(event)(5.59.0 新增),并回到回退内容; - 加载完成后会
flush()清理内部引用与事件回调,避免内存泄漏与重复触发。
对应的渲染优先级是:图片加载成功 >children>alt文本 > 默认头像图标(placeholder = children || altComponent || <AvatarIcon />)。也就是说,即使传了src,在图片加载完成之前会先显示占位内容,加载成功后再无缝切换为真实图片。
五、堆叠头像(Stacked avatars)
AvatarGroup的stack属性让头像以层叠(部分重叠)方式排列,常用来展示「协作成员」「共同点赞者」;再配合bordered区分层与层之间的边界,并用一个「+N」头像表示剩余人数:
import { AvatarGroup, Avatar } from 'rsuite'; const users = [ { avatar: 'https://i.pravatar.cc/150?u=1', name: 'John Doe' }, { avatar: 'https://i.pravatar.cc/150?u=2', name: 'Tom Doe' }, // …… 更多用户 ]; const max = 4; const App = () => ( <> <AvatarGroup stack> {users.map(user => ( <Avatar bordered circle key={user.name} src={user.avatar} alt={user.name} /> ))} </AvatarGroup> <hr /> <AvatarGroup stack> {users .filter((user, i) => i < max) .map(user => ( <Avatar bordered circle key={user.name} src={user.avatar} alt={user.name} /> ))} <Avatar bordered circle style={{ background: '#111' }}> +{users.length - max} </Avatar> </AvatarGroup> </> );六、与 Badge 组合(With badge)
头像最常见的组合场景之一是为头像叠加角标(在线状态、未读消息数)。直接复用 rsuite 的Badge组件包裹Avatar即可:
import { AvatarGroup, Badge, Avatar } from 'rsuite'; const App = () => ( <AvatarGroup spacing={20}> <Badge> <Avatar src="https://i.pravatar.cc/150?u=1" /> </Badge> <Badge content="20"> <Avatar src="https://i.pravatar.cc/150?u=2" /> </Badge> </AvatarGroup> );七、API 属性总览
7.1<Avatar>属性
| 属性 | 类型 | 默认值 | 描述 | 版本 |
|---|---|---|---|---|
| alt | string | — | 图片头像的替代文本 | |
| bordered | boolean | — | 是否显示边框 | 5.59.0 |
| children | string | Element<typeof Icon> | — | 内容(文本或图标) | |
| circle | boolean | — | 渲染为圆形头像 | |
| classPrefix | string | 'avatar' | 组件 CSS 类名前缀 | |
| color | ColorScheme | CSSProperties['color'] | — | 设置头像背景色 | 5.59.0 |
| imgProps | object | — | 当组件用于显示图片时,透传给内部img元素的属性(可监听加载错误事件) | |
| onError | (event) => void | — | 图片加载失败时的回调 | 5.59.0 |
| size | Size |('md') | 'md' | 头像尺寸 | |
| sizes | string | — | 内部img元素的sizes属性 | |
| src | string | — | 内部img元素的src属性 | |
| srcSet | string | — | 内部img元素的srcSet属性,用于响应式图片 |
说明:
srcSet/sizes/crossOrigin均会被传给useImage并在内存预加载阶段一并设置(见 useImage.ts),因此响应式图片(srcSet按视口密度切换)同样享受「加载成功后才渲染」的回退保障。
7.2<AvatarGroup>属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| size | Size | — | 统一设置组内所有头像的尺寸 |
| spacing | number | — | 设置头像之间的间距 |
| stack | boolean | — | 将组内所有头像渲染为堆叠形式 |
7.3 公共类型
ColorScheme:基础色名(red/orange/yellow/green/cyan/blue/violet)或带深浅度色阶(如red.500),见 color-scheme.md;Size:'xs' | 'sm' | 'md' | 'lg' | 'xl',见 size.md。
八、源码实现要点
- 尺寸与颜色的透传:
Avatar基于StyledBox实现(Avatar.tsx),size、color会以 CSS 变量形式作用到根节点,bg等BoxProps属性同样可用。 - 头像组的上下文机制:
AvatarGroup通过AvatarGroupContext(见 AvatarGroup.tsx)把size下发给组内每个Avatar,子组件读取useContext(AvatarGroupContext)作为自身size的默认值(Avatar.tsx),因此组内单独设置size可以覆盖组级设置。 - 默认占位图标:
AvatarIcon是内置的通用人物图标,作为无src、无children、无alt时的最后兜底内容,样式定义于 styles/index.scss。 - 测试覆盖:仓库的 Avatar.spec.tsx 与 Avatar.styles.spec.tsx 覆盖了渲染、回退与样式类名等行为,可作为阅读源码时的参考。
九、实战建议
- 统一尺寸:团队/用户列表场景优先用
AvatarGroup的size统一头像大小,避免逐个设置造成视觉不一致。 - 善用回退:用户头像地址经常因 CDN 失效而加载失败,务必提供
alt(如用户名),或结合onError回调做上报与降级处理(例如切换为文字头像)。 - 堆叠 + 溢出:成员较多时使用
stack并在末尾放置「+N」头像,信息密度与视觉整齐度兼得。 - 角标语义化:在线状态用
Badge(无content的圆点),消息数用Badge content="20",两者直接包裹Avatar即可对齐定位。 - 响应式头像:需要高 DPR 场景下展示高清头像时,使用
srcSet+sizes让浏览器按设备密度自动选择图片资源。
以上所有示例与属性均可在仓库内直接复现与验证:文档入口为 docs/pages/components/avatar/en-US/index.md,示例片段位于 docs/pages/components/avatar/fragments/ 目录,实现源码位于 src/Avatar/ 与 src/AvatarGroup/(头像组组件文件在 AvatarGroup.tsx)。
- 前端
- UI组件
【免费下载链接】rsuite
🧱 A suite of React components .
相关推荐
Rsuite Avatar 头像组件实战指南:从图片加载回退到堆积头像组的完整实现解析
Rsuite Avatar 头像组件实战指南:从图片加载回退到堆积头像组的完整实现解析 本文围绕 Rsuite 官方 Avatar 组件文档展开,完整覆盖头像的
前端UI组件大麦自动抢票脚本实战教程:3 步跑通双端配置与成功率数据
大麦自动抢票脚本实战教程:3 步跑通双端配置与成功率数据 开售瞬间按钮从"立即购买"变成"已售罄",这种遗憾你经历过吗?手动点击在热门演出面前往往慢半拍。tic
GUI 自动化RPAshadcn-svelte Avatar 组件完全指南:用户头像展示、加载回退与组合实践
shadcn svelte Avatar 组件完全指南:用户头像展示、加载回退与组合实践 导读 本文聚焦 shadcn svelte 项目中 docs/cont
UI组件前端CLI开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考