Avatar / AvatarGroup
概述
`Avatar` 路由到 `rml_ui::Avatar`,**StatelessNoId** 叶子组件,用于显示用户头像图片,无图片时自动回退为姓名首字母或占位图标。
`AvatarGroup` 路由到 `rml_ui::AvatarGroup`,**StatelessNoId** 容器组件,以紧凑重叠方式组合展示多个 `Avatar`。
基本用法
图片头像
<Avatar src="https://example.com/avatar.jpg" large="" />
<Avatar src={user.avatar_url} />
首字母回退
未提供 `src` 时,根据 `name` 自动生成首字母并配色:
<Avatar name="John Doe" large="" />
<Avatar name="Alice" />
<!-- 文本子节点等价于 name 属性 -->
<Avatar>John Doe</Avatar>
占位图标
无图片无姓名时显示默认 `User` 图标,可用 `placeholder` 替换:
<Avatar large="" />
<Avatar placeholder="Building2" />
`placeholder` 值必须是 `IconName` 枚举名(如 `User`/`UserCircle`/`Building2`)。
尺寸
通过 Sizable 通用属性控制:
<Avatar name="John" xsmall="" />
<Avatar name="John" small="" />
<Avatar name="John" />
<Avatar name="John" large="" />
AvatarGroup
基础分组
子节点必须是 `<Avatar>` 元素:
<AvatarGroup>
<Avatar src="https://example.com/u1.jpg" />
<Avatar src="https://example.com/u2.jpg" />
<Avatar name="John Doe" />
</AvatarGroup>
限制数量 + 省略标记
<AvatarGroup limit="3" ellipsis="">
<Avatar src="https://example.com/u1.jpg" />
<Avatar src="https://example.com/u2.jpg" />
<Avatar src="https://example.com/u3.jpg" />
<Avatar src="https://example.com/u4.jpg" />
<Avatar name="John Doe" />
</AvatarGroup>
分组尺寸
Sizable 作用于所有子头像:
<AvatarGroup small="" limit="5">
<Avatar name="A" />
<Avatar name="B" />
</AvatarGroup>
属性
Avatar
| 属性 | 类型 | 绑定 | 说明 | |------|------|------|------| | `src` | 字符串(URL) | `{expr}` | 图片源 | | `name` | 字符串 | `{expr}` | 用户名(无图片时回退为首字母) | | `placeholder` | `IconName` 枚举名 | `{expr}` | 占位图标,默认 `User` | | `small` / `xsmall` / `large` | 布尔标志 | — | Sizable 尺寸 | | `disabled` | 布尔 | `{expr}` | 禁用(Styled 通用) |
通用 Styled 属性(`border_*`/`shadow_*`/`rounded_*`/`bg`/`text_color` 等)可通过 `class` 或 Rust 手写应用。
AvatarGroup
| 属性 | 类型 | 绑定 | 说明 | |------|------|------|------| | `limit` | 整数 | `{expr}` | 最大显示数量(默认 3) | | `ellipsis` | 布尔标志 | — | 超限时显示省略标记 | | `small` / `xsmall` / `large` | 布尔标志 | — | 作用于所有子头像 |
事件
Avatar 实现 `InteractiveElement`,支持通用 `on-click`:
<Avatar src={user.avatar} on-click={on_avatar_click} />
数据绑定
<Avatar src={current_user.avatar_url} name={current_user.display_name} />
<AvatarGroup limit={max_visible} ellipsis="">
<!-- each 循环渲染 -->
</AvatarGroup>
子节点 / 插槽
- **Avatar**:叶子组件,不接受元素子节点。单个文本子节点映射到 `.name()`(与显式 `name=` 互斥,显式属性优先)。 - **AvatarGroup**:容器组件,子节点**必须是 `<Avatar>` 元素**。支持 `each` 指令循环渲染。
完整示例
<component>
<div v_flex="" class="case-pane">
<h2>用户资料</h2>
<div h_flex="" gap_4="">
<Avatar src={user.avatar} name={user.name} large="" />
<div v_flex="">
<span>{user.name}</span>
<span>{user.title}</span>
</div>
</div>
<h3>团队成员</h3>
<AvatarGroup limit="4" ellipsis="">
<Avatar src="https://example.com/alice.jpg" />
<Avatar src="https://example.com/bob.jpg" />
<Avatar name="Charlie Brown" />
<Avatar name="Diana Prince" />
<Avatar name="Eve Wilson" />
</AvatarGroup>
</div>
</component>
常见错误
1. **AvatarGroup 子节点非 Avatar**:`<AvatarGroup><div>...</div></AvatarGroup>` 会生成 `.child(gpui::div()...)`,但 `AvatarGroup::child` 仅接受 `Avatar` 类型,导致编译错误。 2. **placeholder 值非 IconName 枚举名**:`placeholder="foo"` 会生成 `.placeholder(rml_ui::IconName::foo)`,若 `foo` 不是合法枚举变体则编译失败。 3. **Avatar 不支持元素子节点**:`<Avatar><div /></Avatar>` 不会生成 `.child()`(Avatar 未实现 `ParentElement`)。
相关组件
- [badge.md](./badge.md) - [label.md](./label.md) - [tag.md](./tag.md)
RML 未覆盖的 API
以下 gpui-component API 需在 Rust code-behind 中手写:
- `Avatar::with_size(px(N))` — 自定义像素尺寸(RML 仅支持枚举尺寸) - `AvatarGroup::children(Vec<Avatar>)` — 批量添加(RML 用 `each` 指令或多个 `<Avatar>` 子节点替代) - 自定义 Styled 样式(`border_3`/`border_color`/`shadow_sm`/`rounded(px(N))` 等)需通过 `class` 或 Rust 手写