diff --git a/packages/yew/src/html/component/children.rs b/packages/yew/src/html/component/children.rs index 94205309bb5..cb2f1dfe13f 100644 --- a/packages/yew/src/html/component/children.rs +++ b/packages/yew/src/html/component/children.rs @@ -204,9 +204,7 @@ where /// Render children components and return `Iterator` pub fn iter(&self) -> impl Iterator + '_ { - // clone each child lazily. - // This way `self.iter().next()` only has to clone a single node. - self.children.iter().flat_map(|x| x.iter()).cloned() + self.into_iter() } /// Convert the children elements to another object (if there are any). @@ -252,12 +250,23 @@ impl IntoIterator for ChildrenRenderer { type Item = T; fn into_iter(self) -> Self::IntoIter { - if let Some(children) = self.children { - let children = RcExt::unwrap_or_clone(children); - children.into_iter() - } else { - Vec::new().into_iter() + match self.children { + Some(children) => RcExt::unwrap_or_clone(children).into_iter(), + None => std::vec::IntoIter::default(), + } + } +} + +impl<'a, T: Clone> IntoIterator for &'a ChildrenRenderer { + type IntoIter = std::iter::Cloned>; + type Item = T; + + fn into_iter(self) -> Self::IntoIter { + match &self.children { + Some(children) => children.iter(), + None => std::slice::Iter::default(), } + .cloned() } }