From 98de423d9926ada35addb58a97e26b9acb838f91 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Tue, 1 Aug 2023 10:16:19 -0700 Subject: [PATCH] deduplicate route history --- packages/router/src/history/memory.rs | 4 ++++ packages/router/src/history/web.rs | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/packages/router/src/history/memory.rs b/packages/router/src/history/memory.rs index 07c1f4379..ba511bb97 100644 --- a/packages/router/src/history/memory.rs +++ b/packages/router/src/history/memory.rs @@ -88,6 +88,10 @@ impl HistoryProvider for MemoryHistory { } fn push(&mut self, new: R) { + // don't push the same route twice + if self.current.to_string() == new.to_string() { + return; + } let old = std::mem::replace(&mut self.current, new); self.history.push(old); self.future.clear(); diff --git a/packages/router/src/history/web.rs b/packages/router/src/history/web.rs index f7bd59dfa..e5589106f 100644 --- a/packages/router/src/history/web.rs +++ b/packages/router/src/history/web.rs @@ -1,6 +1,7 @@ use std::sync::{Arc, Mutex}; use gloo::{console::error, events::EventListener, render::AnimationFrame}; + use wasm_bindgen::JsValue; use web_sys::{window, History, ScrollRestoration, Window}; @@ -296,6 +297,11 @@ where } fn push(&mut self, state: R) { + use gloo_utils::format::JsValueSerdeExt; + if JsValue::from_serde(&state) != JsValue::from_serde(&self.current_route()) { + // don't push the same state twice + return; + } let path = self.full_path(&state); let state = self.create_state(state); @@ -362,6 +368,10 @@ where } fn push(&mut self, state: R) { + if state.to_string() == self.current_route().to_string() { + // don't push the same state twice + return; + } let path = self.full_path(&state); let state: [f64; 2] = self.create_state(state);