Componente Filhos

Em alguns casos, você pode desejar criar um componente que atue como um contêiner para algum outro conteúdo, sem que o componente precise saber qual é esse conteúdo. Para conseguir isso, crie uma prop do tipo Element:


#![allow(unused)]
fn main() {
#[derive(Props)]
struct ClickableProps<'a> {
    href: &'a str,
    body: Element<'a>,
}

fn Clickable<'a>(cx: Scope<'a, ClickableProps<'a>>) -> Element {
    cx.render(rsx!(
        a {
            href: "{cx.props.href}",
            class: "fancy-button",
            &cx.props.body
        }
    ))
}
}

Então, ao renderizar o componente, você pode passar a saída de cx.render(rsx!(...)):


#![allow(unused)]
fn main() {
    cx.render(rsx! {
        Clickable {
            href: "https://www.youtube.com/watch?v=C-M2hs3sXGo",
            body: cx.render(rsx!("How to " i {"not"} " be seen")),
        }
    })
}

Nota: Como Element<'a> é uma prop emprestado, não haverá memoização.

Atenção: Embora possa compilar, não inclua o mesmo Element mais de uma vez no RSX. O comportamento resultante não é especificado.

O Campo children

Em vez de passar o RSX através de uma prop regular, você pode querer aceitar filhos da mesma forma que os elementos podem ter filhos. O prop "mágico" children permite que você consiga isso:


#![allow(unused)]
fn main() {
#[derive(Props)]
struct ClickableProps<'a> {
    href: &'a str,
    children: Element<'a>,
}

fn Clickable<'a>(cx: Scope<'a, ClickableProps<'a>>) -> Element {
    cx.render(rsx!(
        a {
            href: "{cx.props.href}",
            class: "fancy-button",
            &cx.props.children
        }
    ))
}
}

Isso torna o uso do componente muito mais simples: basta colocar o RSX dentro dos colchetes {} – e não há necessidade de uma chamada render ou outra macro!


#![allow(unused)]
fn main() {
    cx.render(rsx! {
        Clickable {
            href: "https://www.youtube.com/watch?v=C-M2hs3sXGo",
            "How to " i {"not"} " be seen"
        }
    })
}