diff --git a/packages/yew/src/functional/hooks/use_reducer.rs b/packages/yew/src/functional/hooks/use_reducer.rs index 7b01dce76cd..63c69e1a5d6 100644 --- a/packages/yew/src/functional/hooks/use_reducer.rs +++ b/packages/yew/src/functional/hooks/use_reducer.rs @@ -5,6 +5,8 @@ use std::ops::Deref; use std::rc::Rc; use crate::functional::{hook, Hook, HookContext}; +use crate::html::IntoPropValue; +use crate::Callback; type DispatchFn = Rc::Action)>; @@ -133,6 +135,24 @@ where } } +impl From> for Callback<::Action> +where + T: Reducible, +{ + fn from(val: UseReducerDispatcher) -> Self { + Callback { cb: val.dispatch } + } +} + +impl IntoPropValue::Action>> for UseReducerDispatcher +where + T: Reducible, +{ + fn into_prop_value(self) -> Callback<::Action> { + Callback { cb: self.dispatch } + } +} + impl UseReducerDispatcher where T: Reducible, @@ -141,6 +161,14 @@ where pub fn dispatch(&self, value: T::Action) { (self.dispatch)(value) } + + /// Get a callback, invoking which is equivalent to calling `dispatch()` + /// on this same dispatcher. + pub fn to_callback(&self) -> Callback<::Action> { + Callback { + cb: self.dispatch.clone(), + } + } } /// The base function of [`use_reducer`] and [`use_reducer_eq`] diff --git a/packages/yew/src/functional/hooks/use_state.rs b/packages/yew/src/functional/hooks/use_state.rs index dc68aedc793..055285a0582 100644 --- a/packages/yew/src/functional/hooks/use_state.rs +++ b/packages/yew/src/functional/hooks/use_state.rs @@ -4,6 +4,8 @@ use std::rc::Rc; use super::{use_reducer, use_reducer_eq, Reducible, UseReducerDispatcher, UseReducerHandle}; use crate::functional::hook; +use crate::html::IntoPropValue; +use crate::Callback; struct UseStateReducer { value: T, @@ -171,6 +173,18 @@ where } } +impl From> for Callback { + fn from(value: UseStateSetter) -> Self { + Self::from(value.inner) + } +} + +impl IntoPropValue> for UseStateSetter { + fn into_prop_value(self) -> Callback { + self.inner.into_prop_value() + } +} + impl PartialEq for UseStateSetter { fn eq(&self, rhs: &Self) -> bool { self.inner == rhs.inner @@ -182,4 +196,10 @@ impl UseStateSetter { pub fn set(&self, value: T) { self.inner.dispatch(value) } + + /// Get a callback, invoking which is equivalent to calling `set()` + /// on this same setter. + pub fn to_callback(&self) -> Callback { + self.inner.to_callback() + } }