Blazor 组件库开发指南

翻译自 Waqas Anwar 2021年5月21日的文章 《A Developer’s Guide To Blazor Component Libraries》 [1]

Blazor 的核心是组件,我们创建不同类型的组件并在整个项目中重用它们。没有人想重复造轮子,因此创建一个可重用的 Blazor 组件库始终是一个好主意,这些组件不仅可以在多个项目之间共享,还可以作为 NuGet 包与其他人共享。Blazor 允许我们基于一个名为 Razor 类库(Razor Class Library)的新模板创建这样的组件库,在本文中,我将向您演示如何创建这样一个库,不仅仅共享组件,还共享静态内容(比如图片、样式表等等)。

下载源码[2]

创建一个 Razor 组件库

在 Visual Studio 2019 中创建一个新的名为 BlazorClassLibraryDemo 的 Blazor Server 应用程序,确保您可以正常构建和运行该项目。如果您不确定如何创建 Blazor Server 应用程序,那么我建议您阅读我的文章《Blazor Server 和 WebAssembly 应用程序入门指南》

要在 Blazor 项目中添加一个新组件库,请右键点击解决方案并选择 添加 > 新建项目... 选项。从项目模板列表中选择 Razor 类库(Razor Class Library) 项目模板。

为项目提供任意合适的名称,我这里将其命名为 MyComponentsLibrary

然后,会询问您选择一些其他设置项,直接点击 创建 按钮就好。

默认情况下,模板会创建一个名为 Component1.razor 的示例组件和一些附加文件。在开始创建我们的第一个共享组件之前,我们需要删除 Component1.razorExampleJsInterop.cs 以及 wwwroot 文件夹中的所有内容,以便我们有一个纯净的开始。

在 Razor 类库中创建一个组件

让我们在 Razor 类库项目 MyComponentsLibrary 中创建我们的第一个可重用的共享组件。右键点击类库项目并选择 添加 > 新建项… 选项。选择 Razor 组件 模板并指定组件名称 TableWidget.razor

如果您希望将 C# 代码与组件视图分开,您还可以添加代码隐藏文件 TableWidget.razor.cs。该 TableWidget 组件是一个简单的模板化组件,可用于从任何对象列表生成 HTML 表格。如果您想了解有关 Blazor 模板化组件的更多知识,那么您可以阅读我的文章《Blazor 模板化组件开发指南》。

在 TableWidget.razor 组件视图文件中添加以下标记。

TableWidget.razor

@typeparam TItem
<table class="table table-striped table-bordered"><thead class="thead-green"><tr>@HeaderTemplate</tr></thead><tbody>@foreach (var item in Items){<tr>@RowTemplate(item)</tr>}</tbody><tfoot><tr>@FooterTemplate</tr></tfoot>
</table>

下面是 TableWidget 组件的代码隐藏文件。该组件具有 RenderFragment 类型的 Header、Row 和 Footer 模板,用于在视图中生成 HTML 表格的表头、数据行和页脚。

TableWidget.razor.cs

using System.Collections.Generic;
using Microsoft.AspNetCore.Components;namespace MyComponentsLibrary
{public partial class TableWidget<TItem>{[Parameter]public RenderFragment HeaderTemplate { get; set; }[Parameter]public RenderFragment<TItem> RowTemplate { get; set; }[Parameter]public RenderFragment FooterTemplate { get; set; }[Parameter]public IReadOnlyList<TItem> Items { get; set; }}
}

我们在 Razor 类库中创建的每个可重用组件还可以有对应的样式表来定义组件的外观。例如,如果我们希望我们的 TableWidget 组件生成带有深绿色表头的表格,我们可以在 TableWidget.razor.css 文件中定义组件的样式。

TableWidget.razor.css

.thead-green {background-color: darkgreen;color: white;
}

使用 Razor 类库中的 Razor 组件

现在我们已经在类库项目中定义了我们的 TableWidget 组件,是时候在我们的 Blazor 项目中使用这个组件了。右键单击解决方案资源管理器中的 依赖项(Dependencies) 节点,然后从上下文菜单中选择 添加项目引用...(Add Project Reference...) 选项。选中 MyComponentsLibrary 项目并点击确定。

如果您想在多个页面上使用 TableWidget 组件,那么推荐您在 _Imports.razor 文件中添加该类库的引用。

@using MyComponentsLibrary

Blazor 项目模板默认生成一个 FetchData.razor 页面,显示来自后端服务的天气预报对象。我们可以在此页面上测试我们的 TableWidget 组件。打开 FetchData.razor 文件,并使用 TableWidget 组件替换其中的 HTML 表格,如下面的代码片段所示。

FetchData.razor

