Macro yew::html_nested [−][src]
html_nested!() { /* proc-macro */ }
Expand description
This macro is similar to html!
, but preserves the component type instead
of wrapping it in Html
.
That macro is useful when, for example, in a typical implementation of a list
component (let’s assume it’s called List
).
In a typical implementation you might find two component types – List
and ListItem
.
Only ListItem
components are allowed to be children of List`.
You can find an example implementation of this in the nested_list
example.
That example shows, how to create static lists with their children.
use yew::html::ChildrenRenderer; use yew::virtual_dom::VChild; #[derive(Clone, Properties)] struct List { children: ChildrenRenderer<ListItem>, } impl Component for List { type Properties = Self; // ... } #[derive(Clone)] struct ListItem; impl Component for ListItem { // ... } // Required for ChildrenRenderer impl From<VChild<ListItem>> for ListItem { fn from(child: VChild<ListItem>) -> Self { Self } } impl Into<Html> for ListItem { fn into(self) -> Html { self.view() } } // You can use `List` with nested `ListItem` components. // Using any other kind of element would result in a compile error. html! { <List> <ListItem/> <ListItem/> <ListItem/> </List> } // In many cases you might want to create the content dynamically. // To do this, you can use the following code: html! { <List> { for some_iter.map(|_| html_nested!{ <ListItem/> }) } </List> }
If you used the html!
macro instead of html_nested!
, the code would
not compile because we explicitly indicated to the compiler that List
can only contain elements of type ListItem
using ChildrenRenderer<ListItem>
,
while html!
creates items of type Html
.