Skip to content

Commit b07544b

Browse files
authored
Fixed Router renders component twice (#47880)
* fix Router renders component twice
1 parent 69e3a5d commit b07544b

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/Components/Components/src/Routing/Router.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,10 @@ public async Task SetParametersAsync(ParameterView parameters)
136136
_onNavigateCalled = true;
137137
await RunOnNavigateAsync(NavigationManager.ToBaseRelativePath(_locationAbsolute), isNavigationIntercepted: false);
138138
}
139-
140-
Refresh(isNavigationIntercepted: false);
139+
else
140+
{
141+
Refresh(isNavigationIntercepted: false);
142+
}
141143
}
142144

143145
/// <inheritdoc />

src/Components/Components/test/Routing/RouterTest.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,31 @@ await _renderer.Dispatcher.InvokeAsync(() =>
199199
Assert.Equal($"Rendering route matching {typeof(MultiSegmentRouteComponent)}", renderedFrame.TextContent);
200200
}
201201

202+
[Fact]
203+
public async Task SetParametersAsyncRefreshesOnce()
204+
{
205+
//Arrange
206+
var parameters = new Dictionary<string, object>
207+
{
208+
{ nameof(Router.AppAssembly), typeof(RouterTest).Assembly },
209+
{ nameof(Router.NotFound), (RenderFragment)(builder => { }) },
210+
};
211+
212+
var refreshCalled = 0;
213+
_renderer.OnUpdateDisplay = (renderBatch) =>
214+
{
215+
refreshCalled += 1;
216+
return;
217+
};
218+
219+
// Act
220+
await _renderer.Dispatcher.InvokeAsync(() =>
221+
_router.SetParametersAsync(ParameterView.FromDictionary(parameters)));
222+
223+
//Assert
224+
Assert.Equal(1, refreshCalled);
225+
}
226+
202227
internal class TestNavigationManager : NavigationManager
203228
{
204229
public TestNavigationManager() =>

0 commit comments

Comments
 (0)