语法基础

属性

属性用于数据绑定。在 Live DSL 中属性主要分为两类:

  • 字段属性( : ),通常用于定义该类型声明的固有属性或结构性属性,这些属性是类型定义的一部分
  • 实例属性(=),通常用于定义继承或覆盖的属性

字段属性(Field Properties)

使用冒号(:)定义,通常用于定义组件的固有属性:

1MyWidget = {{Widget}} {
2    // 字段属性示例
3    color: #f00,         // 颜色属性
4    width: 100,         // 数值属性
5    visible: true,      // 布尔属性
6    name: "button",     // 字符串属性
7    padding: {          // 嵌套字段属性
8        left: 10,
9        right: 10
10    }
11}

字段属性的特点:

  • 用于定义组件的基本属性和状态
  • 值会直接映射到 Rust 结构体的字段
  • 使用冒号 : 分隔键和值
  • 可以被子组件继承和覆盖
  • 一般用于定义组件的静态配置

实例属性(Instance Properties)

使用等号(=)定义,通常用于定义可变或动态的属性:

1Container = {{View}} {
2    // 实例属性示例
3    Button1 = <Button> {  // 创建 Button 实例
4        width: 100,
5        label: "Click me"
6    }
7
8    Panel = <View> {     // 创建 View 实例
9        flow: Down,
10        Button2 = <Button> {
11            width: 200
12        }
13    }
14}

实例属性的特点:

  • 用于创建子组件实例
  • 使用等号 = 分隔
  • 通常与 <ComponentType> 语法一起使用
  • 可以嵌套定义形成组件树
  • 实例会在运行时创建为实际的组件对象
  • 用于构建组件的层级结构

二者关系

两者搭配,来创建组件。

1MyComponent = {{Component}} {
2    // 字段属性 - 定义组件本身的属性
3    width: Fill,
4    color: #f00,
5
6    // 实例属性 - 创建子组件
7    Header = <View> {
8        height: 50
9    }
10
11    Content = <View> {
12        // 字段属性
13        flow: Down,
14        spacing: 10,
15
16        // 嵌套实例属性
17        button1 = <Button> {
18            label: "OK"
19        }
20        button2 = <Button> {
21            label: "Cancel"
22        }
23    }
24}
25
26// 字段属性会映射到结构体字段
27#[derive(Live)]
28pub struct Component {
29    #[live] pub width: Size,    // 对应 width: Fill
30    #[live] pub color: Vec4,    // 对应 color: #f00
31}
32
33// 实例属性会创建新的组件实例
34impl Widget for Component {
35    fn handle_event(&mut self, cx: &mut Cx, event: &Event) {
36        // 可以通过 button() 访问子实例
37        let button = self.button(id!(button1));
38        button.handle_event(cx, event);
39    }
40}

关键区别:

  • 字段属性(:)定义组件的属性和配置
  • 实例属性(=)创建组件的实例和层级结构
  • 字段属性映射到 Rust 结构体字段
  • 实例属性创建实际的组件对象
  • 字段属性可继承,实例属性形成新的组件树节点

实例属性在运行时会创建实际的组件对象,可以通过模板 ID 来查找和访问。而字段属性会直接影响组件自身的属性值。

理解这两种属性的区别和用途对于正确使用 Live DSL 构建界面非常重要。

字段属性用于配置,实例属性用于组织组件结构。