Files
Endorphin-Document/guide/11-scenes-and-render-trees.md
T

102 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 11. 场景与渲染树
场景声明描述一个 UI 视图。render 块包含该视图的渲染树,树中的节点表示组件、参数和子节点。
## 11.1 场景声明
代码归属:`bob:shop.ui`。
```endorphin
export scene Main {
render {
Column(gap: 12, padding: 24) {
Text("Shop", role: .title)
Row(gap: 8) {
Text("Price")
Spacer(size: 4)
Text("90")
}
}
}
}
```
Main 是场景名。Column 是根节点,包含一个标题和一个横向排列的 Row。
本章使用[UI 组件](12-ui-components.md)中的官方组件。官方库的 key 和引用形式未定义,示例仅省略这一依赖部分,不表示官方组件属于任何示例用户库或必然免导入可用。
## 11.2 render 与单根结构
本文场景文法要求一个场景包含一个 render 块,render 中恰好包含一个根节点。
多个同级节点放入同一个布局根节点。下面是 render 内的有效节点片段:
```endorphin
Column {
Text("First")
Text("Second")
}
```
两个 Text 是 Column 的子节点,不是两个 render 根节点。单根规则仅约束 render 内部,不限制 namespace 只能有一个声明。
## 11.3 节点形式
节点包含组件名、可选参数列表和可选子节点块:
```text
组件名
组件名(参数列表)
组件名(参数列表) { 子节点 }
```
组件名是标识符。省略参数列表与空参数列表都表示没有显式参数;默认值由组件约定决定。
渲染节点片段:
```endorphin
Column {}
Spacer(size: 16)
Text("Product")
```
这三行分别展示空容器、带命名参数的节点和带位置参数的节点,不是一个具有三个根的完整 render 块。
## 11.4 参数
位置参数按参数位置表达输入,命名参数用 `参数名: 表达式`:
```endorphin
Text("Product", role: .title)
```
字符串为第一个位置参数,role 为命名参数。参数按逗号分隔,不使用尾随逗号。命名参数与位置参数可以在节点形式中共存,具体绑定与重复传参规则见[规范状态](../appendices/specification-status.md#ui)。
参数引用通用表达式文法,但 render 中允许哪些调用、状态读取和修改效果,需要另外规定;文法可以表达一种形式不等于该形式在所有渲染上下文中合法。
## 11.5 子节点与嵌套
子节点由花括号包围,相邻节点不使用逗号或分号。布局组件可以递归嵌套:
```endorphin
Column(gap: 12) {
Text("Shop", role: .title)
Row(gap: 8) {
Text("Left")
Text("Right")
}
}
```
Column 从上到下排列标题与 Row,Row 从左到右排列两段文本。结构文法允许子节点块,组件语义决定具体组件是否接受子节点;Text 和 Spacer 的用法不接受子节点。
## 11.6 检查与展示
Preflight 检查场景结构、单根约束、组件名称、参数和子节点是否合法。不合法节点或参数应得到诊断,而不是静默替换为别的组件或默认参数。
inflight 展示声明的内容与排列关系。渲染树不指定绘制协议、字体引擎或某个布局计算必须发生在哪一阶段。
数据绑定、事件、加载状态和界面更新的具体语法见[规范状态](../appendices/specification-status.md#ui)。
[上一章:数据读取](10-data-access.md) · [下一章:UI 组件](12-ui-components.md) · [目录](../README.md)