Blazor University (18)使用 RenderFragments 模板化組件 —— 創建 TabControl

原文鏈接:https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/

創建一個 TabControl 組件

源代碼[1]

接下來我們將創建一個 TabControl 組件。這將教您如何實現以下目標:

  1. 將數據傳遞到 RenderFragment 以為其提供上下文。

  2. 使用 CascadingParameter 將父 TabControl 組件傳遞到其子 TabPage 組件。

6b89ecb40245099f2baa52c9de7bdabf.gif

使 TabPage 知道其父級

第一步是創建兩個組件。一個命名為 TabControl,另一個命名為 TabPageTabPage 組件將需要對其父 TabControl 的引用,這將通過 TabControl 將自身設置為 CascadingValue 中的值來實現,并且 TabPage 將通過 CascadingParameter 獲取該值。

<div>This?is?a?TabControl</div>
<CascadingValue?Value="this">@ChildContent
</CascadingValue>@code?{//?Next?line?is?needed?so?we?are?able?to?add?<TabPage>?components?inside[Parameter]public?RenderFragment?ChildContent?{?get;?set;?}
}
<div>This?is?a?TabPage</div>
@ChildContent@code?{[CascadingParameter]private?TabControl?Parent?{?get;?set;?}[Parameter]public?RenderFragment?ChildContent?{?get;?set;?}protected?override?void?OnInitialized(){if?(Parent?==?null)throw?new?ArgumentNullException(nameof(Parent),?"TabPage?must?exist?within?a?TabControl");base.OnInitialized();}
}

使 TabControl 知道其所屬頁面

更改 TabPage 組件,以便通過在其 OnInitialized 方法的末尾添加以下行來通知其父級它的存在。

Parent.AddPage(this);

更改 TabControl 組件以添加 AddPage 方法并存儲引用。另外,讓我們添加一個 ActivePage 屬性。

public?TabPage?ActivePage?{?get;?set;?}
List<TabPage>?Pages?=?new?List<TabPage>();internal?void?AddPage(TabPage?tabPage)
{Pages.Add(tabPage);if?(Pages.Count?==?1)ActivePage?=?tabPage;StateHasChanged();
}

為每個 TabPage 呈現一個選項卡

TabPage 組件添加一個 Text 參數,以便其父 TabControl 知道要在激活每個頁面的按鈕內顯示什么文本。

[Parameter]
public?string?Text?{?get;?set;?}

然后將以下標記添加到 TabControl(就在呈現 ChildContent 的位置上方),這將呈現選項卡,并在單擊選項卡時更改選擇哪個 TabPage

<div?class="btn-group"?role="group">@foreach?(TabPage?tabPage?in?Pages){<button?type="button"class="btn?@GetButtonClass(tabPage)"@onclick=@(?()?=>?ActivatePage(tabPage)?)>@tabPage.Text</button>}
</div>

標記將創建一個標準的 Bootstrap 按鈕組,然后為每個 TabPage 創建一個具有以下顯著特征的按鈕:

  1. CSS 類設置為“btn”,由 GetButtonClass 方法返回附加內容。如果選項卡是 ActivePage,這將是“btn-primary”,如果不是,則為“btn-secondary”。

  2. 單擊按鈕時,它將激活為其創建按鈕的頁面。

注意: @onclick 需要一個無參數的方法,所以在 @() 中使用了一個 lambda 表達式來使用正確的 TabPage 執行 ActivatePage

  1. 按鈕的文本設置為 TabPageText 屬性的值。

并將以下內容添加到 TabControl 的代碼部分。

string?GetButtonClass(TabPage?page)
{return?page?==?ActivePage???"btn-primary"?:?"btn-secondary";
}void?ActivatePage(TabPage?page)
{ActivePage?=?page;
}

使用選項卡控件

將以下標記添加到頁面并運行應用程序。

<TabControl><TabPage?Text="Tab?1"><h1>The?first?tab</h1></TabPage><TabPage?Text="Tab?2"><h1>The?second?tab</h1></TabPage><TabPage?Text="Tab?3"><h1>The?third?tab</h1></TabPage>
</TabControl>

