yew_utils/vdom/
comp.rs

1use std::rc::Rc;
2use yew::virtual_dom as vdom;
3
4/// Better interface for [vdom::VComp]
5pub struct Comp<'a, T>
6where
7    T: yew::BaseComponent,
8{
9    props: T::Properties,
10    key: Option<&'a str>,
11}
12
13impl<'a, T> Comp<'a, T>
14where
15    T: yew::BaseComponent,
16{
17    pub(crate) fn new(props: T::Properties) -> Self {
18        Self { props, key: None }
19    }
20
21    #[must_use]
22    pub fn key(mut self, key: &'a str) -> Self {
23        self.key = Some(key);
24        self
25    }
26
27    #[must_use]
28    pub fn to_vnode(self) -> vdom::VNode {
29        let key = self.key.map(|k| k.into());
30        let comp = vdom::VComp::new::<T>(Rc::new(self.props), key);
31        vdom::VNode::VComp(comp)
32    }
33}
34
35impl<'a, T> From<Comp<'a, T>> for vdom::VNode
36where
37    T: yew::BaseComponent,
38{
39    fn from(builder: Comp<T>) -> Self {
40        builder.to_vnode()
41    }
42}
43
44impl<'a, T> From<Comp<'a, T>> for yew::Children
45where
46    T: yew::BaseComponent,
47{
48    fn from(comp: Comp<T>) -> Self {
49        yew::Children::new([comp.into()].to_vec())
50    }
51}