Skip to content

ElementId 是 GPUI 元素的唯一标识符,用于在 GPUI 组件树中引用具体元素。

在开始使用 GPUI 和 GPUI Component 之前,最好先理解 ElementId 的作用。

例如:

rs
div().id("my-element").child("Hello, World!")

在这个例子里,div 元素的 id"my-element"。为元素添加 id 后,GPUI 才能将事件绑定到它上面,例如 on_clickon_mouse_move。在 GPUI 中,带有 id 的元素通常称为 Stateful<E>

我们也会在某些组件内部使用 id 来管理状态。实际上 GPUI 会在内部使用 GlobalElementId,并通过 window.use_keyed_state 这类机制保存状态,因此 id 保持唯一非常重要。

唯一性

id 需要在当前布局作用域内唯一,也就是在同一个 Stateful<E> 父节点下不能重复。

例如下面这个包含多个列表项的结构:

rs
div().id("app").child(
    div().id("list1").child(vec![
        div().id(1).child("Item 1"),
        div().id(2).child("Item 2"),
        div().id(3).child("Item 3"),
    ])
).child(
    div().id("list2").child(vec![
        div().id(1).child("Item 1"),
    ])
)

这里子项可以使用很简单的 id,因为它们已经处于带有 id 的父元素之下。

GPUI 内部会结合父元素的 id 自动生成 GlobalElementId。在这个例子中,list1 里的 Item 1 对应的 global_id 是:

rs
["app", "list1", 1]

list2 里的 Item 1 对应的 global_id 是:

rs
["app", "list2", 1]

因此,只要父级路径不同,子元素就可以复用较简单的局部 id