跳到正文

表单与输入

把字段值放在信号里,并在回调中把已接受的更改写回去。

#文本输入

ui.Input 和 ui.TextArea 是原生文本编辑器。绑定 Value,并在 OnInput 中更新它。OnSubmit 处理单行输入中的 Return。

func InputExample() *ui.Element {
	value, setValue := ui.CreateSignal("")
	return ui.Input().
		Value(value()).
		Placeholder("Write here").
		OnInputEvent(func(event *native.Event) { setValue(event.Value) }).
		Width(320).Height(32)
}

#字段

Field 把标签、控件、说明和错误信息组合在一起。用你自己的状态驱动 Required、Invalid 和 ValidationMessage。

func FieldExample() *ui.Element {
	email, setEmail := ui.CreateSignal("")
	field := ui.NewField(ui.FieldRootProps{
		Required: true,
		Filled:   func() bool { return email() != "" },
	})
	return field.Root().FlexCol().Gap(6).Children(
		field.Label().Child("Email"),
		field.Control(ui.FieldControlProps{
			InputPartProps: ui.InputPartProps{
				Value:       email,
				Placeholder: "you@example.com",
				OnInput:     func(event *native.Event) { setEmail(event.Value) },
			},
		}),
		field.Description().Child("Used for receipts"),
		field.Error().Child("Enter a valid email address"),
	)
}

校验模式见 Field。

#选项

复选框接受 bool 或混合状态。单选组保存一个值;复选框组和开关组可以保存多个值。禁用与只读是分开的。

func CheckboxGroupExample() *ui.Element {
	values, setValues := ui.CreateSignal([]string{"email"})
	group := ui.NewCheckboxGroup(ui.CheckboxGroupProps{
		AllValues: []string{"email", "push"},
		Value:     values,
		OnValueChange: func(next []string, _ *native.Event) {
			setValues(next)
		},
	})
	email := ui.NewCheckbox(ui.CheckboxProps{Value: "email"})
	push := ui.NewCheckbox(ui.CheckboxProps{Value: "push"})
	return group.Root().FlexCol().Gap(8).Children(
		email.Root().Child("Email"),
		push.Root().Child("Push"),
	)
}

#选择器

Select 从列表中选择。Combobox 把输入和选择结合起来。Autocomplete 接受自由输入。多选使用 Values 和 OnValuesChange。

func SelectExample() *ui.Element {
	value, setValue := ui.CreateSignal[*string](nil)
	picker := ui.NewSelect(ui.SelectRootProps{
		PickerSourceProps: ui.PickerSourceProps{
			Items: func() []ui.OptionDeclaration {
				return []ui.OptionDeclaration{
					{Value: "go", Label: "Go"},
					{Value: "swift", Label: "Swift"},
				}
			},
		},
		Value: value,
		OnValueChange: func(next *string, _ *native.Event) {
			setValue(next)
		},
	})
	return picker.Root().Children(
		picker.Value(),
		picker.Icon().Child("▾"),
	)
}

#事件

按钮使用 OnClick(func() { ... })。需要 *native.Event 时改用 OnClickEvent。复合控件的回调包含类型化的值,并在相关时附带事件。界面更新必须在 UI 协程上进行;后台工作使用 ui.Async。