diff --git a/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/en-US.md b/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/en-US.md index a9746b6544..db0d24f8f7 100644 --- a/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/en-US.md +++ b/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/en-US.md @@ -35,15 +35,17 @@ related: Used to control the navigation of the page stack. -| Method name | Description | -|----------------|-----------------------------------------------------------------| -| `Push` | Push a new page onto the stack. | -| `Pop` | Pop the current page from the stack, equivalent to `GoBack(1)`. | -| `GoBack` | Return to the specified number of pages. | -| `GoBackToPage` | Return to the specified page. | -| `Replace` | Replace the current page. | -| `Clear` | Clear the current page stack. | -| `GoBackToTab` | Clear the current stack and jump to the specified tab. | +| Method name | Description | +|--------------------------|--------------------------------------------------------------------------| +| `Push` | Push a new page onto the stack. | +| `Pop` | Pop the current page from the stack, equivalent to `GoBack(1)`. | +| `GoBack` | Return to the specified number of pages. | +| `GoBackAndReplace` | Return to the specified number of pages, and the invoke `Replace` method.| +| `GoBackToPage` | Return to the specified page. | +| `GoBackToPageAndReplace` | Return to the specified page, and then invoke `Replace` method. | +| `Replace` | Replace the current page. | +| `Clear` | Clear the current page stack. | +| `GoBackToTab` | Clear the current stack and jump to the specified tab. | ```razor @inject PageStackNavController NavController diff --git a/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/zh-CN.md b/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/zh-CN.md index f0b7c783b7..d62afc159c 100644 --- a/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/zh-CN.md +++ b/docs/Masa.Blazor.Docs/wwwroot/pages/labs/page-stack/zh-CN.md @@ -34,15 +34,17 @@ related: 用于控制页面堆栈的导航。 -| 方法名 | 说明 | -|-----------|----------------------------| -| `Push` | 将新页面推入堆栈。 | -| `Pop` | 将当前页面弹出堆栈,同等于 `GoBack(1)`。 | -| `GoBack` | 返回到指定的前几个页面。 | -| `GoBackToPage` | 返回到指定页面。 | -| `Replace` | 替换当前页面。 | -| `Clear` | 清空当前页面堆栈。 | -| `GoBackToTab` | 清空当前堆栈并跳转到指定选项卡。 | +| 方法名 | 说明 | +|--------------------------|--------------------------------------------------------------------------| +| `Push` | 将新页面推入堆栈。 | +| `Pop` | 将当前页面弹出堆栈,同等于 `GoBack(1)`。 | +| `GoBack` | 返回到指定的前第几个页面。 | +| `GoBackAndReplace` | 返回到指定的前第几个页面后调用`Replace`方法。 | +| `GoBackToPage` | 返回到指定页面。 | +| `GoBackToPageAndRepalce` | 返回到指定页面后调用`Replace`方法。 | +| `Replace` | 替换当前页面。 | +| `Clear` | 清空当前页面堆栈。 | +| `GoBackToTab` | 清空当前堆栈并跳转到指定选项卡。 | ```razor @inject PageStackNavController NavController diff --git a/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavController.cs b/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavController.cs index ccd8ea5878..2f920511e9 100644 --- a/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavController.cs +++ b/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavController.cs @@ -2,7 +2,7 @@ namespace Masa.Blazor.Presets; -public class PageStackNavController(IJSRuntime jsRuntime) +public class PageStackNavController() { /// /// Records the timestamp of the last action, shared by all actions. @@ -64,17 +64,25 @@ public void Pop(object? state = null) /// /// public void GoBack(int delta = 1, object? state = null) + { + GoBackAndReplace(delta, null, state); + } + + /// + /// Go back to specified number of steps in the page stack, + /// and then invoke the method. + /// + /// + /// + /// + public void GoBackAndReplace(int delta, string? replaceUri, object? state = null) { if (delta < 1) { throw new ArgumentOutOfRangeException(nameof(delta), "The delta must be greater than or equal to 1."); } - ExecuteIfTimeElapsed(() => - { - StackPop?.Invoke(this, new PageStackPopEventArgs(delta, state)); - _ = jsRuntime.InvokeVoidAsync(JsInteropConstants.HistoryGo, -delta); - }); + ExecuteIfTimeElapsed(() => StackPop?.Invoke(this, new PageStackPopEventArgs(delta, replaceUri, state))); } /// @@ -94,7 +102,7 @@ public void GoBackToPage(string absolutePath, object? state = null) /// /// /// - public void GoBackToPage(string absolutePath, string replaceUri, object? state = null) + public void GoBackToPageAndReplace(string absolutePath, string replaceUri, object? state = null) { ExecuteIfTimeElapsed(() => StackGoBackTo?.Invoke(this, new PageStackGoBackToPageEventArgs(absolutePath, state, replaceUri))); } @@ -106,7 +114,7 @@ public void GoBackToPage(string absolutePath, string replaceUri, object? state = /// public void Replace(string relativeUri, object? state = null) { - ExecuteIfTimeElapsed(() => StackReplace?.Invoke(this, new PageStackReplaceEventArgs(relativeUri, state))); + StackReplace?.Invoke(this, new PageStackReplaceEventArgs(relativeUri, state)); } /// diff --git a/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavControllerFactory.cs b/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavControllerFactory.cs index 0f0945d05d..e77269f67f 100644 --- a/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavControllerFactory.cs +++ b/src/Masa.Blazor/Presets/PageStack/NavController/PageStackNavControllerFactory.cs @@ -4,19 +4,8 @@ namespace Masa.Blazor.Presets.PageStack.NavController; public class PageStackNavControllerFactory : IPageStackNavControllerFactory { - private readonly IJSRuntime _jsRuntime; - - internal readonly ConcurrentDictionary> _managers = new(); - - public PageStackNavControllerFactory(IJSRuntime jsRuntime) - { - _jsRuntime = jsRuntime; - } + private readonly ConcurrentDictionary> _managers = new(); public PageStackNavController Create(string name) - { - return _managers.GetOrAdd(name, - _ => new Lazy(() => new PageStackNavController(_jsRuntime))) - .Value; - } + => _managers.GetOrAdd(name, _ => new Lazy(() => new PageStackNavController())).Value; } \ No newline at end of file diff --git a/src/Masa.Blazor/Presets/PageStack/NavController/PageStackPopEventArgs.cs b/src/Masa.Blazor/Presets/PageStack/NavController/PageStackPopEventArgs.cs index 4e4eebe267..bdad49d609 100644 --- a/src/Masa.Blazor/Presets/PageStack/NavController/PageStackPopEventArgs.cs +++ b/src/Masa.Blazor/Presets/PageStack/NavController/PageStackPopEventArgs.cs @@ -2,7 +2,7 @@ namespace Masa.Blazor.Presets.PageStack.NavController; public class PageStackPopEventArgs : EventArgs { - public PageStackPopEventArgs(int delta, object? state = null) + public PageStackPopEventArgs(int delta, string? replaceUri = null, object? state = null) { if (delta < 1) { @@ -10,10 +10,13 @@ public PageStackPopEventArgs(int delta, object? state = null) } Delta = delta; + ReplaceUri = replaceUri; State = state; } public int Delta { get; } + public string? ReplaceUri { get; } + public object? State { get; } } \ No newline at end of file diff --git a/src/Masa.Blazor/Presets/PageStack/PPageStack.razor.cs b/src/Masa.Blazor/Presets/PageStack/PPageStack.razor.cs index d7ee11fec0..df80d0e123 100644 --- a/src/Masa.Blazor/Presets/PageStack/PPageStack.razor.cs +++ b/src/Masa.Blazor/Presets/PageStack/PPageStack.razor.cs @@ -1,6 +1,7 @@ using Masa.Blazor.Presets.PageStack; using Masa.Blazor.Presets.PageStack.NavController; using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; namespace Masa.Blazor.Presets; @@ -148,11 +149,18 @@ private void InternalReplaceHandler(string relativeUri, object? state) NavigationManager.Replace(relativeUri); } - private void InternalPageStackNavManagerOnStackPop(object? sender, PageStackPopEventArgs e) + private async void InternalPageStackNavManagerOnStackPop(object? sender, PageStackPopEventArgs e) { _popstateByUserAction = true; CloseTopPages(e.Delta, e.State); + await Js.InvokeVoidAsync(JsInteropConstants.HistoryGo, -e.Delta); + + if (!string.IsNullOrWhiteSpace(e.ReplaceUri)) + { + await Task.Delay(DelayForPageClosingAnimation); + InternalReplaceHandler(e.ReplaceUri, e.State); + } } private void InternalStackStackNavManagerOnStackPush(object? sender, PageStackPushEventArgs e) @@ -194,7 +202,7 @@ private async void InternalPageStackNavManagerOnStackGoBackTo(object? sender, Pa CloseTopPages(delta, e.State); - if (e.ReplaceUri is not null) + if (!string.IsNullOrWhiteSpace(e.ReplaceUri)) { await Task.Delay(DelayForPageClosingAnimation); InternalReplaceHandler(e.ReplaceUri, e.State);