virtual_view_dom ===== a virtual view transaction renderer for the dom ### Build Examples ```bash $ cargo install -f cargo-web ``` ```bash $ make ``` ### Counter Example ```rust extern crate serde_json; extern crate stdweb; #[macro_use] extern crate virtual_view; extern crate virtual_view_dom; use stdweb::web::{document, IEventTarget, INonElementParentNode}; use virtual_view::{Children, Component, EventManager, Instance, Prop, Props, Renderer, Updater, View}; use virtual_view_dom::{Handler, Patcher, TransactionEvent}; struct Button; impl Component for Button { fn render(&self, _: &Instance, props: &Props, children: &Children) -> View { view! { } } } struct Counter; impl Counter { fn on_add_count(updater: &Updater) -> Prop { updater.set_state(|current| { let mut next = current.clone(); next.update("count", |count| { if let Some(c) = count.number() { *count = (c + 1.0).into(); } }); next }); Prop::Null } fn on_sub_count(updater: &Updater) -> Prop { updater.set_state(|current| { let mut next = current.clone(); next.update("count", |count| { if let Some(c) = count.number() { *count = (c - 1.0).into(); } }); next }); Prop::Null } } impl Component for Counter { fn name(&self) -> &'static str { "Counter" } fn initial_state(&self, props: &Props) -> Props { props! { "count": props.take("count").unwrap_or(0.into()) } } fn render(&self, instance: &Instance, _: &Props, _: &Children) -> View { let count = instance.state.get("count").number().unwrap_or(0.0); view! {
= 0.0 {"#000"} else {"#f00"}, }}>{format!("Count {}", count)}
<{Button} onclick={ block { let updater = instance.updater.clone(); move |_: &mut Props| Counter::on_add_count(&updater) } }> {"Add"} {Button}> <{Button} onclick={ block { let updater = instance.updater.clone(); move |_: &mut Props| Counter::on_sub_count(&updater) } }> {"Sub"} {Button}>