Blazor University (25)路由 —— 通過 HTML 導航

原文鏈接:https://blazor-university.com/routing/navigating-our-app-via-html/

通過 HTML 導航

源代碼[1]

鏈接到 Blazor 組件中的路由的最簡單方法是使用 HTML 超鏈接。

<a?href="/Counter">This?works?just?fine</a>

Blazor 組件中的超鏈接會被自動攔截。當用戶單擊超鏈接時,瀏覽器不會向服務器發送請求,而是 Blazor 將更新瀏覽器中的 URL 并呈現與新地址關聯的任何頁面。

使用 NavLink 組件

Blazor 還包括一個用于呈現超鏈接的組件,并額外支持在地址與 URL 匹配時更改 HTML 元素的 CSS 類。

如果我們查看默認 Blazor 應用程序中的 /Shared/NavMenu.razor 組件,我們將標記如下所示:

<NavLink?class="nav-link"?href="counter"><span class="oi?oi-home"?aria-hidden="true"></span>?Counter
</NavLink>

NavLink 組件使用 HTML 超鏈接裝飾其子內容。所有屬性,如 classhref 等,都通過屬性展開[2]直接呈現給 <a> 元素。NavLink 組件有兩個參數可以提供額外的行為。

ActiveClass 參數指定當瀏覽器的 URL 與 href 屬性的 URL 匹配時,將哪個 CSS 類應用于呈現的 <a> 元素。如果未指定,Blazor 將應用名為“active”的 CSS 類。

2d20990635d6fc61eb125d6ff6487a36.gif

URL 匹配

Match 參數標識瀏覽器的 URL 應如何與 href 進行比較,以確定是否應將 ActiveClass 添加到元素的類屬性中。

在新的 Blazor 應用中編輯 /Pages/Counter.razor 文件,以便可以從三個 URL 訪問它。

@page?"/counter"
@page?"/counter/1"
@page?"/counter/2"

然后編輯 /Shared/NavMenu.razor 組件,使 Counter 菜單項有兩個子菜單鏈接。

<li?class="nav-item?px-3"><NavLink?class="nav-link"?href="counter"?Match=@NavLinkMatch.All><span class="oi?oi-plus"?aria-hidden="true"></span>Counter</NavLink><ul?class="nav?flex-column"><li?class="nav-item?px-3"><NavLink?class="nav-link"?href="counter/1"?Match=@NavLinkMatch.All><span class="oi?oi-plus"?aria-hidden="true"></span>Counter/1</NavLink></li><li?class="nav-item?px-3"><NavLink?class="nav-link"?href="counter/2"?Match=@NavLinkMatch.All><span class="oi?oi-plus"?aria-hidden="true"></span>Counter/2</NavLink></li></ul>
</li>

同時編輯 /wwwroot/site.css 并添加以下內容,以便我們輕松查看哪些 NavLink 元素被認為是“活動的”。

.nav-item?a.active::after
{content:?"?*";margin-left:?1em;
}

三個 NavLink 組件導航到 /counter/counter/1/counter/2,如果我們運行應用程序并單擊各種鏈接,我們將看到以下內容。

a129d761ce48cf641486567d0ff0810d.gif

NavLinkMatch

NavLink 組件的 Match 參數接受 NavLinkMatch 類型的值。這告訴 NavLink 組件您希望瀏覽器的 URL 與它呈現的 <a> 元素的 href 屬性如何比較以確定它們是否相同。

在前面的示例中,我們為每個 NavLink 組件的 Match 參數指定了 NavLinkMatch.All。這意味著我們希望 Blazor 僅在其 href 與瀏覽器的 URL 完全匹配時才認為每個 NavLink 都是活動的。如果我們現在更改鏈接到 /counter 的 NavLink,使其匹配參數為 NavLinkMatch.Prefix,我們將看到只要 URL 以 /counter 開頭,它就會被視為匹配,因此它也會匹配 /counter/1/counter/2.

為了說明區別,請在 /Shared/NavMenu.razor 的代碼部分中聲明一個字段

NavLinkMatch?MatchMode?=?NavLinkMatch.All;

找到 <div class="@NavMenuCssClass"... 元素,并在 <ul> 元素之前添加以下標記以將 <select> 綁定到新字段。

<select?@bind=MatchMode?class="form-control"><option?value=@NavLinkMatch.All>All</option><option?value=@NavLinkMatch.Prefix>Prefix</option>
</select>

最后,找到其 href 鏈接到 /counter 的 NavLink,并將其 Match 參數更改為@MatchMode。您的標記現在應該看起來像這樣。

