跳转到内容

API 参考

use gpui_rsx::{rsx, rsx_expand, rsx_permissive, rsx_strict};
行为
rsx!默认 permissive RSX 宏。
rsx_permissive!显式 permissive 模式;安全情况下忽略不支持的 class。
rsx_strict!不支持的静态 class 编译时报错;不支持的动态 class 求值时 panic。
rsx_expand!返回生成 GPUI builder 代码的字符串预览。
RSX 标签生成的构造器
div, span, section, article, header, footer, main, nav, asidediv()
h1h6, p, label, adiv()
button, input, textarea, select, formdiv()
ul, ol, lidiv()
svgsvg()
img src={source}img source={source}img(source)
canvas prepaint={a} paint={b}canvas(a, b)
MyComponentMyComponent()
ui::TaskCardui::TaskCard()
任意带 base={expr} 的标签expr
RSX生成形式
<div flex />.flex()
<div gap={px(4.0)} />.gap(px(4.0))
<div class="flex gap-4" />编译期 class 方法展开
<div class={classes} />生成运行时 class matcher
<div visible={cond} />.visible().invisible()
<img grayscale />.grayscale(true)
<Button base={Button::new("id")} />Button::new("id") 开始方法链
<button key={id} onClick={h} />生成复合 .id(...) 并调用 .on_click(h)

idkeybase 是宏级属性。id 会生成 .id(...)keybase 会被宏消费。

RSX 属性GPUI 方法
onClickon_click
onMouseDownon_mouse_down
onMouseUpon_mouse_up
onMouseMoveon_mouse_move
onHoveron_hover
onDragon_drag
onDropon_drop
onKeyDown / onKeyUpon_key_down / on_key_up
captureKeyDown / captureKeyUpcapture_key_down / capture_key_up
backgroundColorbg
textColortext_color
fontSizetext_size
fontWeightfont_weight
lineHeightline_height
minWidth / maxWidthmin_w / max_w
minHeight / maxHeightmin_h / max_h
gapX / gapYgap_x / gap_y
overflowScrolloverflow_scroll
overflowXScroll / overflowYScrolloverflow_x_scroll / overflow_y_scroll
trackScrolltrack_scroll
groupHover / groupActivegroup_hover / group_active
tabIndex / tabStoptab_index / tab_stop

多参数方法使用 tuple 值:

rsx! {
<div
onMouseDown={(MouseButton::Left, handler)}
onDrag={(drag_value, build_drag)}
/>
}

groupDragOver / group_drag_over 不作为属性提供,因为 GPUI 需要显式拖拽数据类型。 请使用 whenbase 并直接调用 group_drag_over::<YourType>(...)

属性形状生成思路
when`when={(condition,el
whenSome`whenSome={(option,el, value
whenClasswhenClass={(condition, "class list")}`.when(condition,

whenClass 需要字符串字面量,并拒绝有状态滚动 class。

静态 class 字符串覆盖范围最广、性能最好。动态 class 字符串使用常用运行时 matcher 子集。

范围示例
布局flex, flex-col, grid, hidden, absolute, relative
对齐items-center, justify-between, content-stretch, self-center
间距gap-4, gap-x-2, p-4, px-2, m-4, mt-2
尺寸w-full, w-64, w-[280px], w-[37.5%], w-6/24
颜色bg-blue-500, text-white, border-gray-300, bg-[#ff0000]
排版text-sm, text-2xl, font-bold, text-center, truncate
边框border, border-t, border-2, rounded-md, rounded-full
其他cursor-pointer, debug-outline, shadow-md, opacity-50, col-span-full

数值工具类使用直接像素语义:w-64 表示 w(px(64.0))

宏会为需要 GPUI 有状态身份的属性和静态 class 注入 ID:

分类名称
事件onClick, onHover, onDrag, onAuxClick, onA11yAction
交互状态active, activeClass, groupActive, focusable, tooltip, hoverableTooltip, tooltipShowDelay, anchorScroll, trackScroll, scrollbarWidth
无障碍role, ariaLabel, ariaSelected, ariaExpanded 以及其他 aria* 属性
滚动 classoverflow-scroll, overflow-x-scroll, overflow-y-scroll

{for ...} 中,有状态元素必须提供 id={...}key={...}groupHover 不需要 ID;groupActive 需要。

RSX body返回表达式
单个元素生成 GPUI 元素表达式
Fragment <>...</>vec![...]
子表达式 {expr}.child(expr)
Spread {...iter}.children(iter)
For 循环 {for item in iter { ... }}.children(iter.into_iter().map(...)).flat_map(...)