编写组件
编写组件
编写给别人放进应用里的组件,方式与 NSGo 自己的 base 和 ui 相同。
这些页面写给组件作者:一套控件库、一个设计系统,或者一个由应用以 Go 包引入的复杂视图。阅读前请先了解组件与状态和样式与主题。
一个组件
组件是带 Render 方法的类型,和应用里的写法一样。它的字段由应用设置;应用没有设置的字段取零值,所以每个字段的零值都应当是最常见的情况。
package chips
import "github.com/oneo-me/nsgo/core"
// Chip is a short label in a pill.
type Chip struct {
Text string
}
// Render implements core.Node.
func (c Chip) Render(*core.Scope) core.Node {
return core.View{Class: "self-start rounded-full px-3 py-1", Children: []core.Node{
core.Text{Content: c.Text, Class: "text-sm"},
}}
}
应用像使用其他元素一样使用它:chips.Chip{Text: "New"}。
行为与外观
NSGo 的每个控件都有两份。base 负责行为、状态和无障碍,没有外观,每个部件的样式都来自应用;ui 给 base 的形式加上外观,行为只在一处实现。组件库也可以这样划分:
- 无样式组件负责按压、键盘、焦点和读屏器读出的内容,并开放每个部件的样式,像
base.Switch那样。应用和其他组件库给它外观(部件与状态)。 - 带样式组件包装一个无样式组件,只负责选择样式,样式取自当前主题,像
ui.Switch那样(外观与主题)。
没有值得共享的行为的组件,比如徽标,可以只有带样式的形式。
一个包
- 一个文件放一个组件,以组件命名(
chip.go),只放它自己用到的类型;多个组件共用的部分单独成文件。 - 复杂组件单独成包,API 中省去组件名,像
base/dock的dock.Area。 - 组件要说的话放在包的
locales/中(文案、测试与发布)。 - 不要按设备隐式改变任何东西:在手机或桌面上不同的尺寸或形态,应该是应用设置的字段。