设计原理
amisgo 是基于百度 amis 的一个 Go 语言实现。amis 允许通过 JSON 配置来定义页面,而 amisgo 则进一步优化了这一做法,通过 Go 的类型系统定义各种组件,并将其转换为 JSON,最终通过 Go template 渲染出 amis SDK 支持的 HTML 页面。针对原生 amis 较复杂的交互部分,也增加了基于回调的简化方法。
核心模块 internal/comp
这个模块用于定义各种组件,代码非常简单,遵循统一模式。
1. 组件的基本定义
每个组件的基本定义和构造方法如下:
type Form schema.Schema
func NewForm() Form {
return Form{"type": "form"}
}
其中 schema.Shema 底层是 map[string]any:
type Schema map[string]any
2. 组件的属性方法
每个组件都有一系列属性设置方法,如:
func (f Form) Title(value string) Form {
return f.set("title", value)
}
func (f Form) Body(value ...any) Form {
return f.set("body", value)
}
其中,set 是一个辅助方法,用于设置属性值并返回当前组件实例:
func (f Form) set(key string, value any) Form { f[key] = value return f }
示例代码
以下是一个简单示例,展示了 amisgo 渲染页面的写法:
app := amisgo.New()
app.Page().Title("amisgo").Body(
app.Form().
Api("https://xxx/api/saveForm").
Body(
app.InputText().Label("姓名").Name("name"),
app.InputEmail().Label("邮箱").Name("email"),
),
)
相较于原生 amis,amisgo 具有以下优势:
- 强类型系统:通过 Go 的 map 别名定义组件,方法定义组件属性,减少了 JSON 拼写错误的风险。
- 简化表达:amis 中交互事件描述较为复杂,amisgo 借助回调函数等简化了这一部分,使其变得明白晓畅。详见后续章节。