本文へスキップ

フォームと入力

フィールドの値はシグナルに置き、受け入れた変更はコールバックから書き戻します。

#テキスト入力

ui.Input と ui.TextArea はネイティブのテキストエディターです。Value をバインドし、OnInput から更新します。OnSubmit は 1 行入力の 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 または混合状態を受け付けます。ラジオグループは 1 つの値を保持します。チェックボックスグループとトグルグループは複数の値を保持できます。無効と読み取り専用は別です。

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

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 ゴルーチンで行い、バックグラウンドの作業には ui.Async を使います。