跳到正文

路由

声明路由,在当前窗口中渲染匹配结果,并用链接或 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 读取查询参数,用 ui.UseLocation 读取当前位置。在显示时读取它们,文本才会保持最新。:name 片段会捕获一个路径参数。

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"],
						),
					)
				},
			),
		},
	})
}