原文鏈接:https://blazor-university.com/routing/detecting-navigation-events/
檢測導航事件
源代碼[1]
從 Blazor 訪問瀏覽器導航是通過 NavigationManager
服務提供的。這可以使用 razor 文件中的 @inject
或 CS 文件中的 [Inject]
屬性注入到 Blazor 組件中。
LocationChanged 事件
LocationChanged
是在瀏覽器中的 URL 發生更改時觸發的事件。它傳遞一個 LocationChangedEventArgs
實例,該實例提供以下信息:
public?readonly?struct?LocationChangedEventArgs
{public?string?Location?{?get;?}public?bool?IsNavigationIntercepted?{?get;?}
}
Location
屬性是顯示在瀏覽器中的完整 URL,包括協議、路徑和任何查詢字符串。
IsNavigationIntercepted
指示導航是通過代碼還是通過 HTML 導航啟動的。
false
導航由從代碼調用的
NavigationManager.NavigateTo
啟動。true
用戶單擊 HTML 導航元素(例如
a href
),Blazor 攔截導航,而不是允許瀏覽器實際導航到新 URL,這將導致向服務器發出請求。在其他情況下也是如此,例如頁面上的某些 JavaScript 導致導航(例如,在超時之后)。最終,任何不是通過NavigationManager.NavigateTo
發起的導航事件都將被視為攔截導航,并且該值為true
。
請注意,目前無法攔截導航并阻止其繼續進行。
觀察 OnLocationChanged 事件
需要注意的是,NavigationManager
服務是一個長期存在的實例。因此,任何訂閱其 LocationChanged
事件的組件都將在服務的生命周期內被強引用。因此,重要的是我們的組件在它們被銷毀時也取消訂閱此事件,否則它們將不會被垃圾收集。
目前,ComponentBase
類在銷毀時沒有生命周期事件,但可以實現 IDisposable
接口。
@implement?IDisposable
@inject?NavigationManager?NavigationManagerprotected?override?void?OnInitialized()
{//?Subscribe?to?the?eventNavigationManager.LocationChanged?+=?LocationChanged;base.OnInitialized();
}void?LocationChanged(object?sender,?LocationChangedEventArgs?e)
{string?navigationMethod?=?e.IsNavigationIntercepted???"HTML"?:?"code";System.Diagnostics.Debug.WriteLine($"Notified?of?navigation?via?{navigationMethod}?to?{e.Location}");
}void?IDisposable.Dispose()
{//?Unsubscribe?from?the?event?when?our?component?is?disposedNavigationManager.LocationChanged?-=?LocationChanged;
}
參考資料
[1]
源代碼: https://github.com/mrpmorris/blazor-university/tree/master/src/Routing/NavigatingViaCode