<div?class="top-row?pl-4?navbar?navbar-dark"><a?class="navbar-brand"?href="">NavigationViaHtml</a><button?class="navbar-toggler"?@onclick=ToggleNavMenu><span class="navbar-toggler-icon"></span></button>
</div><div?class="@NavMenuCssClass"?@onclick=ToggleNavMenu><select?@bind=MatchMode?class="form-control"><option?value=@NavLinkMatch.All>All</option><option?value=@NavLinkMatch.Prefix>Prefix</option></select><ul?class="nav?flex-column"><li?class="nav-item?px-3"><NavLink?class="nav-link"?href=""?Match=@NavLinkMatch.All><span class="oi?oi-home"?aria-hidden="true"></span>?Home</NavLink></li><li?class="nav-item?px-3"><NavLink?class="nav-link"?href="counter"?Match=@MatchMode><span class="oi?oi-plus"?aria-hidden="true"></span>Counter</NavLink><ul?class="nav?flex-column"><li?class="nav-item?px-3"><NavLink?class="nav-link"?href="counter/1"?Match=@NavLinkMatch.All><span class="oi?oi-plus"?aria-hidden="true"></span>Counter/1</NavLink></li><li?class="nav-item?px-3"><NavLink?class="nav-link"?href="counter/2"?Match=@NavLinkMatch.All><span class="oi?oi-plus"?aria-hidden="true"></span>Counter/2</NavLink></li></ul></li></ul>
</div>@code?{NavLinkMatch?MatchMode?=?NavLinkMatch.All;bool?collapseNavMenu?=?true;string?NavMenuCssClass?=>?collapseNavMenu???"collapse"?:?null;void?ToggleNavMenu(){collapseNavMenu?=?!collapseNavMenu;}
}

選擇 Counter/1Counter/2 鏈接后,切換 <select> 的值。

1b5e5f2e07ccfcc1c7b2cfbd045c9dec.gif

盡管瀏覽器 URL 保持不變,但我們可以看到第一個 Counter NavLink 根據其 Match 參數的設置在活動/非活動之間切換。

參考資料

[1]

源代碼: https://github.com/mrpmorris/blazor-university/tree/master/src/Routing/NavigatingViaHtml

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286784.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css3選擇器詳解

css3選擇器詳解css中除了早先最早的&#xff0c;ID選擇器&#xff0c;class選擇器一些以外在css3中新加入了新的選擇器&#xff0c;新選擇器的使用大大的方便了我們的編程&#xff0c;下面我就說一些css3的選擇器的使用方法&#xff0c; p 選擇了所有<p>元素的標簽…

OpenReports中文支持方案

此文章在《OpenReports中文支持完全解決方案.doc》的基礎上做優化&#xff0c;并貼出代碼。已測試通過。 一、主要解決的問題 1 頁面顯示支持中文 2 與服務器或數據庫的交互支持中文 3 查詢結果支持中文 4 導出文件名及內容支持中文 二、解決方案及方法 1 …

LeetCode之First Unique Character in a String

