polish: examples
This commit is contained in:
1 parent
4b6ca05f2c
commit
1a2f91ed91
19 files changed
+327
-183
No files matched your search
@@ -0,0 +1,6 @@
|
||||
# Known quirks for browsers and their workarounds
|
||||
|
||||
- text merging (solved through comment nodes)
|
||||
- cursor jumping to end on inputs (not yet solved, solved in React already)
|
||||
- SVG attributes cannot be set (solved using the correct method)
|
||||
- volatile components
|
||||
@@ -11,7 +11,7 @@ license = "MIT/Apache-2.0"
|
||||
dioxus-core = { path = "../core", version = "0.1.2" }
|
||||
dioxus-html = { path = "../html" }
|
||||
js-sys = "0.3"
|
||||
wasm-bindgen = { version = "0.2.71", features = ["enable-interning"] }
|
||||
wasm-bindgen = { version = "0.2.78", features = ["enable-interning"] }
|
||||
lazy_static = "1.4.0"
|
||||
wasm-bindgen-futures = "0.4.20"
|
||||
log = "0.4.14"
|
||||
@@ -70,12 +70,12 @@ crate-type = ["cdylib", "rlib"]
|
||||
|
||||
[dev-dependencies]
|
||||
im-rc = "15.0.0"
|
||||
# rand = { version="0.8.4", features=["small_rng"] }
|
||||
separator = "0.4.1"
|
||||
uuid = { version = "0.8.2", features = ["v4", "wasm-bindgen"] }
|
||||
dioxus-hooks = { path = "../hooks" }
|
||||
serde = { version = "1.0.126", features = ["derive"] }
|
||||
surf = { git = "https://github.com/http-rs/surf", rev = "1ffaba8873", default-features = false, features = [
|
||||
"wasm-client",
|
||||
] }
|
||||
# wasm-timer = "0.2.5"
|
||||
|
||||
# rand = { version="0.8.4", features=["small_rng"] }
|
||||
# surf = { version = "2.3.1", default-features = false, features = [
|
||||
# "wasm-client",
|
||||
# ] }
|
||||
@@ -15,7 +15,7 @@ use std::{pin::Pin, time::Duration};
|
||||
|
||||
fn main() {
|
||||
// Setup logging
|
||||
// wasm_logger::init(wasm_logger::Config::new(log::Level::Debug));
|
||||
wasm_logger::init(wasm_logger::Config::new(log::Level::Debug));
|
||||
console_error_panic_hook::set_once();
|
||||
|
||||
// Run the app
|
||||
@@ -24,32 +24,44 @@ fn main() {
|
||||
|
||||
static APP: FC<()> = |cx, props| {
|
||||
let mut count = use_state(cx, || 3);
|
||||
let mut content = use_state(cx, || String::from("h1"));
|
||||
let mut text_content = use_state(cx, || String::from("Hello, world!"));
|
||||
|
||||
log::debug!("running scope...");
|
||||
|
||||
let mut content = use_state(cx, || String::new());
|
||||
cx.render(rsx! {
|
||||
div {
|
||||
h1 { "content val is {content}" }
|
||||
|
||||
input {
|
||||
value: "{content}"
|
||||
oninput: move |e| {
|
||||
content.set(e.value());
|
||||
}
|
||||
}
|
||||
button {
|
||||
onclick: move |_| count += 1,
|
||||
"Click to add."
|
||||
"Current count: {count}"
|
||||
r#type: "text",
|
||||
value: "{text_content}"
|
||||
oninput: move |e| text_content.set(e.value())
|
||||
}
|
||||
|
||||
br {}
|
||||
{(0..10).map(|f| {
|
||||
rsx!(
|
||||
button {
|
||||
onclick: move |_| count += 1,
|
||||
"Click to add."
|
||||
"Current count: {count}"
|
||||
}
|
||||
br {}
|
||||
)
|
||||
})}
|
||||
|
||||
select {
|
||||
name: "cars"
|
||||
id: "cars"
|
||||
value: "h1"
|
||||
value: "{content}"
|
||||
oninput: move |ev| {
|
||||
content.set(ev.value());
|
||||
match ev.value().as_str() {
|
||||
"h1" => count.set(0),
|
||||
"h2" => count.set(5),
|
||||
"h3" => count.set(10),
|
||||
s => {}
|
||||
_ => {}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -58,14 +70,7 @@ static APP: FC<()> = |cx, props| {
|
||||
option { value: "h3", "h3" }
|
||||
}
|
||||
|
||||
ul {
|
||||
{(0..*count).map(|f| rsx!{
|
||||
li { "a - {f}" }
|
||||
li { "b - {f}" }
|
||||
li { "c - {f}" }
|
||||
})}
|
||||
|
||||
}
|
||||
{render_list(cx, *count)}
|
||||
|
||||
{render_bullets(cx)}
|
||||
|
||||
@@ -80,4 +85,19 @@ fn render_bullets(cx: Context) -> DomTree {
|
||||
})
|
||||
}
|
||||
|
||||
static Child: FC<()> = |cx, props| rsx!(cx, div {"hello child"});
|
||||
fn render_list(cx: Context, count: usize) -> DomTree {
|
||||
let items = (0..count).map(|f| {
|
||||
rsx! {
|
||||
li { "a - {f}" }
|
||||
li { "b - {f}" }
|
||||
li { "c - {f}" }
|
||||
}
|
||||
});
|
||||
|
||||
rsx!(cx, ul { {items} })
|
||||
}
|
||||
|
||||
static Child: FC<()> = |cx, props| {
|
||||
// render
|
||||
rsx!(cx, div {"hello child"})
|
||||
};
|
||||
@@ -24,7 +24,7 @@ fn main() {
|
||||
dioxus_web::launch(App, |c| c)
|
||||
}
|
||||
|
||||
static App: FC<()> = |cx, props|{
|
||||
static App: FC<()> = |cx, props| {
|
||||
let mut state = use_state(cx, || 0);
|
||||
cx.render(rsx! {
|
||||
div {
|
||||
|
||||
+11
-3
@@ -314,12 +314,20 @@ impl WebsysDom {
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(node) = node.dyn_ref::<HtmlInputElement>() {
|
||||
if let Some(input) = node.dyn_ref::<HtmlInputElement>() {
|
||||
if name == "value" {
|
||||
node.set_value(value);
|
||||
/*
|
||||
if the attribute being set is the same as the value of the input, then don't bother setting it.
|
||||
This is used in controlled components to keep the cursor in the right spot.
|
||||
|
||||
this logic should be moved into the virtualdom since we have the notion of "volatile"
|
||||
*/
|
||||
if input.value() != value {
|
||||
input.set_value(value);
|
||||
}
|
||||
}
|
||||
if name == "checked" {
|
||||
node.set_checked(true);
|
||||
input.set_checked(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -156,6 +156,7 @@ pub async fn run_with_props<T: Properties + 'static>(root: FC<T>, root_props: T,
|
||||
work_loop.wait_for_raf().await;
|
||||
|
||||
for mut edit in mutations {
|
||||
log::debug!("edits are {:#?}", edit);
|
||||
// actually apply our changes during the animation frame
|
||||
websys_dom.process_edits(&mut edit.edits);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ use gloo_timers::future::TimeoutFuture;
|
||||
use js_sys::Function;
|
||||
use wasm_bindgen::JsCast;
|
||||
use wasm_bindgen::{prelude::Closure, JsValue};
|
||||
use web_sys::Window;
|
||||
use web_sys::{window, Window};
|
||||
|
||||
pub struct RafLoop {
|
||||
window: Window,
|
||||
@@ -24,10 +24,21 @@ impl RafLoop {
|
||||
|
||||
let (ric_sender, ric_receiver) = async_channel::unbounded();
|
||||
|
||||
let ric_closure: Closure<dyn Fn(JsValue)> = Closure::wrap(Box::new(move |_v: JsValue| {
|
||||
//
|
||||
let deadline = _v.dyn_into::<web_sys::IdleDeadline>().unwrap();
|
||||
let time_remaining = deadline.time_remaining() as u32;
|
||||
let has_idle_callback = {
|
||||
let bo = window().unwrap().dyn_into::<js_sys::Object>().unwrap();
|
||||
bo.has_own_property(&JsValue::from_str("requestIdleCallback"))
|
||||
};
|
||||
let ric_closure: Closure<dyn Fn(JsValue)> = Closure::wrap(Box::new(move |v: JsValue| {
|
||||
let time_remaining = if has_idle_callback {
|
||||
if let Ok(deadline) = v.dyn_into::<web_sys::IdleDeadline>() {
|
||||
deadline.time_remaining() as u32
|
||||
} else {
|
||||
10
|
||||
}
|
||||
} else {
|
||||
10
|
||||
};
|
||||
|
||||
ric_sender.try_send(time_remaining).unwrap()
|
||||
}));
|
||||
|
||||
|
||||
Reference in new issue
Block a user