@page "/fetchdata"@using BlazorClassLibraryDemo.Data
@inject WeatherForecastService ForecastService<h1>Weather forecast</h1>@if (forecasts == null)
{<p><em>Loading...</em></p>
}
else
{<TableWidget Items="forecasts" Context="forecast"><HeaderTemplate><th>Date</th><th>Temp. (C)</th><th>Temp. (F)</th><th>Summary</th></HeaderTemplate><RowTemplate><td>@forecast.Date.ToShortDateString()</td><td>@forecast.TemperatureC</td><td>@forecast.TemperatureF</td><td>@forecast.Summary</td></RowTemplate></TableWidget>
}@code {private WeatherForecast[] forecasts;protected override async Task OnInitializedAsync(){forecasts = await ForecastService.GetForecastAsync(DateTime.Now);}
}

运行该项目,您会看到使用我们的 TableWidget 组件生成的天气预报表格。现在,您可以在多个页面或项目中重用该 TableWidget 组件,并且将会看到始终为您生成相同的表格。

使用 Razor 类库中的图片

Razor 类库可以公开静态资源(比如图片),并且这些资源可以由使用该库的 Blazor 应用程序使用。让我们在 MyComponentsLibrary 项目的 wwwroot/images 文件夹中添加一个图片 blazor_logo.jpg。为了在 Blazor 组件中使用此图片,请在 MyComponentsLibrary 项目中添加一个名为 BlazorLogo.razor 的组件。

使用简单的 img 标签将 blazor_logo.jpg 图片添加到 BlazorLogo.razor 组件中。

BlazorLogo.razor

<img src="images/blazor_logo.jpg" alt="Blazor Logo"/>

要在 Blazor 应用程序中使用此 BlazorLogo.razor 组件,请从我们上面创建的 Blazor 示例应用中打开 Index.razor 页面,然后直接使用 BlazorLogo 组件,如下面的代码片段所示。

Index.razor

<h1>Hello, Blazor!</h1><BlazorLogo></BlazorLogo>

运行该项目,您会注意到图片并未如预期那样显示出来。这是因为无法从类库项目外访问图片的相对路径 images/blazor_logo.jpg

要解决上述问题,您需要使用下面给出的特殊路径语法:

_content/{Razor Class Library Name}/{Path to file}

在上面的语法中,{Razor Class Library Name} 是类库名称的占位符(例如 MyComponentsLibrary),{Path to file} 是 wwwroot 文件夹下的文件路径。

让我们使用上面描述的特殊语法来修复我们的图片路径。

BlazorLogo.razor

<img src="_content/MyComponentsLibrary/images/blazor_logo.jpg" alt="Blazor Logo"/>

再次运行项目,这次您会注意到图片按预期显示了。

我们还可以使用上述特殊语法直接访问 Razor 类库中的图片。例如,下面的代码片段将使用 BlazorLogo 组件以及 img 标签显示 Razor 类库中的图片。请注意,Blazor 应用中的 img 标签使用相同的特殊语法来访问 MyComponentsLibrary 中的图片。

Index.razor

<h1>Hello, Blazor!</h1><h4>Showing Image from a Component available inside Class Library</h4><BlazorLogo></BlazorLogo><h4>Showing Image directly from Class Library</h4><img src="_content/MyComponentsLibrary/images/blazor_logo.jpg" alt="Blazor Logo" />

再次运行该项目,这次您应该会看到相同的图片使用了两种不同的方式显示两次。

使用 Razor 类库中样式表

我们还可以在 Razor 类库中添加样式表,并且 Blazor 应用程序可以使用这些样式表中定义的样式。让我们在 wwwroot/css 文件夹中添加一个样式表 components.css

出于演示目的,让我们添加一些与 img 标签相关的样式。

components.css

img
{background-color: lightgreen;padding: 5px;border: 1px solid black;
}

要在我们的 Blazor 应用程序中包含 components.css 文件,我们可以使用与上面看到的相同的特殊语法。打开 Blazor Server 应用程序中的 _Host.cshtml 文件,并使用以下 link 标签将 components.css 文件包含在 head 标签内。

_Host.cshtml

<head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" />...<link href="~/_content/MyComponentsLibrary/css/components.css" rel="stylesheet" />
</head>

运行项目,您会发现我们在 components.css 文件中定义的与 img 标签相关的样式被应用到了项目中的所有图片上。

总结

我在本文中介绍了可重用组件的非常基础的示例,但您可以借此领会到 Razor 类库的强大功能。开发者可以创建一些又酷又炫的可重用 Blazor 组件库,这些库不仅可以为您的项目添加一些高级功能,还可以提升开发速度。许多组件供应商已经开发了一些开源和商业库,例如 MatBlazor[3]、Radzen[4]、Syncfusion[5] 等。

