diff --git a/yew/src/virtual_dom/mod.rs b/yew/src/virtual_dom/mod.rs index 858dc390c..79af7c4ca 100644 --- a/yew/src/virtual_dom/mod.rs +++ b/yew/src/virtual_dom/mod.rs @@ -155,6 +155,12 @@ impl> From<&Option> for Classes { impl> From> for Classes { fn from(t: Vec) -> Self { + Classes::from(t.as_slice()) + } +} + +impl> From<&[T]> for Classes { + fn from(t: &[T]) -> Self { let set = t .iter() .map(|x| x.as_ref()) diff --git a/yew/src/virtual_dom/vtag.rs b/yew/src/virtual_dom/vtag.rs index 8343b61af..c6105c5e5 100644 --- a/yew/src/virtual_dom/vtag.rs +++ b/yew/src/virtual_dom/vtag.rs @@ -750,6 +750,38 @@ mod tests { } } + #[test] + fn supports_multiple_classes_slice() { + let classes = ["class-1", "class-2"]; + let a = html! { +
+ }; + + if let VNode::VTag(vtag) = a { + assert!(get_class_str(&vtag).contains("class-1")); + assert!(get_class_str(&vtag).contains("class-2")); + assert!(!get_class_str(&vtag).contains("class-3")); + } else { + panic!("vtag expected"); + } + } + + #[test] + fn supports_multiple_classes_one_value_slice() { + let classes = ["class-1 class-2", "class-1"]; + let a = html! { +
+ }; + + if let VNode::VTag(vtag) = a { + assert!(get_class_str(&vtag).contains("class-1")); + assert!(get_class_str(&vtag).contains("class-2")); + assert!(!get_class_str(&vtag).contains("class-3")); + } else { + panic!("vtag expected"); + } + } + #[test] fn supports_multiple_classes_vec() { let mut classes = vec!["class-1"]; @@ -784,12 +816,12 @@ mod tests { } #[test] - fn filter_empty_string_classes_vec() { - let mut classes = vec![""]; - classes.push("class-2"); + fn filter_empty_string_classes() { let a = html! {
}; let b = html! {
}; let c = html! {
}; + let d_arr = [""]; + let d = html! {
}; if let VNode::VTag(vtag) = a { assert!(!vtag.attributes.contains_key("class")); @@ -808,6 +840,12 @@ mod tests { } else { panic!("vtag expected"); } + + if let VNode::VTag(vtag) = d { + assert!(!vtag.attributes.contains_key("class")); + } else { + panic!("vtag expected"); + } } fn assert_vtag(node: &mut VNode) -> &mut VTag {