本文へスキップ

ルーティング

ルートを宣言し、現在のウィンドウで一致した結果を描画し、リンクまたは UseRouter で移動します。

#ルートの宣言

ページには ui.Route、共有の枠組みには ui.Layout を使います。ui.Outlet は一致した子が描画される場所です。

func RouterExample() *ui.Element {
	return ui.Router(ui.RouterProps{
		InitialPath: "/",
		Routes: []*ui.RouteDeclaration{
			ui.Route(
				"/",
				func() *ui.Element {
					return ui.Link(ui.LinkProps{Href: "/settings"}, "Settings")
				},
			),
			ui.Route(
				"/settings",
				func() *ui.Element { return ui.Text("Settings") },
			),
		},
		Fallback: func() *ui.Element { return ui.Text("Page not found") },
	})
}

#入れ子のレイアウト

関連するルートを ui.Layout で包みます。兄弟ルート間の移動ではレイアウトはマウントされたままで、ローカル状態が残ります。

func NestedRouterExample() *ui.Element {
	return ui.Router(ui.RouterProps{
		Routes: []*ui.RouteDeclaration{
			ui.Layout(
				func() *ui.Element {
					return ui.View().FlexCol().Gap(12).Children(
						ui.Link(ui.LinkProps{Href: "/"}, "Home"),
						ui.Link(ui.LinkProps{Href: "/settings"}, "Settings"),
						ui.Outlet(),
					)
				},
				ui.Route(
					"/",
					func() *ui.Element { return ui.Text("Home") },
				),
				ui.Route(
					"/settings",
					func() *ui.Element { return ui.Text("Settings") },
				),
			),
		},
	})
}

#ナビゲーション

ui.UseRouter() は Navigate、Replace、Back、Forward を公開します。ui.Link は行き先を宣言します。Push は履歴エントリを追加し、replace は現在のエントリを更新します。

func BackButton() *ui.Element {
	router := ui.UseRouter()
	return ui.Button().Child("Back").OnClick(router.Back)
}

#ルートパラメーター

パスパラメーターは ui.UseParams、クエリ値は ui.UseSearchParams、現在の location は ui.UseLocation で読みます。値を表示するときに読むと、テキストが最新のままになります。:name セグメントはパスパラメーターを 1 つキャプチャします。

func ParameterRouterExample() *ui.Element {
	return ui.Router(ui.RouterProps{
		InitialPath: "/projects/quickgui?tab=history",
		Routes: []*ui.RouteDeclaration{
			ui.Route(
				"/projects/:name",
				func() *ui.Element {
					params := ui.UseParams()
					search := ui.UseSearchParams()
					return ui.View().Children(
						ui.Text(
							"Project: ",
							params()["name"],
						),
						ui.Text(
							"Tab: ",
							search()["tab"],
						),
					)
				},
			),
		},
	})
}