组件模板是 .gen
文件中的核心部分,用于描述页面结构。它包含在 <template>
标签中,语法风格类似 HTML,但结合了组件系统的增强语法。
组件的声明方式分为两种:常规标签 和 自闭合标签。
<$component_name></$component_name>
包裹<$component_name />
$component_name
: 组件名称$static_prop
: 静态属性$prop_value
: 属性值$bind_prop
: 绑定属性$bind_ident
: 绑定变量标识符$callback
: 回调$callback_ident
: 回调方法标识符$arg
: 参数$()*
: many1,1 个或多个$()?
: recognize,0 个或 1 个
在语法规则部分我们会详细讲述组件模版的编写规则
根组件指的是每个.gen
文件中组件模版部分的根组件,即<template>
标签包裹的首个标签
在这个例子中根组件就是<view id="UiRoot"></view>
任何组件模版有且只有一个唯一的根组件,且根组件必须有一个唯一名称
您可能发现了静态和动态使用的唯一命名属性是不同的,静态使用id
动态使用name
它们之间的区别在于,使用静态唯一根时您无法进行任何脚本级代码操作,即使用<script>
Hello
时,在其他组件中使用<Hello></Hello>
表示该组件snake name rule
进行根组件的命名,例如: my_view1
,但在其他组件中引入时依然会转为camel name rule
,即:<MyView1></MyView1>
对于根组件,默认继承view
视图组件,不可更改,我们希望每个被封装的组件都可以作为独立的单个视图出现。
上方对于根组件id
和name
的说明我们称为对内原则和对外原则,id
对内,name
对外,意思是:
id
仅对当前被封装的组件内部起效,外部无法通过内部的id
获取内部组件name
仅对外有效,是外部使用被封装组件的途径,对内无法用name
对组件进行获取,且name
只存在于<component>
中静态属性的写法为:$static_prop="$prop_value"
,多个属性由空格
分割,例如:
组件的属性值是有类型的,错误类型无法编译通过
属性值的类型请参考: 数据类型
id
是组件的唯一标识,每个组件都有这个属性,通过id
可以获取到对应的组件,同时它也是组件的属性标识
如果您无法理解,请先阅读内外原则
class
是组件的属性(样式)标识,通过class
可以将样式(<style>
)部分对于的样式合并到组件中
class
没有唯一性class
,但不能声明多个class
as_prop
属性组件as_prop
属性会把某个组件转为其父组件的属性,源自于Makepad
中构建插槽的一种方式
目前在button
, view
, popup
等组件中涉及
对于需要绑定的属性使用:
作为属性的前缀,在模版中使用绑定属性的前提是在<script>
中的根组件声明中对绑定的属性进行声明,写法如下:
计算属性(Computed Property)是基于现有属性动态计算出的值,在 GenUI 中,计算属性不会存储状态,而是根据其依赖项的变化自动更新。
特性 | 计算属性 (Computed) | 双向绑定 (Two-way Binding) |
---|---|---|
是否存储状态 | ❌ 否 | ✅ 是 |
是否可变 | ✅ 依赖项变化时更新 | ✅ 是 |
是否可手动修改 | ✅ 但不能使用 set_xxx 方法 | ✅ 通过 set_xxx 修改 |
依赖数据 | ✅ 需要依赖项 | ✅ 组件状态 |
计算属性的写法为在属性绑定时使用方法进行声明:
对计算属性的详细说明见 Api: #[computed]
回调表示组件激发某个事件之后调用的某个方法,使用@
作为回调前缀,写法如下:
回调中可能没有任何参数,但依然需要添加()
若组件使用了回调一定要添加id
作为标识符
自 v0.1.2
起,GenUI 引入了自动 ID 分配策略。在组件构建过程中,系统会自动检查每个组件是否已显式指定 id
,若未指定,则会为其生成一个随机的唯一 ID。
这一机制在多个场景下都极为有用,包括:
:prop="..."
)@event="..."
)自动 ID 的引入极大地减少了手动管理标识符的繁琐,提高了模板代码的简洁性和可维护性。
我们并未采用 ulid
或其他第三方库,而是根据以下自定义策略生成 ID:
6 ~ 12
个字符之间,避免过短冲突或过长冗余。