相关阅读:

  • Blazor Server 和 WebAssembly 应用程序入门指南

  • Blazor 组件入门指南

  • Blazor 数据绑定开发指南

  • Blazor 事件处理开发指南

  • Blazor 组件之间使用 EventCallback 进行通信

  • Blazor 路由及导航开发指南

  • Blazor 模板化组件开发指南

  • Blazor Server 应用程序中进行 HTTP 请求

  • Blazor WebAssembly 应用程序中进行 HTTP 请求

  • Blazor 组件库开发指南(本文)


相关链接:

  1. https://www.ezzylearning.net/tutorial/a-developers-guide-to-blazor-component-libraries A Developer’s Guide To Blazor Component Libraries ↩︎

  2. https://github.com/ezzylearning/BlazorClassLibraryDemo 下载源码 ↩︎

  3. https://www.matblazor.com/ ↩︎

  4. https://blazor.radzen.com/ ↩︎

  5. https://www.syncfusion.com/blazor-components ↩︎

作者 :Waqas Anwar
译者 :技术译民
出品 :技术译站(https://ITTranslator.cn/)

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

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

相关文章

今年大学毕业照画风太清奇.....我忍不住笑出了声!

全世界只有3.14 % 的人关注了爆炸吧知识转眼又到毕业季&#xff0c;今年毕业季因疫情有些不一样。PS云毕业照、云答辩、云面试&#xff0c;不少毕业生调侃自己是“云毕业”。最近不少大学生在网上哀嚎&#xff0c;原因是学校要他们上交照片&#xff0c;以便制作毕业照&#xff…

vc 控制台添加托盘显示_开源:ESP8266读DHT11温湿度,小程序实时显示

第一、原理讲解原理简述&#xff1a;利用发布订阅模式。第一步&#xff0c;先读取DHT11温湿度数值&#xff0c;第二步&#xff0c;新建主题&#xff0c;然后esp8266往这个主题发送消息&#xff0c;第三步。小程序通过http API接口获取数据。小程序控制原理&#xff1a;esp8266订…

python if elif else_python:通讯录(字典+while+if/else)

Hello,World.我是很久很久很久都没有更新的土土[看]但是即便如此呢我这个人也不喜欢拖拖拉拉的东扯西扯一上来咱们就来讲讲正题勿怪[笑哭]1.使用字典构建通讯录mydic{}//定义一个字典2.使用whlie循环判断是否继续进行while True://循环开始break//循环结束3.使用if/elif/else语…

有BUG!!!慎用default文本

前言下面这段代码&#xff0c;你能发现什么问题吗&#xff1f;public static int? Test1(string str) {return str switch{"A" > 1,"B" > 2,"C" > 3,_ > default,}; } public static int? Test2(string str) {switch (str){case &…

老师看完都吐血的五道题

全世界只有3.14 % 的人关注了 爆炸吧知识 老师看完都要吐血的五道题哈哈哈哈哈虽然小编觉得最后一答完全没问题哈哈哈图片来源于网络&#xff0c;如有侵权请联系删除。你点的每个在看&#xff0c;我都认真当成了喜欢

JDK5.0新特性--可变参数

2019独角兽企业重金招聘Python工程师标准>>> /*** 可变参数*/ public class VariableParamater {/*** 统计2个或多个数的和*/public static void main(String[] args) {//计算2个数的和sum(10,15);/** 问题&#xff1a;如果要计算3个数、4个数、5个数或n个数的和&am…

欧几里得距离网络_使用Tensorflow对象检测模型和OpenCV的社交距离和遮罩检测器...

将深度学习和计算机视觉相结合的隔离项目社会距离化这个术语已席卷全球&#xff0c;正在改变着我们的生活方式。社交距离也称为“物理距离”&#xff0c;是指在您自己与其他并非来自家庭的人之间保持安全的空间。随着该国开始在激增的COVID-19案件中发挥作用&#xff0c;保持社…

python 实现点击右键用某个程序打开功能_工欲善其事,必先利其器(1)——Python开发环境安装与配置...

Life Is Short, You Need Python.近年来随着Python的火爆&#xff0c;很多人想要学习并使用Python&#xff0c;本文将详细介绍一套Python开发环境的安装与配置&#xff0c;相比Python自带的IDEL&#xff0c;在此环境下将极大的提高开发效率。下面就让我们一步步的开始安装&…

5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;好机友ID&#xff1a;goodjiyou这个时代&#xff0c;大家对电脑出现漏洞&#xff0c;可能已经习以为常。但如果机哥告诉大家&#xff0c;这个漏洞能够在 5 分钟内&#xff0c;破解并盗取你所有加密文件&#xff0c;而且还…

我的世界命令计算机,我的世界有哪些指令?电脑版指令大全

在我的世界游戏中玩家可以依靠指令做很多现实生活中都可以做的事情&#xff0c;甚至有些现实中做不到的事情&#xff0c;比如上天堂&#xff0c;所以指令对于每个我的世界的玩家来说都非常重要&#xff0c;今天小编给大家介绍我的世界指令大全&#xff1a;我的世界指令大全&…

道德经和译文_老子《道德经》第九章原文、注释、译文、导读及解析(收藏版)...

《道德经》被誉为“万经之王”&#xff0c;内容涵盖哲学、伦理学、政治学、军事学等诸多学科&#xff0c;曾被后人尊奉为治国、齐家、修身、为学的宝典。它对我国的哲学、科学、政治、宗教等都产生了深远的影响&#xff0c;体现了古人的一种世界观和人生观。《道德经》作为道教…

StackOverflow程序员推荐:每个程序员都应读的30本书

“如果能时光倒流&#xff0c;回到过去&#xff0c;作为一个开发人员&#xff0c;你可以告诉自己在职业生涯初期应该读一本&#xff0c;你会选择哪本书呢&#xff1f;我希望这个书单列表内容丰富&#xff0c;可以涵盖很多东西。” 很多程序员响应&#xff0c;他们在推荐时也写下…

超震撼!你没见过的24张震撼照片

全世界只有3.14 % 的人关注了爆炸吧知识话不多说&#xff0c;这些照片&#xff0c;每张都很有价值&#xff1a;艾菲尔铁塔&#xff0c;从底部往上看360度的彩虹高科技停车&#xff08;大众沃尔夫斯堡汽车厂&#xff09;被整理过的蜂窝沙特阿拉伯的农田两棵树共享一个枝干两位接…

使用 baget 搭建 nuget 私有服务

现在几乎所有语言都提供包管理工具&#xff0c;比如 JavaScript 的 npm &#xff0c;Java 的 Maven &#xff0c;Dart 的 pub 。.Net 程序当然是 NuGet 。NuGet 也出现很多年了&#xff0c;奇怪的是居然还有很多人不知道。现在软件结构越来越复杂&#xff0c;在多个项目中往往需…

xp计算机dns怎么设置,XP系统dns怎么设置?XP系统dns的设置方法

在使用XP系统浏览网页时&#xff0c;大家有没碰到网页打开很慢&#xff0c;而网速检测又显示正常的情况。为什么会出现这样的情况呢&#xff1f;一方面可能是你的电脑中毒了&#xff0c;另一方面可能是你的dns选择的不够好。那么dns要怎么设置才最好呢&#xff1f;下面小编以XP…

线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数

作者&#xff1a;dadiyang来源&#xff1a;https://blog.csdn.net/dadiyang/article/details/88315124面试场景面试官&#xff1a;Java多线程了解吗&#xff1f;你给我写一下&#xff0c;起两个线程交替打印0~100的奇偶数。小黄&#xff1a;啊&#xff1f;面试官&#xff1a;就…

asp.net添加删除表格_如何用openpyxl自动化编写Excel电子表格

有很多不同的东西你可以写到电子表格&#xff0c;从简单的文本或数字值到复杂的公式&#xff0c;图表&#xff0c;甚至图像。创建一个简单的电子表格之前&#xff0c;大家看到了一个非常快速的例子&#xff0c;就是如何将 "Hello world!"写进电子表格中&#xff0c;所…

纯css3实现的鼠标悬停动画按钮

今天给大家带来一款纯css3实现的鼠标悬停动画按钮。这款按钮鼠标经过前以正方形的形式&#xff0c;当鼠标经过的时候以动画的形式变成圆形。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 html代码&#xff1a; <div><span></span></div> …

如何交到一个女朋友?

1 北京的路&#xff0c;上海的路和重庆的路2 这兔子是吃弹簧长大的吧&#xff01;3 猫和老鼠原来是真的4 把水凝胶珠投入有颜色的水&#xff0c;过一会儿之后...5 为了同学得分&#xff0c;老师有多努力你知道吗&#xff1f;6 不同年龄段爱用的表情7 来自一个幼儿园小男生的教学…

浅析 Dapr 里的云计算设计模式

Dapr 实际上是把分布式系统 与微服务架构实践的挑战以及k8s 这三个主题的全方位的设计组合&#xff0c;特别是Kubernetes设计模式 一书作者Bilgin Ibryam 提出的Multi-Runtime Microservices Architecture&#xff0c;中译参见敖小剑的博客: [译] 多运行时微服务架构。分布式系…