|
@@ -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 {
|