Skip to Content
组件使用模式

组件使用模式

在逐个读 widget 页面之前,先把 4 个共通模式记住,会更容易学。

1. 先看 builder,再看 view!

这一部分的页面都先用 builder API 讲,因为它最直接、最接近真实接口。

但在应用里,很多 widget 也可以写进 view!

view! { <Input value={self.draft.clone()} placeholder={"Type a command".to_string()} on_change={Message::DraftChanged} on_submit={|value| Some(Message::Submit(value))} /> }

你想精确控制构造过程时,用 builder。你想让层级结构一眼可读时,用 view!

2. 区分无状态组件和有交互状态组件

有些 widgets 基本是无状态的:

  • Text
  • Paragraph
  • Block
  • Gauge

有些 widgets 的交互状态会跨 rerender 持续存在:

  • Input
  • List
  • Tabs
  • Table
  • ScrollView
  • Scrollbar

看到这类组件时,重点关注:

  • ListState
  • TableState
  • ScrollbarState
  • 输入值和提交流转

3. 在 Ansiq 里,组件页不只是在讲“怎么画”

Ansiq 是 retained-tree runtime。
所以一个 widget 页面不只是“它长什么样”,还包括:

当子树被替换、被 rerender 时,它的状态怎么保住?

这也是为什么很多 widget 公开了 state 类型,也为什么 continuity key 在大应用里很重要。

4. 高阶界面来自少量稳定组合

很多更复杂的终端界面,其实都是由这些稳定组合长出来的:

  • Shell 提供 header/body/footer
  • PaneBlock 负责 framed sections
  • ListTabsTable 负责选中和切换
  • ScrollView + Scrollbar 负责长内容
  • ComposerBarBottomPaneSessionTranscript 负责长会话界面

这也是为什么这部分文档按“用途”分组,而不是按 crate 文件顺序列出来。

Last updated on