active_class prop for Router

This commit is contained in:
Maccesch committed 2022-03-13 16:35:28 +00:00
1 parent 1080ffe52d
commit 9a23ee4612
6 files changed
+52 -8

No files matched your search

+15 -4
View File
@@ -28,7 +28,9 @@ pub struct LinkProps<'a> {
/// Set the class added to the inner link when the current route is the same as the "to" route.
///
/// By default set to `"active"`.
/// To set all of the active classes inside a Router at the same time use the `active_class`
/// prop on the Router component. If both the Router prop as well as this prop are provided then
/// this one has precedence. By default set to `"active"`.
#[props(default, strip_option)]
pub active_class: Option<&'a str>,
@@ -97,13 +99,22 @@ pub fn Link<'a>(cx: Scope<'a, LinkProps<'a>>) -> Element {
let outerlink = (*autodetect && is_http) || *external;
let prevent_default = if outerlink { "" } else { "onclick" };
let active_class_name = match active_class {
Some(c) => (*c).into(),
None => {
let active_from_router = match svc {
Some(service) => service.cfg.active_class.clone(),
None => None,
};
active_from_router.unwrap_or("active".into())
}
};
let route = use_route(&cx);
let url = route.url();
let path = url.path();
let active = path == cx.props.to;
let active_class = active
.then(|| active_class.unwrap_or("active"))
.unwrap_or("");
let active_class = if active { active_class_name } else { "".into() };
cx.render(rsx! {
a {