extern crate messenger; extern crate serde_json; extern crate tokio; #[macro_use] extern crate virtual_view; use std::sync::{Arc, Mutex}; use std::sync::atomic::{AtomicUsize, Ordering}; use serde_json::from_value; use tokio::executor::current_thread; use virtual_view::{Children, Component, EventManager, Instance, Prop, Props, Renderer, Transaction, Updater, View}; struct Button; impl Component for Button { fn name(&self) -> &'static str { "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 { view! {
{format!("Count {}", instance.state.get("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}>