Blazor University (19)使用 RenderFragments 模板化组件 —— 数据传递

原文链接:https://blazor-university.com/templating-components-with-renderfragements/passing-data-to-a-renderfragement/

将数据传递给 RenderFragment

源代码[1]

到目前为止,我们使用了仅包含子标记的 RenderFragments,然后在渲染组件时按原样包含子标记。除了标准的 RenderFragment 类之外,还有一个通用的 RenderFragment<T> 类,可用于将数据传递到 RenderFragment

允许用户指定模板

更改 TabControl 组件并在 ChildContent 参数下添加一个新的 TabTextTemplate 参数属性。

[Parameter]
public RenderFragment ChildContent { get; set; }[Parameter]
public RenderFragment<TabPage> TabTextTemplate { get; set; }

然后更改 foreach 循环中的标记。我们需要做的是检查是否设置了 TabTextTemplate;如果没有,那么我们照常渲染,如果已经设置,那么我们执行 TabTextTemplate RenderFragment,从 foreach 循环中传入 TabPage

<CascadingValue Value="this"><div class="btn-group" role="group">@foreach (TabPage tabPage in Pages){<button type="button"class="btn @GetButtonClass(tabPage)"@onclick=@( () => ActivatePage(tabPage) )>@if (TabTextTemplate != null){@TabTextTemplate(tabPage)}else{@tabPage.Text}</button>}</div>@ChildContent
</CascadingValue>

要设置 TabTextTemplate,我们需要在使用 TabControl 的页面中编辑标记。只需在 <TabControl> 元素内添加 <TabTextTemplate> 元素即可完成此操作,只要将 TabPage 的标记呈现到 TabControl 的选项卡中,该模板内的所有内容都将被视为要使用的 RenderFragment

<TabControl><TabTextTemplate>Hello</TabTextTemplate><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”内无法识别的子内容。组件“TabControl”通过以下顶级项目接受子内容:“ChildContent”、“TabTextTemplate”。

当您的组件中只有一个 RenderFragment 参数并且它被命名为 ChildContent 时,Blazor 将假定每当我们使用该组件并在我们想要将其分配给 ChildContent 的开始和结束标记之间包含内容。但是一旦我们在消费者的标记中有两个 RenderFragment,Blazor 就不能假定所有内容都应该分配给 ChildContent 参数。此时,组件的用户必须显式创建一个 <ChildContent> 元素来保存内容。

为了明确意图,可以将 ChildContent 属性重命名为 Tabs

<TabControl><TabTextTemplate>Hello</TabTextTemplate><ChildContent><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></ChildContent>
</TabControl>

在 RenderFragment 中访问上下文

到目前为止,TabControl 组件将为每个 TabPage 的选项卡只显示文本“Hello”。我们需要的是访问正在呈现的 TabPage,以便我们可以输出其 Text 属性的值。注意 TabControl 组件中 TabTextTemplate 的使用。

@if (TabTextTemplate != null){@TabTextTemplate(tabPage)}else{@tabPage.Text}

foreach 循环中创建了一个 HTML <button>,并且在该按钮中,前面的代码用于输出应显示给用户单击的内容。如果 TabTextTemplate 为空,则呈现 @tabPage.Text,但如果 TabTextTemplate 不为空(组件用户已指定模板),则呈现模板,并传入循环的当前 tabPage 以获取上下文。

当使用 RenderFragment<T> 类的通用版本时,我们必须在渲染该片段时传递 <T> 的值。传递给片段的值可通过名为 context 的特殊变量获得。然后可以使用它来准确确定要渲染的内容。在我们的例子中,我们希望使用一些额外的标记来呈现 TabPage.Text 属性。

<TabTextTemplate><img src="/images/tab.png"/> @context.Text
</TabTextTemplate>

38a7d8c9c34cf9b30029ed8c2ef6674b.gif

避免 @context 名称冲突

如果名称 context 与组件中的另一个标识符冲突,则可以通过在 RenderFragment 上使用 Context 属性来指示 Blazor 逐个使用不同的名称。