1、題目 Given a string, find the first non-repeating character in it and return its index. If it doesnt exist, return -1. Examples: s "leetcode" return 0.s "loveleetcode", return 2. 2、代碼實現 public class Solution {public int firstU…

七、功能性組件與事件邏輯(IVX 快速開發教程)

七、功能性組件與事件邏輯 由于 iVX 極度易用的特性&#xff0c;在 iVX 中開發微信小程序、WebApp、小游戲應用的開發流程大致相同。介紹完基礎可視化組件后通過后臺的服務、數據庫與事件結合即可完成一個應用的開發&#xff1b;此篇將會介紹 iVX 功能性組件與事件&#xff0c…

python assert的作用

一、python assert的作用&#xff1a; 根據Python 官方文檔解釋(https://docs.python.org/3/reference/simple_stmts.html#assert), "Assert statements are a convenient way to insert debugging assertions into a program". 二、一般的用法是&#xff1a; assert…

React-引領未來的用戶界面開發框架-讀書筆記(三)

第8章 DOM操作 多數情況下&#xff0c;React的虛擬DOM足以用來創建你想要的用戶體驗&#xff0c;而根本不需要直接操作底層真實的DOM。然而也有一些例外。最常見的場景包括&#xff1a;需要與一個沒有使用React的第三方類庫進行整合&#xff0c;或者執行一個React沒有原生支持的…

【專升本計算機】甘肅省普通高等學校專升本考試計算機全真模擬試卷(一)

甘肅省普通高等學校專升本考試計算機全真模擬試卷(一) 一、單項選擇題(在每小題給出的四個選項中只有一項是正確的,將正確選項的字母序號填在括號內。每小題1分,共60分。) 1.在Excel中,當單元格中出現#N/A時,表示( )。 A.公式中有Excel不能識別的文本 B.公式或函數…

WPF 基礎控件之 ToggleButton 樣式

其他基礎控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButtonToggleButton 實現下面的效果1&#xff09;ToggleButton來實現動畫&#xff1b;Border嵌套 Ellipse并設置T…

hdu-5781 ATM Mechine(dp+概率期望)

題目鏈接&#xff1a; ATM Mechine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem DescriptionAlice is going to take all her savings out of the ATM(Automatic Teller Machine). Alice forget how many deposit she has, …

Android之讓手機能識別當前app為瀏覽器類型的APP

1 、問題 我們設置手機默認瀏覽器的時候&#xff0c;我們一般在“設置”頁面&#xff0c;點擊"默認應用管理“&#xff0c;然后再點擊瀏覽器&#xff0c;發現里面沒有當前的app,但是會有一些QQ瀏覽器(前提手機安裝了)或者其它瀏覽器&#xff0c;我們怎么讓系統能識別自己…

反射調用 java bean的set和get方法

v一、使用java.beans.PropertyDescriptor import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class PropertyUtil {private static final String SET_PREFIX "…

八、后臺與數據庫(IVX 快速開發教程)

八、后臺與數據庫 在 iVX 中 數據庫 作為數據存儲倉庫&#xff0c;通過 數據庫 可以永久性存儲存儲數據&#xff0c;而 后臺服務 起到數據傳輸作用&#xff0c;將 數據庫 的數據傳輸到前臺頁面之中&#xff0c;頁面再使用這些數據。 文章目錄八、后臺與數據庫8.1.1 數據庫添加…

React-引領未來的用戶界面開發框架-讀書筆記(四)

第10章 動畫 動畫可以讓用戶體驗變得更加流暢自然&#xff0c;而React的TransitionGroup插件配合CSS3可以讓我們在項目中整合動畫效果的變得易如反掌。 通常情況下&#xff0c;瀏覽器中的動畫都擁有一套極其命令式的API&#xff0c;你需要選擇一個元素并主動移動它或者改變它的…

Android Studio開發環境搭建準備

Android Studio 是一個Android開發環境&#xff0c;基于IntelliJ IDEA. 類似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 開發工具用于開發和調試。 Android Studio開發環境搭建前&#xff0c;我們需要進行安裝前的準備工作&#xff0c;本篇以在Windows 7平臺…

管理中眼鏡蛇效應

這個世界的事物經常會很奇怪。當你做了一個出發點很好的決定后&#xff0c;結果未必是向你預期的方向發展&#xff0c;甚至適得其反。作為企業/組織/團隊的管理者&#xff0c;經常會在實際管理中&#xff0c;制定了錯誤的績效激勵辦法&#xff0c;使得整體活動走向與初始激勵目…

九、二手信息站點后臺完成 (IVX 快速開發教程)

九、二手信息站點后臺完成 了解完后臺實現后&#xff0c;我們開始為該二手商品站點完成完成后臺制作。 文章目錄九、二手信息站點后臺完成9.1.1 完成二手信息站點注冊功能9.1.2 完成二手信息站點登錄功能9.1.3 完成商品發布功能9.1.4 首頁信息獲取9.1.5 詳情頁內容9.1.1 完成二…

Android之自定義帶圓角的水紋波效果

1 需求 自定義帶圓角的水溫波效果 2 代碼實現 bg_navigation_ripple.xml <?xml version"1.0" encoding"utf-8"?> <ripple xmlns:android"http://schemas.android.com/apk/res/android"android:color"color/c3"><i…

爬蟲是什么?起什么作用?

【爬蟲】 如果把互聯網比作一張大的蜘蛛網&#xff0c;數據便是放于蜘蛛網的各個節點&#xff0c;而爬蟲就是一只小蜘蛛&#xff0c;沿著網絡抓取自己得獵物&#xff08;數據&#xff09;。這種解釋可能更容易理解&#xff0c;官網的&#xff0c;就是下面這個。 爬蟲是一種自動…

根據實例類型反射操作數據庫(簡單通用表操作類)

這個類適用簡單的表 1.有且只有id為主鍵&#xff0c; 2.并且實例類主鍵&#xff0c;也就是id應為字段&#xff0c;其他為屬性 3.實例類名跟表名一樣&#xff0c;字段屬性跟列名一樣 public class ProType{public int id;public string type{get;set;}public int array{get;set;…