Classes

Classes

The struct Classes can be used to deal with HTML classes.

When pushing a string to the set, Classes ensures that there is one element for every class even if a single string might contain multiple classes.

Classes can also be merged by using Extend (i.e. classes1.extend(classes2)) or push() (i.e. classes1.push(classes2)). In fact, anything that implements Into<Classes> can be used to push new classes to the set.

The macro classes! is a convenient macro that creates one single Classes. Its input accepts a comma separated list of expressions. The only requirement is that every expression implements Into<Classes>.

  • Literal
  • Multiple
  • String
  • Optional
  • Vector
  • Array
  1. use yew::{classes, html};
  2. html! {
  3. <div class={classes!("container")}></div>
  4. };
  1. use yew::{classes, html};
  2. html! {
  3. <div class={classes!("class-1", "class-2")}></div>
  4. };
  1. use yew::{classes, html};
  2. let my_classes = String::from("class-1 class-2");
  3. html! {
  4. <div class={classes!(my_classes)}></div>
  5. };
  1. use yew::{classes, html};
  2. html! {
  3. <div class={classes!(Some("class"))} />
  4. };
  1. use yew::{classes, html};
  2. html! {
  3. <div class={classes!(vec!["class-1", "class-2"])}></div>
  4. };
  1. use yew::{classes, html};
  2. let my_classes = ["class-1", "class-2"];
  3. html! {
  4. <div class={classes!(my_classes.as_ref())}></div>
  5. };

Components that accept classes

  1. use boolinator::Boolinator;
  2. use yew::{classes, html, Children, Classes, Component, Html, Properties};
  3. #[derive(Clone, Properties)]
  4. struct Props {
  5. #[prop_or_default]
  6. class: Classes,
  7. fill: bool,
  8. children: Children,
  9. }
  10. struct MyComponent {
  11. props: Props,
  12. }
  13. impl Component for MyComponent {
  14. type Properties = Props;
  15. // ...
  16. fn view(&self) -> Html {
  17. let Props {
  18. class,
  19. fill,
  20. children,
  21. } = &self.props;
  22. html! {
  23. <div
  24. class=classes!(
  25. "my-container-class",
  26. fill.as_some("my-fill-class"),
  27. class.clone(),
  28. )
  29. >
  30. { children.clone() }
  31. </div>
  32. }
  33. }
  34. }

The example makes use of the boolinator crate to conditionally add the “my-fill-class” class based on the fill boolean attribute.