diff --git a/packages/yew-macro/src/use_prepared_state.rs b/packages/yew-macro/src/use_prepared_state.rs index e860277a9f8..a65dab70099 100644 --- a/packages/yew-macro/src/use_prepared_state.rs +++ b/packages/yew-macro/src/use_prepared_state.rs @@ -61,6 +61,7 @@ impl PreparedState { // Async closure is not stable, so we rewrite it to closure + async block #[cfg(not(feature = "nightly"))] pub fn rewrite_to_closure_with_async_block(&self) -> ExprClosure { + use proc_macro2::Span; use syn::parse_quote; let async_token = match &self.closure.asyncness { @@ -68,7 +69,11 @@ impl PreparedState { None => return self.closure.clone(), }; - let move_token = &self.closure.capture; + // The async block always need to be move so input can be moved into it. + let move_token = self + .closure + .capture + .unwrap_or_else(|| Token![move](Span::call_site())); let body = &self.closure.body; let inner = parse_quote! { diff --git a/packages/yew/src/functional/hooks/use_prepared_state/feat_hydration_ssr.rs b/packages/yew/src/functional/hooks/use_prepared_state/feat_hydration_ssr.rs index 5e2d880a495..2ab10ac7e19 100644 --- a/packages/yew/src/functional/hooks/use_prepared_state/feat_hydration_ssr.rs +++ b/packages/yew/src/functional/hooks/use_prepared_state/feat_hydration_ssr.rs @@ -19,13 +19,13 @@ pub fn use_prepared_state( where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> T, + F: FnOnce(Rc) -> T, { struct HookProvider where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> T, + F: FnOnce(Rc) -> T, { deps: D, f: F, @@ -35,7 +35,7 @@ where where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> T, + F: FnOnce(Rc) -> T, { type Output = SuspensionResult>>; @@ -58,14 +58,14 @@ pub fn use_prepared_state_with_suspension( where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> U, + F: FnOnce(Rc) -> U, U: 'static + Future, { struct HookProvider where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> U, + F: FnOnce(Rc) -> U, U: 'static + Future, { deps: D, @@ -76,7 +76,7 @@ where where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> U, + F: FnOnce(Rc) -> U, U: 'static + Future, { type Output = SuspensionResult>>; diff --git a/packages/yew/src/functional/hooks/use_prepared_state/feat_ssr.rs b/packages/yew/src/functional/hooks/use_prepared_state/feat_ssr.rs index fab2331e0ae..4297cea931d 100644 --- a/packages/yew/src/functional/hooks/use_prepared_state/feat_ssr.rs +++ b/packages/yew/src/functional/hooks/use_prepared_state/feat_ssr.rs @@ -20,13 +20,13 @@ pub fn use_prepared_state( where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> T, + F: FnOnce(Rc) -> T, { struct HookProvider where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> T, + F: FnOnce(Rc) -> T, { deps: D, f: F, @@ -36,7 +36,7 @@ where where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> T, + F: FnOnce(Rc) -> T, { type Output = SuspensionResult>>; @@ -46,7 +46,7 @@ where let state = { let deps = deps.clone(); - use_memo(move |_| f(&deps), ()).run(ctx) + use_memo(move |_| f(deps), ()).run(ctx) }; let state = PreparedStateBase { @@ -75,14 +75,14 @@ pub fn use_prepared_state_with_suspension( where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> U, + F: FnOnce(Rc) -> U, U: 'static + Future, { struct HookProvider where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> U, + F: FnOnce(Rc) -> U, U: 'static + Future, { deps: D, @@ -93,7 +93,7 @@ where where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: FnOnce(&D) -> U, + F: FnOnce(Rc) -> U, U: 'static + Future, { type Output = SuspensionResult>>; @@ -112,7 +112,7 @@ where let deps = deps.clone(); let result = result.clone(); use_state(move || { - let state_f = f(&deps); + let state_f = f(deps.clone()); spawn_local(async move { let state = state_f.await; diff --git a/packages/yew/src/functional/hooks/use_prepared_state/mod.rs b/packages/yew/src/functional/hooks/use_prepared_state/mod.rs index 625ea0407ff..ad69308d890 100644 --- a/packages/yew/src/functional/hooks/use_prepared_state/mod.rs +++ b/packages/yew/src/functional/hooks/use_prepared_state/mod.rs @@ -43,7 +43,7 @@ pub use feat_ssr::*; /// where /// D: Serialize + DeserializeOwned + PartialEq + 'static, /// T: Serialize + DeserializeOwned + 'static, -/// F: FnOnce(&D) -> T, +/// F: FnOnce(Rc) -> T, /// # { todo!() } /// ``` /// @@ -69,7 +69,7 @@ pub use feat_ssr::*; /// where /// D: Serialize + DeserializeOwned + PartialEq + 'static, /// T: Serialize + DeserializeOwned + 'static, -/// F: FnOnce(&D) -> U, +/// F: FnOnce(Rc) -> U, /// U: 'static + Future, /// # { todo!() } /// ``` diff --git a/packages/yew/src/functional/hooks/use_transitive_state/feat_hydration_ssr.rs b/packages/yew/src/functional/hooks/use_transitive_state/feat_hydration_ssr.rs index 1fbf5d7a1a5..56d8c0a302f 100644 --- a/packages/yew/src/functional/hooks/use_transitive_state/feat_hydration_ssr.rs +++ b/packages/yew/src/functional/hooks/use_transitive_state/feat_hydration_ssr.rs @@ -18,13 +18,13 @@ pub fn use_transitive_state( where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { struct HookProvider where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { deps: D, f: F, @@ -34,7 +34,7 @@ where where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { type Output = SuspensionResult>>; diff --git a/packages/yew/src/functional/hooks/use_transitive_state/feat_ssr.rs b/packages/yew/src/functional/hooks/use_transitive_state/feat_ssr.rs index fdb35bef800..fc0304a2090 100644 --- a/packages/yew/src/functional/hooks/use_transitive_state/feat_ssr.rs +++ b/packages/yew/src/functional/hooks/use_transitive_state/feat_ssr.rs @@ -14,24 +14,24 @@ pub(super) struct TransitiveStateBase where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { pub state_fn: RefCell>, - pub deps: D, + pub deps: Rc, } impl PreparedState for TransitiveStateBase where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { fn prepare(&self) -> String { let f = self.state_fn.borrow_mut().take().unwrap(); - let state = f(&self.deps); + let state = f(self.deps.clone()); - let state = - bincode::serialize(&(Some(&state), Some(&self.deps))).expect("failed to prepare state"); + let state = bincode::serialize(&(Some(&state), Some(&*self.deps))) + .expect("failed to prepare state"); Base64::encode_string(&state) } @@ -45,13 +45,13 @@ pub fn use_transitive_state( where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { struct HookProvider where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { deps: D, f: F, @@ -61,7 +61,7 @@ where where D: Serialize + DeserializeOwned + PartialEq + 'static, T: Serialize + DeserializeOwned + 'static, - F: 'static + FnOnce(&D) -> T, + F: 'static + FnOnce(Rc) -> T, { type Output = SuspensionResult>>; @@ -71,7 +71,7 @@ where ctx.next_prepared_state(move |_re_render, _| -> TransitiveStateBase { TransitiveStateBase { state_fn: Some(f).into(), - deps: self.deps, + deps: self.deps.into(), } }); diff --git a/packages/yew/src/functional/hooks/use_transitive_state/mod.rs b/packages/yew/src/functional/hooks/use_transitive_state/mod.rs index 8dd0a09643c..893a175bd4f 100644 --- a/packages/yew/src/functional/hooks/use_transitive_state/mod.rs +++ b/packages/yew/src/functional/hooks/use_transitive_state/mod.rs @@ -43,7 +43,7 @@ pub use feat_ssr::*; /// where /// D: Serialize + DeserializeOwned + PartialEq + 'static, /// T: Serialize + DeserializeOwned + 'static, -/// F: 'static + FnOnce(&D) -> T, +/// F: 'static + FnOnce(Rc) -> T, /// # { todo!() } /// ``` ///