例如,前面演示的 TabTextTemplate 标记可以改为如下编写。

<TabTextTemplate Context="TheTab"><img src="/images/tab.png"/> @TheTab.Text
</TabTextTemplate>

参考资料

[1]

源代码: https://github.com/mrpmorris/blazor-university/tree/master/src/TemplatedComponents/PassingDataToARenderFragment

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一头扎进Node(三) - File System

file.open:异步模式打开文件 fs.open(path, flags[, mode], callback) 案例代码如下&#xff1a; var fs require(fs);/*** 参数说明&#xff1a;* 1.path&#xff1a;要打开的文件的文件路径* 2.flags&#xff1a;打开文件的方式 读/写* r&#xff1a;只读方式打开文件…

《零基础看得懂的C语言入门教程 》——(十二)原来结构体是这么回事

一、学习目标 了解C语言的结构体的使用方法了解C语言结构体的结构的赋值了解多种C语言结构体变量的赋值方法和取值方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第…

【学生选课系统经典】C#与SQLSERVER连接:Windows应用工程案例

实验任务描述 1 用C#访问SQLSERVER数据库(两种安全模式); 2 用C#完成数据库指定表上的数据显示; 3 用C#完成数据库指定表上的数据插入、删除和更新; 4 用C#完成数据库用户验证。 注意,由于C#语言的强大功能,下面的代码适用于SQLSERVER2000、也适合于SQLSERVER2005。区别仅…

Java精选笔记_JDBC

JDBC概述 什么是JDBC JDBC全称是Java数据库连接&#xff08;Java Database Connectivity&#xff09;&#xff0c;应用程序可通过这套API连接到关系数据库&#xff0c;并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。是一套用于执行SQL语句的Java API。Java的数据…

mysql关系数据库引擎_MySQL数据库引擎详解

作为Java程序员&#xff0c;MySQL数据库大家平时应该都没少使用吧&#xff0c;对MySQL数据库的引擎应该也有所了解&#xff0c;这篇文章就让我详细的说说MySQL数据库的Innodb和MyIASM两种引擎以及其索引结构。也来巩固一下自己对这块知识的掌握。Innodb引擎Innodb引擎提供了对数…

Java之synchronized的JVM底层实现原理精简理解

1 synchronized的JVM底层原理实现的精简理解 Java 虚拟机中的synchronized基于进入和退出Monitor对象&#xff08;也称为管程或监视器锁&#xff09;实现&#xff0c; 无论是显式同步(synchronized作用在同步代码块&#xff0c;有明确的 monitorenter 和 monitorexit 指令) 还是…

三分钟掌握Actor和CSP模型

点击上方蓝字进行关注前文传送门&#xff1a;《三分钟掌握共享内存模型和 Actor模型》&#xff0c; 一直想比较Actor模型与golang的CSP模型&#xff0c;经过一段时间的实战记录了本文。Actor vs CSP模型• 传统多线程的的共享内存&#xff08;ShareMemory&#xff09;模型使用l…

DateTimeToUnix/UnixToDateTime 对接时间转换

问题&#xff0c;通过毫秒数来解析出时间&#xff1a;&#xff08;很多对接的时候经常需要用到&#xff09; <?php $MyJson {"jingdong_vas_subscribe_get_responce":{"code":"0","item_code":"FW_GOODS-2236-1","…

【学生选课系统经典】VB与SQLSERVER连接:Windows应用工程案例

实验任务描述 1 用VB6访问SQLSERVER数据库(两种安全模式); 2 用VB6完成数据库指定表上的数据显示; 3 用VB6完成数据库指定表上的数据插入、删除和更新; 4 用VB6完成SQLSERVER2008数据库用户验证。 一、数据库系统 该实验中,所要求的数据库名称为SCHOOL,总共涉及以下表:

丢失api-ms-win-crt-runtime-l1-1-0.dll

