翻译自 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="data: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] 等。

相关阅读:

作者 : Waqas Anwar

翻译 : 技术译站

链接 : 英文原文


  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

Blazor 组件库开发指南的更多相关文章

  1. 现代前端库开发指南系列(二):使用 webpack 构建一个库

    前言 在前文中,我说过本系列文章的受众是在现代前端体系下能够熟练编写业务代码的同学,因此本文在介绍 webpack 配置时,仅提及构建一个库所特有的配置,其余配置请参考 webpack 官方文档. 输 ...

  2. Ant Design Blazor 组件库的路由复用多标签页介绍

    最近,在 Ant Design Blazor 组件库中实现多标签页组件的呼声日益高涨.于是,我利用周末时间,结合 Blazor 内置路由组件实现了基于 Tabs 组件的 ReuseTabs 组件. 前 ...

  3. Bootstrap Blazor 组件库 Row 布局组件(栅格系统)

    原文链接:https://www.cnblogs.com/ysmc/p/16133351.html 在 Bootstrap 中,栅格相信大家都很熟悉,简直就是布局神器啊,Bootstrap Blazo ...

  4. Bootstrap Blazor 组件库

    项目介绍 Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建丰富的交互式 UI. 共享使用 .NET 编写的服务器端和客户端应 ...

  5. Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境

    前文已经初始化了 workspace-root,从本文开始就需要依次搭建组件库.example.文档.cli.本文内容是搭建 组件库的开发环境. 1 packages 目录 前面在项目根目录下创建了 ...

  6. vue2+element组件库开发

    Vue2:https://cn.vuejs.org/v2/guide/single-file-components.html element组件库:http://element-cn.eleme.io ...

  7. Blazor 组件库 Blazui 开发第一弹【安装入门】

    标签: Blazor Blazui文档 Blazui 传送门 Blazor 组件库 Blazui 开发第一弹[安装入门]https://www.cnblogs.com/wzxinchen/p/1209 ...

  8. 漫谈LiteOS-端云互通组件-MQTT开发指南(上)

    1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...

  9. 漫谈LiteOS-端云互通组件-MQTT开发指南(下)

    1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...

随机推荐

  1. 构建前端第12篇之---在Vue中对组件,变量,函数的全局引入

    张燕涛写于2020-01-16 星期two 本篇还是源于import和export的使用,昨天看es6入门 和MDN文档,大体上用法了解了,但今天看ElementUI源码的时候,看到 //src/in ...

  2. SpringMVC中文乱码踩坑

    问题 使用SpringMVC在返回一个字符串时发生了中文乱码问题.produces属性无效 @RequestMapping(value = "/nihao", produces = ...

  3. phpunit 远程代码执行漏洞(CVE-2017-9841)

    影响版本 4.8.19 ~ 4.8.27 5.0.10 ~ 5.6.2 访问进行抓包 http://192.168.49.2:8080/vendor/phpunit/phpunit/src/Util/ ...

  4. C++11 noexcept 关键字用法学习

    最近学习和写了一个 mint 的板子 ,其中用到了 noexcept 关键字,对这个关键字不太熟悉,便学习一下刘毅学长的文章. C++98 中的异常规范(Exception Specification ...

  5. 安卓安装https证书

    前置条件 1 手机要设置密码 然后安装charles 证书 2 赋予 adb shell root权限(安装magisk就行) adb shell # 连接手机进入shell模式 su root # ...

  6. UI_UE在线就业班(2)(Adobe Illustrator软件学习)

    Adobe Illustrator软件的使用     认识AIUI_UE在线就业班(2) .   ▼ AI是Adobe Illustrator的英文缩写,是Adobe公司旗下推出的一款基于矢量图形制作 ...

  7. TypeScript学习笔记(四)装饰器

    目录 一.装饰器的作用 二.类装饰器 1. 普通装饰器 为类扩展属性和方法 使用装饰器修改属性和重写方法 2. 装饰器工厂 三.属性装饰器 四.方法装饰器 使用方法装饰器对方法进行扩展 五.方法参数装 ...

  8. Android开发失业六个月了,无限的焦虑

    最近到网上看到这样一个帖子: Android开发,坐标魔都:目前为止已经失业六个月,找工作期间,尤其是最近两天确实心态不好.要么没有面试,要么给的工资不符合预期( hr 压价太狠了,原先说的 19k, ...

  9. 终于有人把Android技术面试知识体系整理出来了,这些学习手册让你的面试稳如泰山

    前言 年年寒冬,年年也挡不住一个安卓程序员追求大厂的决心.想要进入大厂,我们需要掌握哪些知识点呢?这里,我为大家梳理了一个整体的知识架构.整体包括Java.Android.算法.计算机基础等等,相应的 ...

  10. IP地址,InetAddress类的使用

    IP地址 IP地址:InetAddress(没有构造器,通过静态方法返回) java.net包下 唯一定位一台网络上的计算机 127.0.0.1:本机localhost ip地址的分类 IPV4/IP ...