mirror of
https://github.com/DioxusLabs/dioxus
synced 2024-12-22 18:43:14 +00:00
168 lines
4.8 KiB
Rust
168 lines
4.8 KiB
Rust
//! This example roughly shows how events are serialized into Rust from JavaScript.
|
|
//!
|
|
//! There is some conversion happening when input types are checkbox/radio/select/textarea etc.
|
|
|
|
use dioxus::prelude::*;
|
|
|
|
fn main() {
|
|
dioxus_desktop::launch(app);
|
|
}
|
|
|
|
const FIELDS: &[(&str, &str)] = &[
|
|
("button", "Click me!"),
|
|
("checkbox", "CHECKBOX"),
|
|
("color", ""),
|
|
("date", ""),
|
|
("datetime-local", ""),
|
|
("email", ""),
|
|
("file", ""),
|
|
("image", ""),
|
|
("number", ""),
|
|
("password", ""),
|
|
("radio", ""),
|
|
("range", ""),
|
|
("reset", ""),
|
|
("search", ""),
|
|
("submit", ""),
|
|
("tel", ""),
|
|
("text", ""),
|
|
("time", ""),
|
|
("url", ""),
|
|
// less supported things
|
|
("hidden", ""),
|
|
("month", ""), // degrades to text most of the time, but works properly as "value'"
|
|
("week", ""), // degrades to text most of the time
|
|
];
|
|
|
|
fn app(cx: Scope) -> Element {
|
|
cx.render(rsx! {
|
|
div { margin_left: "30px",
|
|
select_example(cx),
|
|
div {
|
|
// handling inputs on divs will catch all input events below
|
|
// so the value of our input event will be either huey, dewey, louie, or true/false (because of the checkboxe)
|
|
// be mindful in grouping inputs together, as they will all be handled by the same event handler
|
|
oninput: move |evt| {
|
|
println!("{evt:?}");
|
|
},
|
|
div {
|
|
input {
|
|
id: "huey",
|
|
r#type: "radio",
|
|
value: "huey",
|
|
checked: "",
|
|
name: "drone",
|
|
}
|
|
label {
|
|
r#for: "huey",
|
|
"Huey"
|
|
}
|
|
}
|
|
div {
|
|
input {
|
|
id: "dewey",
|
|
r#type: "radio",
|
|
value: "dewey",
|
|
name: "drone",
|
|
}
|
|
label {
|
|
r#for: "dewey",
|
|
"Dewey"
|
|
}
|
|
}
|
|
div {
|
|
input {
|
|
id: "louie",
|
|
value: "louie",
|
|
r#type: "radio",
|
|
name: "drone",
|
|
}
|
|
label {
|
|
r#for: "louie",
|
|
"Louie"
|
|
}
|
|
}
|
|
div {
|
|
input {
|
|
id: "groovy",
|
|
value: "groovy",
|
|
r#type: "checkbox",
|
|
name: "drone",
|
|
}
|
|
label {
|
|
r#for: "groovy",
|
|
"groovy"
|
|
}
|
|
}
|
|
}
|
|
|
|
// elements with driven values will preventdefault automatically.
|
|
// you can disable this override with preventdefault: false
|
|
div {
|
|
input {
|
|
id: "pdf",
|
|
value: "pdf",
|
|
name: "pdf",
|
|
r#type: "checkbox",
|
|
oninput: move |evt| {
|
|
println!("{evt:?}");
|
|
},
|
|
}
|
|
label {
|
|
r#for: "pdf",
|
|
"pdf"
|
|
}
|
|
}
|
|
|
|
FIELDS.iter().map(|(field, value)| rsx! {
|
|
div {
|
|
input {
|
|
id: "{field}",
|
|
name: "{field}",
|
|
r#type: "{field}",
|
|
value: "{value}",
|
|
oninput: move |evt: FormEvent| {
|
|
println!("{evt:?}");
|
|
},
|
|
}
|
|
label {
|
|
r#for: "{field}",
|
|
"{field} element"
|
|
}
|
|
br {}
|
|
}
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
fn select_example(cx: Scope) -> Element {
|
|
cx.render(rsx! {
|
|
div {
|
|
select {
|
|
id: "selection",
|
|
name: "selection",
|
|
multiple: true,
|
|
oninput: move |evt| {
|
|
println!("{evt:?}");
|
|
},
|
|
option {
|
|
value : "Option 1",
|
|
label : "Option 1",
|
|
}
|
|
option {
|
|
value : "Option 2",
|
|
label : "Option 2",
|
|
selected : true,
|
|
},
|
|
option {
|
|
value : "Option 3",
|
|
label : "Option 3",
|
|
}
|
|
}
|
|
label {
|
|
r#for: "selection",
|
|
"select element"
|
|
}
|
|
}})
|
|
}
|