Merge branch 'master' into feature/use-shared-state-better-diagnostics

This commit is contained in:
Jonathan Kelley authored and GitHub committed 2023-07-14 15:07:53 -07:00
commit 9d2b44aa0f
63 files changed
+4018 -1715

No files matched your search

+6
View File
@@ -52,6 +52,9 @@ macro_rules! to_owned {
};
}
mod use_on_unmount;
pub use use_on_unmount::*;
mod usecontext;
pub use usecontext::*;
@@ -78,3 +81,6 @@ pub use usecallback::*;
mod usememo;
pub use usememo::*;
mod userootcontext;
pub use userootcontext::*;
+74
View File
@@ -0,0 +1,74 @@
/// Creats a callback that will be run before the component is removed. This can be used to clean up side effects from the component (created with use_effect)
///
/// Example:
/// ```rust
/// use dioxus::prelude::*;
/// fn app(cx: Scope) -> Element {
/// let state = use_state(cx, || true);
/// render! {
/// for _ in 0..100 {
/// h1 {
/// "spacer"
/// }
/// }
/// if **state {
/// render! {
/// child_component {}
/// }
/// }
/// button {
/// onclick: move |_| {
/// state.set(!*state.get());
/// },
/// "Unmount element"
/// }
/// }
/// }
/// fn child_component(cx: Scope) -> Element {
/// let original_scroll_position = use_state(cx, || 0.0);
/// use_effect(cx, (), move |_| {
/// to_owned![original_scroll_position];
/// async move {
/// let window = web_sys::window().unwrap();
/// let document = window.document().unwrap();
/// let element = document.get_element_by_id("my_element").unwrap();
/// element.scroll_into_view();
/// original_scroll_position.set(window.scroll_y().unwrap());
/// }
/// });
/// use_on_unmount(cx, {
/// to_owned![original_scroll_position];
/// /// restore scroll to the top of the page
/// move || {
/// let window = web_sys::window().unwrap();
/// window.scroll_with_x_and_y(*original_scroll_position.current(), 0.0);
/// }
/// });
/// render!{
/// div {
/// id: "my_element",
/// "hello"
/// }
/// }
/// }
/// ```
pub fn use_on_unmount<D: FnOnce() + 'static>(cx: &dioxus_core::ScopeState, destroy: D) {
cx.use_hook(|| LifeCycle {
ondestroy: Some(destroy),
});
}
struct LifeCycle<D: FnOnce()> {
ondestroy: Option<D>,
}
impl<D: FnOnce()> Drop for LifeCycle<D> {
fn drop(&mut self) {
let f = self.ondestroy.take().unwrap();
f();
}
}
+9
View File
@@ -0,0 +1,9 @@
use dioxus_core::ScopeState;
///
pub fn use_root_context<T: 'static + Clone>(cx: &ScopeState, new: impl FnOnce() -> T) -> &T {
cx.use_hook(|| {
cx.consume_context::<T>()
.unwrap_or_else(|| cx.provide_root_context(new()))
})
}