@@ -21,8 +21,8 @@ use wasm_bindgen::UnwrapThrowExt;
22/// pub struct MyComponent;
22/// pub struct MyComponent;
24−/// impl Render for MyComponent {
24+/// impl<'a> Render<'a> for MyComponent {
25−/// fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
25+/// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
26/// use dodrio::builder::*;
26/// use dodrio::builder::*;
@@ -35,26 +35,26 @@ use wasm_bindgen::UnwrapThrowExt;
38−pub trait Render {
38+pub trait Render<'a> {
39 /// Render `self` as a virtual DOM. Use the given context's `Bump` for
39 /// Render `self` as a virtual DOM. Use the given context's `Bump` for
40 /// temporary allocations.
40 /// temporary allocations.
41− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a>;
41+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a>;
44−impl<'r, R> Render for &'r R
44+impl<'a, 'r, R> Render<'a> for &'r R
46− R: Render,
46+ R: Render<'a>,
48− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
48+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
49 (**self).render(cx)
49 (**self).render(cx)
53−impl<R> Render for Rc<R>
53+impl<'a, R> Render<'a> for Rc<R>
55− R: Render,
55+ R: Render<'a>,
57− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
57+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
58 (**self).render(cx)
58 (**self).render(cx)
@@ -69,7 +69,7 @@ where
69/// You do not need to implement this trait by hand: there is a blanket
69/// You do not need to implement this trait by hand: there is a blanket
70/// implementation for all `Render` types that fulfill the `RootRender`
70/// implementation for all `Render` types that fulfill the `RootRender`
71/// requirements.
71/// requirements.
72−pub trait RootRender: Any + Render {
72+pub trait RootRender: Any + for<'a> Render<'a> {
73 /// Get this `&RootRender` trait object as an `&Any` trait object reference.
73 /// Get this `&RootRender` trait object as an `&Any` trait object reference.
74 fn as_any(&self) -> &dyn Any;
74 fn as_any(&self) -> &dyn Any;
@@ -80,7 +80,7 @@ pub trait RootRender: Any + Render {
81impl<T> RootRender for T
81impl<T> RootRender for T
83− T: Any + Render,
83+ T: Any + for<'a> Render<'a>,
85 fn as_any(&self) -> &dyn Any {
85 fn as_any(&self) -> &dyn Any {
@@ -138,4 +138,31 @@ mod tests {
138 #[allow(dead_code)]
138 #[allow(dead_code)]
139 fn takes_dyn_render(_: &dyn super::RootRender) {}
139 fn takes_dyn_render(_: &dyn super::RootRender) {}
143+ fn render_bump_scoped_child() {
144+ use crate::{builder::*, bumpalo::collections::String, Node, Render, RenderContext};
150+ impl<'a> Render<'a> for Child<'a> {
151+ fn render(&self, _cx: &mut RenderContext<'a>) -> Node<'a> {
158+ impl<'a> Render<'a> for Parent {
159+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
160+ let child_name = String::from_str_in("child", cx.bump).into_bump_str();
163+ .children([Child { name: child_name }.render(cx)])