僅顯示活動頁面

此時 TabControl 將顯示所有 TabPages。要解決此問題,只需更改 TabPage 中的標記,使其僅在它是其父 TabControlActivePage 時才呈現其 ChildContent

@if?(Parent.ActivePage?==?this)
{@ChildContent
}

參考資料

[1]

源代碼: https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/

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

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

相關文章

Java之GC機制

1 JVM基本結構 1&#xff09;類加載器classLoader&#xff1a;在JVM啟動時或者類運行時將需要的.class文件加載到內存中 2&#xff09;內存區域&#xff08;運行時數據區&#xff09;&#xff1a; 是在JVM運行的時候操作所分配的內存區 3&#xff09;執行引擎&#xff1a;負…

ArcGIS實驗教程——實驗十八:疊置分析(Overlay Analysis)

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據) 目 錄 一、實驗描述 二、實驗內容 三、實驗目的 四、實驗數據

《零基礎看得懂的C語言入門教程 》——(一)脫離學習誤區

本節視頻連接&#xff1a; https://www.bilibili.com/video/BV1Qv411t7ae 新手C語言學習有些誤區你應該知道&#xff0c;這樣學習起來事半功倍~一、前言 距離上一次編寫C語言的教程是5年前了&#xff08;2015年&#xff09;&#xff0c;由于自己是從初一時開始學習編程&#…

一套完整的導視設計案例_色彩導視藝術:烏克蘭基輔語言學校導視設計案例

學校導視設計案例建筑師Emil Dervish為烏克蘭基輔Underhub語言學校設計了色彩繽紛的導視系統&#xff0c;該設計靈感來源于倫敦地鐵&#xff0c;他希望通過彩色線條的大膽應用來營造輕松而歡樂的氛圍。讓我們一起來看看這座由“彩虹”做導視的學校。彩虹導視設計跟著紅色導視線…

C# 創建匿名管道

下面對匿名管道執行類似的操作。通過匿名管道&#xff0c;創建兩個彼此通信的任務。為了給管道的創建發出信號&#xff0c;使用 ManualResetEventSlim 對象&#xff0c;與內存映射文件一樣。在 Program 類的 Run 方法中&#xff0c;創建兩個任務&#xff0c;調用 Reader 和 Wri…

內測投票

create table DiaoYanTiMu &#xff08;  Ids int(10) auto_increment not null primary key(),//把所需要的都寫上中間不需要符號隔開&#xff0c;設自增長列類型必須是int&#xff0c;主鍵的話必須不能為空not null&#xff0c; Title varchar(50) not null &#xff09;;/…

Android之通過Binder機制實現IPC和linux的傳統IPC的對比分析

一、 Android的Binder機制實現IPC 這里bind機制實現實現IPC模型這里不具體分析,簡單理解就是clint-server模型 涉及到4個模塊client、server、serverManager、bind底層驅動。 serverManager的作用是將字符形式的Binder(Server創建了Binder實體)名字轉化成Client中對該Bin…

Mysql 查詢統計練習