运行Cmder的时候提示&#xff1a;丢失api-ms-win-crt-runtime-l1-1-0.dll在网上找了一些方法&#xff0c;基本解决方法都是装VC2015的运行时&#xff0c;但是我安装的时候出错&#xff0c;大家可以先试试。接着我就去解决安装出错这问题没&#xff0c;折腾了半天也没成功。后来…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(二)魔法实习生第一步了解魔杖的使用

学习目标 了解什么是开发环境了解python语言的环境安装了解python语言编程的编辑器工具 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&#xff08;一&#xff09;既然你选择了这系列教程那么我就要让你听得懂 第三篇&#xff1a;《假如编…

Java之synchronized可重入性的理解

1 synchronized可重入性的理解 当一个线程试图操作一个由其他线程持有的对象锁的临界资源时&#xff0c;将会处于阻塞状态&#xff0c;但当一个线程再次请求自己持有对象锁的临界资源时&#xff0c;如果当前锁是重入性&#xff0c;会请求将会成功&#xff0c;如果当前锁不是可…

onmouseover-onmouseout

<input type"checkbox" value"autoLogin" οnmοuseοver"block()" οnmοuseοut"none()">两周内自动登录 <div id"div1">为了您的信息安全请不要在网吧或公共电脑勾选此项</div> <script> functi…

mysql5.7 only_full_group_by_Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法

近期在开发过程中&#xff0c;因为项目开发环境连接的mysql数据库是阿里云的数据库&#xff0c;而阿里云的数据库版本是5.6的。而测试环境的mysql是自己安装的5.7。因此在开发过程中有小伙伴不注意写了有关group by的sql语句。在开发环境中运行是正常的&#xff0c;而到了测试环…

一款高速的NET版的离线免费OCR

PaddleOCR.Onnx一款基于Paddle的OCR&#xff0c;项目使用ONNX模型&#xff0c;速度更快。本项目同时支持X64和X86的CPU上使用。本项目是一个基于PaddleOCR的C代码修改并封装的.NET的工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能&#xff0c;同…

spring 注解简单使用

一、通用注解 1、项目结构&#xff1a; 2、新建Person类&#xff0c;注解Component未指明id&#xff0c;则后期使用spring获取实例对象时使用默认id"person"方式获取或使用类方式获取 package hjp.spring.annotation.commen;import org.springframework.stereotype.C…

selenium+python笔记3

#!/usr/bin/env python # -*- coding: utf-8 -*- """ desc:学习unittest的用法 注意setUp/setUpClass&#xff0c;tearDown/tearDownClass的区别 ① setUp():每个测试函数运行前运行 ② tearDown():每个测试函数运行完后执行 ③ setUpClass():必须使用classmeth…

【学生选课系统经典】C#与SQLSERVER连接:ASP.NET网站(服务器端,IIS发布)

实验任务描述 1 用C#访问SQLSERVER数据库(两种安全模式); 2 用C#完成数据库指定表上的数据显示; 3 用C#完成数据库指定表上的数据插入、删除和更新; 4 用C#完成数据库用户验证。 此处使用ASP.NET工程来完成这个项目,和Windows应用不同的是:这个项目是在服务器上、依靠IIS服…

TCP包头、UDP包头、IP包头、和MAC帧包头详细字段和包头大小

1 TCP头 TCP是一种可靠的、面向连接的字节流服务,头部定义如下。 /*TCP头定义,共20个字节*/ typedef struct _TCP_HEADER {short m_sSourPort;       // 源端口号16bitshort m_sDestPort;       // 目的端口号16bitunsigned int m_uiSequNum; …

经典面试题:用户反映你开发的网站访问很慢可能会是什么原因

原文链接&#xff1a;http://blog.csdn.net/lv_victor/article/details/53148421 问题场景&#xff1a;某个用户向你反映说你开发的网站访问速度很慢&#xff0c;但是该用户访问其他问题很正常&#xff0c;分析下原因、有哪些工具分析原因、怎么解决问题&#xff1f; 最近面试两…