From a58e0f4e3b9b906ee9bf1d4db7e33e5173bf8328 Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 1 Jun 2026 16:48:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Footer=20=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=BB=9A=E5=8A=A8=E7=9B=91=E5=90=AC=E5=99=A8=E6=9C=AA?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E6=B8=85=E7=90=86=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/footer.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/components/footer.rs b/src/components/footer.rs index cf19de8..f3442f3 100644 --- a/src/components/footer.rs +++ b/src/components/footer.rs @@ -1,10 +1,25 @@ use dioxus::prelude::*; +use std::cell::RefCell; +use std::rc::Rc; #[component] #[allow(unused_mut)] pub fn Footer() -> Element { let mut visible = use_signal(|| false); + #[cfg(target_arch = "wasm32")] + let listener_state = use_hook(|| { + Rc::new(RefCell::new( + None::<(wasm_bindgen::prelude::Closure, web_sys::Window)>, + )) + }); + + #[cfg(not(target_arch = "wasm32"))] + let _listener_state = use_hook(|| Rc::new(RefCell::new(None::<()>))); + + #[cfg(target_arch = "wasm32")] + let listener_state_for_effect = listener_state.clone(); + use_effect(move || { #[cfg(target_arch = "wasm32")] { @@ -36,11 +51,21 @@ pub fn Footer() -> Element { let scroll_y = window.scroll_y().unwrap_or(0.0); visible.set(scroll_y > threshold); - closure.forget(); + *listener_state_for_effect.borrow_mut() = Some((closure, window)); } } }); + #[cfg(target_arch = "wasm32")] + use_drop(move || { + if let Some((closure, window)) = listener_state.borrow_mut().take() { + let _ = window.remove_event_listener_with_callback( + "scroll", + wasm_bindgen::JsCast::unchecked_ref(closure.as_ref()), + ); + } + }); + let link_class = use_memo(move || { let base = "p-2 rounded-full cursor-pointer hover:opacity-80 transition-all duration-300 text-gray-600 dark:text-gray-300"; if visible() {