2019獨角獸企業重金招聘Python工程師標準>>> 1、建表 customers 顧客表 products 產品表 orders 訂單表 -- 顧客表 CREATE TABLE customers (c_id INT NOT NULL AUTO_INCREMENT,lastname VARCHAR(255),firstname VARCHAR(255),address VARCHAR(255),birthday DATETI…

【經典回放】多種語言系列數據結構算法:堆排序

目錄 一、堆排序算法分析 二、C#語言實現堆排序 三、C語言實現堆排序 一、堆排序算法分析

C++11模版元編程的應用

1.概述 關于C11模板元的基本用法和常用技巧&#xff0c;我在程序員2015年2月B《C11模版元編程》一文&#xff08;后稱前文&#xff09;中已經做了詳細地介紹&#xff0c;那么C11模版元編程用來解決什么實際問題呢&#xff0c;在實際工程中又該如何應用呢&#xff1f;本文將側重…

《零基礎看得懂的C語言入門教程 》——(二)C語言沒那么難簡單開發帶你了解流程

一、學習目標 了解DevC集成開發環境了解集成開發環境了解HelloWorld程序了解HelloWorld程序的編寫方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1…

11選5下期算法_本周六周日【高二直播】輔導網課預告:通用技術電控二三極管、多用電表測量、數字邏輯電路、解析枚舉遞歸算法,2022浙江選考技術...

01第19-21講 2020年11月28日29日開課目錄鯨學名師考點精講系統提高高二共3階段精品課夯實基礎沖刺技術選考97-100分&#xff01;11月28日【高二|提高|直播】高二精品直播課講授&#xff1a;浙江選考技術科目第19講 高二綜合提高鯨學名師講授高中通用技術&#xff1a;第19講 電控…

十分鐘完成Bash 腳本進階!列舉Bash經典用法及其案例

前言&#xff1a;在linux中&#xff0c;Bash腳本是很基礎的知識&#xff0c;大家可能一聽腳本感覺很高大上&#xff0c;像小編當初剛開始學一樣&#xff0c;感覺會寫腳本的都是大神。雖然復雜的腳本是很燒腦&#xff0c;但是&#xff0c;當我們熟練的掌握了其中的用法與技巧&am…

【經典回放】多種語言系列數據結構算法:基數排序

目錄 一、算法思路 二、C#語言實現 三、C語言實現 一、算法思路 1. 思想基礎 基數排序的思想就是先找出待排序中的最大者&#xff0c;然后按最大者申請一個足夠大的內存空間&#xff0c;并將其初始化為零&#xff0c;然后將所有待排序的數裝入其中&#xff0c;標記裝入的數…

Java之ThreadPoolExcutor和四種常見的線程池

一、ThreadPoolExcutors的作用 java提供了ThreadPoolExcutors來創建一個線程池&#xff0c;我們為什么要用線程池呢? 1.降低資源的消耗&#xff1a;通過重復利用已經創建好的線程降低線程的創建和銷毀帶來的損耗 2.提高響應速度&#xff1a;因為線程池中的線程處于等待分配任…

探索鏈路追蹤在.NET6工業物聯網項目中的應用

如果覺得有用&#xff0c;請留言學到了。已經會了的老哥&#xff0c;請留言就這&#xff1f;可能遇到的問題工業物聯網系統自上而下一般分為ERP、Mes、SCADA、WCS、邊緣網關、設備等一個生產訂單從SAP發送到設備要經過上述多個系統&#xff0c;當某個環節出現問題&#xff0c;可…

《零基礎看得懂的C語言入門教程 》——(三)輕輕松松理解第一個C語言程序

一、學習目標 了解C語言代碼的一般結構了解函數的概念了解printf函數的使用方法了解頭文件的概念了解system函數的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤…

hdu_1728_逃離迷宮(bfs)

題目連接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1728 題意&#xff1a;走迷宮&#xff0c;找最小的拐角 題解&#xff1a;對BFS有了新的理解&#xff0c;DFS剪枝應該也能過&#xff0c;用BFS就要以拐角作為增量來搜&#xff0c;即以當前點為坐標&#xff0c;4…

把文件放在SD卡

2019獨角獸企業重金招聘Python工程師標準>>> 在程序中訪問SDCard&#xff0c;你需要申請訪問SDCard的權限。 在AndroidManifest.xml中加入訪問SDCard的權限如下: <!-- 在SDCard中創建與刪除文件權限--> <uses-permissionandroid:name"android.permiss…

python分層聚類集群合并_24、python分層聚類案例(scipy方法)

目錄1、分層聚類算法2、方法3、分析步驟4、案例1、分層聚類算法層次聚類算法又稱為樹聚類算法&#xff0c;它根據數據之間的距離&#xff0c;透過一種層次架構方式&#xff0c;反復將數據進行聚合&#xff0c;創建一個層次以分解給定的數據集。2、方法01 聚類方法linkagescipy.…