callback

Macro callback 

Source
macro_rules! callback {
    ([$($dep:ident),*], || $result:expr) => { ... };
    ([$($dep:ident),*], |_ $(: $Type:ty)?| $result:expr) => { ... };
    ([$($dep:ident),*], |$($arg:ident $(: $Type:ty)?),+| $result:expr) => { ... };
}
Available on crate feature client only.
Expand description

A thin shorthand for creating closures of clone-and-move pattern.

This is useful when creating event handlers or callbacks using signals:

use uibeam::{UI, Beam, Signal, callback};
use uibeam::client::{InputEvent, PointerEvent};
use wasm_bindgen::JsCast;
use web_sys::HtmlInputElement;

struct ClientBeam;

#[uibeam::client]
impl Beam for ClientBeam {
    fn render(self) -> UI {
        let name = Signal::new("Alice".to_owned());
        let count = Signal::new(0);

        let handle_name_input = callback!([name], |e: InputEvent| {
            let input_element: HtmlInputElement = e
                .current_target().unwrap()
                .dyn_into().unwrap();
            name.set(input_element.value());
        });

        let handle_increment_click = callback!([count], |_: PointerEvent| {
            count.set(*count + 1);
        });

        todo!()
    }
}

ยงExample

use uibeam::{UI, Beam, Signal, callback};

#[derive(serde::Serialize, serde::Deserialize)]
pub struct Counter {
    pub initial_count: i32,
}

#[uibeam::client(island)]
impl Beam for Counter {
    fn render(self) -> UI {
        let count = Signal::new(self.initial_count);

        let increment = callback!([count], |_| {
            count.set(*count + 1);
        });

        let decrement = callback!([count], |_| {
            count.set(*count - 1);
        });

        UI! {
            <div class="w-[144px]">
                <p class="text-2xl font-bold text-center">
                    "Count: "{*count}
                </p>
                <div class="text-center">
                    <button
                        class="cursor-pointer bg-red-500  w-[32px] py-1 text-white rounded-md"
                        onclick={decrement}
                    >"-"</button>
                    <button
                        class="cursor-pointer bg-blue-500 w-[32px] py-1 text-white rounded-md"
                        onclick={increment}
                    >"+"</button>
                </div>
            </div>
        }
    }
}