From 1052e0d4c3345e616caee007d9cab69cdd6cb72e Mon Sep 17 00:00:00 2001 From: Muhammad Hamza Date: Sun, 28 Aug 2022 17:34:12 +0500 Subject: [PATCH 1/3] Use TearDown trait as destructor for use_effect --- .../yew/src/functional/hooks/use_effect.rs | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/yew/src/functional/hooks/use_effect.rs b/packages/yew/src/functional/hooks/use_effect.rs index a01cb2cf58f..5656b53e38f 100644 --- a/packages/yew/src/functional/hooks/use_effect.rs +++ b/packages/yew/src/functional/hooks/use_effect.rs @@ -2,11 +2,25 @@ use std::cell::RefCell; use crate::functional::{hook, Effect, Hook, HookContext}; +/// Trait describing the destructor of [`use_effect`] hook. +pub trait TearDown: Sized + 'static { + /// The function that is executed when destructor is called + fn tear_down(self) {} +} + +impl TearDown for () {} + +impl TearDown for F { + fn tear_down(self) { + self() + } +} + struct UseEffectBase where F: FnOnce(&T) -> D + 'static, T: 'static, - D: FnOnce() + 'static, + D: TearDown, { runner_with_deps: Option<(T, F)>, destructor: Option, @@ -18,7 +32,7 @@ impl Effect for RefCell> where F: FnOnce(&T) -> D + 'static, T: 'static, - D: FnOnce() + 'static, + D: TearDown, { fn rendered(&self) { let mut this = self.borrow_mut(); @@ -29,7 +43,7 @@ where } if let Some(de) = this.destructor.take() { - de(); + de.tear_down(); } let new_destructor = runner(&deps); @@ -44,11 +58,11 @@ impl Drop for UseEffectBase where F: FnOnce(&T) -> D + 'static, T: 'static, - D: FnOnce() + 'static, + D: TearDown, { fn drop(&mut self) { if let Some(destructor) = self.destructor.take() { - destructor() + destructor.tear_down() } } } @@ -60,13 +74,13 @@ fn use_effect_base( ) -> impl Hook where T: 'static, - D: FnOnce() + 'static, + D: TearDown, { struct HookProvider where F: FnOnce(&T) -> D + 'static, T: 'static, - D: FnOnce() + 'static, + D: TearDown, { runner: F, deps: T, @@ -77,7 +91,7 @@ where where F: FnOnce(&T) -> D + 'static, T: 'static, - D: FnOnce() + 'static, + D: TearDown, { type Output = (); @@ -145,7 +159,7 @@ where pub fn use_effect(f: F) where F: FnOnce() -> D + 'static, - D: FnOnce() + 'static, + D: TearDown, { use_effect_base(|_| f(), (), |_, _| true); } @@ -237,7 +251,7 @@ pub fn use_effect_with_deps(f: F, deps: T) where T: PartialEq + 'static, F: FnOnce(&T) -> D + 'static, - D: FnOnce() + 'static, + D: TearDown, { use_effect_base(f, deps, |lhs, rhs| lhs != rhs) } From bd2bfe4b89d87e8c429e317fa479ac7d2e21f227 Mon Sep 17 00:00:00 2001 From: Muhammad Hamza Date: Sun, 28 Aug 2022 17:41:21 +0500 Subject: [PATCH 2/3] Docs --- packages/yew/src/functional/hooks/use_effect.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/yew/src/functional/hooks/use_effect.rs b/packages/yew/src/functional/hooks/use_effect.rs index 5656b53e38f..8afc6a29f67 100644 --- a/packages/yew/src/functional/hooks/use_effect.rs +++ b/packages/yew/src/functional/hooks/use_effect.rs @@ -155,6 +155,15 @@ where /// } /// } /// ``` +/// +/// # Destructor +/// +/// Any type implementing [`TearDown`] can be used as destructor, which is called when the component +/// is re-rendered +/// +/// ## Tip +/// +/// The callback can return [`()`] if there is no destructor to run. #[hook] pub fn use_effect(f: F) where @@ -190,7 +199,6 @@ where /// use_effect_with_deps( /// move |_| { /// log!(" Is loading prop changed!"); -/// || () /// }, /// is_loading, /// ); @@ -215,7 +223,6 @@ where /// use_effect_with_deps( /// move |_| { /// log!("I got rendered, yay!"); -/// || () /// }, /// (), /// ); @@ -246,6 +253,12 @@ where /// html! { "Hello" } /// } /// ``` +/// +/// Any type implementing [`TearDown`] can be used as destructor +/// +/// ### Tip +/// +/// The callback can return [`()`] if there is no destructor to run. #[hook] pub fn use_effect_with_deps(f: F, deps: T) where From f9fddc35debb5659d5cc3ad9f620504ffbd211d8 Mon Sep 17 00:00:00 2001 From: Muhammad Hamza Date: Sun, 28 Aug 2022 19:25:47 +0500 Subject: [PATCH 3/3] no default tear_down --- packages/yew/src/functional/hooks/use_effect.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/yew/src/functional/hooks/use_effect.rs b/packages/yew/src/functional/hooks/use_effect.rs index 8afc6a29f67..16752ef5c8d 100644 --- a/packages/yew/src/functional/hooks/use_effect.rs +++ b/packages/yew/src/functional/hooks/use_effect.rs @@ -5,10 +5,12 @@ use crate::functional::{hook, Effect, Hook, HookContext}; /// Trait describing the destructor of [`use_effect`] hook. pub trait TearDown: Sized + 'static { /// The function that is executed when destructor is called - fn tear_down(self) {} + fn tear_down(self); } -impl TearDown for () {} +impl TearDown for () { + fn tear_down(self) {} +} impl TearDown for F { fn tear_down(self) {