组件使用模式
在逐个读 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 基本是无状态的:
TextParagraphBlockGauge
有些 widgets 的交互状态会跨 rerender 持续存在:
InputListTabsTableScrollViewScrollbar
看到这类组件时,重点关注:
ListStateTableStateScrollbarState- 输入值和提交流转
3. 在 Ansiq 里,组件页不只是在讲“怎么画”
Ansiq 是 retained-tree runtime。
所以一个 widget 页面不只是“它长什么样”,还包括:
当子树被替换、被 rerender 时,它的状态怎么保住?
这也是为什么很多 widget 公开了 state 类型,也为什么 continuity key 在大应用里很重要。
4. 高阶界面来自少量稳定组合
很多更复杂的终端界面,其实都是由这些稳定组合长出来的:
Shell提供 header/body/footerPane或Block负责 framed sectionsList、Tabs、Table负责选中和切换ScrollView + Scrollbar负责长内容ComposerBar、BottomPane、SessionTranscript负责长会话界面
这也是为什么这部分文档按“用途”分组,而不是按 crate 文件顺序列出来。
Last updated on