Template State 模板状态数据
有时候我们希望在模板内进行消费类似 Context 上下文的数据,但又希望这些数据能控制在模板实例的作用域下:数据封装在模板内部、外部不可访问,同时一个模板的多个实例之间的数据互不影响。Template State 模板状态数据正是为了解决这个问题。
示例
定义:
customTemplates:
- name: "tpl-my-awesome-button"
state:
# 状态数据,在模板外部可以通过给模板传递属性来初始化状态数据。
- name: "buttonDisabled"
# 可以设置默认值,在外部没有传递对应属性时使用。
value: true
bricks:
- brick: "my-button"
properties:
# 在模板内部,通过表达式变量 `STATE` 来读取状态数据。
disabled: "<% STATE.buttonDisabled %>"
- brick: "my-trigger"
events:
click:
# 在模板内部,通过内置事件处理来更新状态数据。
action: "state.update"
args:
- "buttonDisabled"
- false
该状态数据作用域为模板实例,因此,同一个模板的多个实例之间的数据是隔离的。另外该状态数据只能用于模板内部,无法用于模板外部,包括模板对外暴露的插槽中加入的外部构件。
在模板外部传递状态数据:
bricks:
- brick: "tpl-my-awesome-button"
properties:
# 设置初始属性
buttonDisabled: false
id: "button-a"
- brick: "my-toggle"
events:
click:
# 动态地给模板设置属性来变更它的状态数据(需要配合 `"track state"` 使用)
target: "#button-a"
properties:
buttonDisabled: true
除上述示例列出的能力外,已支持的其它能力(类比 CTX):
- 条件判断
if - 属性追踪
"track state" - 异步数据
resolve(仅限使用在普通编排中的模板。在useBrick中使用模板时,该模板不能定义resolve的数据) - 懒加载
lazystate.load - 异步加载
async - 主动更新
state.refresh - 追踪依赖
track - 追踪带条件判断的 Resolve
注意:v2 暂不支持为模板状态数据设置 async(v3 支持)。
note
如果该模板用于 useBrick 中,目前不可以使用 resolve 来定义异步的状态数据。
变更历史
| 组件 | 版本 | 变更 |
|---|---|---|
| brick_next | 2.91.1 | 支持追踪带条件判断的 Resolve |
| - | 2.87.3 | 支持 async |
| - | 2.75.12 | state.load / state.refresh 支持配置回调事件 callback |
| - | 2.75.9 | 支持 lazy / track 和 state.load / state.refresh |
| - | 2.63.27 | 修复使用模板的合并属性时,该属性中的 useBrick 中的 events 等需要懒计算的表达式被提前计算了的问题 |
| - | 2.63.25 | 修复状态数据无法访问其他状态数据的问题 |
| - | 2.63.23 | 修复 useBrick 重复渲染报告“不能重新定义属性”的问题 |
| - | 2.63.22 | 修复 targetRef 在 onChange 中无法使用的问题 |
| - | 2.63.21 | 修复在事件回调中设置 useBrick 的事件时可能会丢失其所属模板的上下文信息的问题 |
| - | 2.63.20 | 修复 onChange 无法生效的问题 |
| - | 2.63.17 | 支持模板状态数据 |