使用 Blazor 开发内部后台(二):了解 Blazor 组件

2023-11-16

James:  转载技术社区中一位朋友最新的文章,介绍自己为公司的 WebForm 遗留系统使用 Blazor 重写前端 UI 的经历。



什么是Blazor组件

Blazor 应用是使用 Razor 组件构建的。组件是用户界面 (UI) 的自包含部分,具有用于启用动态行为的处理逻辑。组件可以嵌套、重复使用、在项目间共享,并可在 MVC 和 Razor Pages 应用中使用。

以上是官方文档给出的定义。实际在工程上,Blazor组件和其他Web前端框架组件一样,包括HTML、CSS和代码三个部分,只是这里的“代码”特指C#语言,而非最常见的JavaScript。

让我们先看一下官方文档给出的例子,创建一个razor文件Dialog.razor

<div class="card" style="width:22rem">
    <div class="card-body">
        <h3 class="card-title">@Title</h3>
        <p class="card-text">@ChildContent</p>
        <button @onclick="OnYes">Yes!</button>
    </div>
</div>

@code {
    [Parameter]
    public RenderFragment ChildContent { get; set; }
    [Parameter]
    public string Title { get; set; }

    private void OnYes()
    {
        Console.WriteLine("Write to the console in C#! 'Yes' button selected.");
    }
}

这就是一个组件了。这个Dialog组件封装了:

  • 一个允许外部传递值(Title属性)的标题(h3标签)

  • 一个允许外部传入子组件的段落(p标签)

  • 一个点击后触发OnYes方法的按钮(button标签)

  • div标签及样式

这个组件也展示了razor标记语言的特点,在HTML模板里,‘@’标记可以将控件的数据与C#代码的属性进行双向绑定;控件的事件与C#函数的绑定也是类似。这种数据和事件绑定的方式,在三大前端框架的应用中,也不陌生(Angular开发者可能最为亲切)。

注意到p标签里的内容,ChildContent表示一个子组件,与当前的组件形成嵌套。而对应的C#类型则是RenderFragment,这是一个非常重要的类型,是开发模板化组件的基础。官方提供了一些使用案例,但若要从实际应用的角度去理解,我还是建议去参考一些开源组件项目里的组件实现,这里暂不赘述。

我们再看一下如何使用它:

@page "/"

<h1>Hello, world!</h1>

<p>Welcome to your new app.</p>

<Dialog Title="Learn More">
    Do you want to <i>learn more</i> about Blazor?
</Dialog>

这段代码的效果如下:

展示效果

可以看到页面下方就是封装了html标签的Dialog组件,其中@page用来表示当前页面的路由。

官方给的这个案例,在我看来是花了点心思的:它的结构很简单,并不难理解,却充分展示了Blazor组件的基本面貌和Razor语言的基本特点,又涉及到了Blazor组件十分灵活同时开发上限很高的模板化开发,后续等初学者接触到“组件模板化”的文档时,起码不会一无所知了。

本地内置组件

Blazor框架官方内置了一些组件。其中AuthorizeView组件和Route组件是最值得关注的。

涉及到敏感数据的后台管理系统,肯定要有一套认证授权的机制。AuthorizeView组件经常被用在Layout组件里,来区别显示认证前后的UI元素。这个组件的实际应用,将在系列的后文中具体介绍。

Route组件则更基础了,SPA框架当然需要自己的一套路由规则;另外还要处理404的情况。这些都在Route组件(写在App.razor文件中)里为开发者提供了。

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <p>Sorry, there's nothing at this address.</p>
    </NotFound>
</Router>

另外,Blazor提供了一个默认布局的MainLayout组件,由项目模板创建。但本质上它只是方便开发者理解如何在Blazor中使用布局。布局组件当然可以自定义名称和内容,我们可以在页面里使用@layout指令,来指定页面具体使用哪一个布局组件。

@page "/"
@layout CustomLayout

<div>...</div>

其他组件,往往有更好的第三方开源组件,在功能和UI风格上可以取代,本文不特别介绍。内置组件的官方文档还是比较细致的,因此本文只略作指引,有兴趣的读者可以细读文档。

第三方开源组件

在组件式开发流行的今天,任何一个前端框架想要获取开发者的青睐,开源社区的支持必不可少。甚至我认为Blazor的推广和普及,开源组件库首当其冲,属于社区生态的基础设施。Blazor发展至今,已经有了多个第三方开源组件项目,基本涵盖了市面上比较常见的UI组件:Ant Design/Bootstrap/Material UI/Element UI/……

开发Blazor应用时,选择什么样的UI组件和风格,本就是“萝卜青菜,各有所爱”。我最终选择了Ant-Design组件来开发后台,这里仅提几点个人的意见,供读者参考:

  • Ant Design源自阿里优秀的企业级开源UI设计,前端三大框架均有对应的组件实现。Blazor实现的原型来自Ant Design React。

  • Ant-Design-Blazor项目的更新周期较短,issue和开发团队的活跃度较高——意味着个人的意见更容易得到反馈,bug更快地得到修复,新功能更快地落实和发布。

  • Ant-Design-Blazor项目是较早一批被Blazor官方在技术大会上提及的开源项目之一——意味着项目已经得到一段时间的检验。

  • 项目由国内开发者(Microsoft MVP)发起,在历史参与者中也有不少国内开发者,因此中文文档比较完善,对其他国内应用开发者的问题解答和技术支持也比较到位。

成熟的开源组件,可以带来巨大的开发效率提升。举一个非常简单的例子:使用Ant-Design-Blazor的Result组件,实现一个更优雅的404提示页面,来替换上面展示的官方Demo里的404(NotFound)页面。

先创建一个MyNotFound.razor文件,代码如下:

@using AntDesign;

<div style="margin:40px">
    <Result Status="404"
            Title="404"
            SubTitle="您要访问的页面不存在!"
            Extra="extra" />
</div>

@code {
    RenderFragment extra =@<strong style="font-size:20px">回到 <a href="/home">首页</a></strong>;
}

然后在上文提到的Route组件里替换NotFound组件的内容即可:

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <MyNotFound />
    </NotFound>
</Router>

<AntContainer />

让我们故意访问一个不存在的路由,看一下效果:

404提示页面

还不错吧?比只显示一行文字好看多了,而且并不需要费多少心思找素材和写代码。

目前Ant-Design-Blazor项目正发起一个讨论,欢迎开发者们分享基于Antd组件实现的产品:Who is using Ant Design Blazor in production? ‍ · Discussion #1693 · ant-design-blazor/ant-design-blazor。另外,开发团队还增加了一个开箱即用的模板项目:ant-design-blazor/ant-design-pro-blazor。该项目既可以作为参考教材,又可以作为项目生成的基础。

ant-design-pro-blazor

当然,对任何开源Blazor UI组件项目来说,项目维护活跃、较完善的(中文)文档支持、开箱即用的模板项目,都会得到更多用户的信任,从而吸引更多的用户使用。例如,在我个人眼中,BootstrapBlazor和MatBlazor也是出类拔萃的竞争者。

结束语

在本系列接下来的文章里,我将围绕一个基于内置组件和Ant-Design-Blazor组件开发的后台Demo为例,具体介绍Blazor框架的实践经验。让我们先从正常用户访问后台的第一个页面——登录页面开始,下一篇文章,再会!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Blazor 开发内部后台(二):了解 Blazor 组件 的相关文章

  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 如何使用 NextJS 使用自托管字体face?

    使用 NextJS 的字体 我已经阅读了有关如何在 NextJS 中使用自托管字体的不同主题 我得到了什么 wait compiling 当我这样做时 font face font family montserrat src url myp
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 在 Meteor 应用程序中实现 MongoDB 2.4 的全文搜索

    我正在考虑向 Meteor 应用程序添加全文搜索 我知道 MongoDB 现在支持此功能 但我对实现有一些疑问 启用文本搜索功能的最佳方法是什么 textSearchEnabled true 在 Meteor 应用程序中 有没有办法添加索引
  • highchart堆积柱每个类别的总数据

    我想获取每个类别的总数据 这point stackTotal只给出活动数据的总数 从我粘贴的代码示例中 我想知道每种水果的总消耗量 因此 即使我单击右上角图例上的乔的名字 这使得堆叠图表上的所有乔信息都处于非活动状态 我仍然可以知道约翰 简
  • VS Code 扩展 - 获取完整路径

    我正在为 VS Code 编写一个插件 我需要知道调用扩展的文件的路径 无论是从编辑器上下文菜单或资源管理器上下文菜单调用还是用户只需键入扩展命令 function activate context get full path of the
  • 在 Firestore 文本字段中存储文本文件并删除换行符

    我正在尝试将 CSV 文件存储在 Cloud Firestore 内的文本字段中 然而 Firestore 正在删除所有换行符并将整个 CSV 文件存储为一行 这Firestore 数据类型文档 https firebase google
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • Safari 扩展将消息发送到特定选项卡

    有没有办法从全局页面发送消息到特定选项卡 我目前正在做的是 在创建选项卡时 注入的脚本会创建一个唯一的 ID 并将包含该编号的消息发送到全局页面 并且全局页面会保存该编号 如果全局页面需要发送一些数据到一个tab 即 tab 3 然后全局页
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 基于51单片机的羽毛球计分器proteus仿真程序设计

    硬件设计 末尾附文件 方案 在像羽毛球这样的竞技比赛中 计分器占着很大的作用 如果我们就只在心里记着双方的比分 显然是不实际的 而且在现在的乒乓球比赛中采用的都是21分制 因此我们不能再用传统的计分方式了 本次课题采用单片机设计了一个羽毛球
  • JetBrains IDE Support 调试工具(页面自动刷新)

    1 谷歌浏览器安装JetBrains IDE Support 插件 2 更改端口 webstorm 和 JetBrains IDE Support 端口不对插件图标会黑 3 debug 4 同步
  • 求定制闲鱼爬虫获取最新发布商品

    闲鱼采集及监控下单软件开发 1 点击宝贝右键打开网页 2 点击宝贝右键拉黑卖家 3 点击宝贝右键清空列表 4 点击宝贝左键显示二维码和主图 5 软件页面显示宝贝二维码 6 软件页面显示宝贝主图 7 软件页面显示检测搜索词及下单宝贝 8 每次
  • 介绍计算机方队,方阵

    f ng zh n 方阵 语音 编辑 锁定 讨论 上传视频 方阵是古代军队作战时采用的一种队形 是把军队在野外开阔地上排列成方形阵式 远古方阵由前军 中军和后军相互嵌套排列而成 方阵平面呈现 回 字形状 反映出远古观念中的一种政治地理结构
  • Java丨JVM虚拟机与类加载器

    一丶JVM 虚拟机介绍 Sun HotSpot VM 这个目前看起来 血统纯正 的虚拟机在最初并非由Sun公司开发 而是由一家名为 Longview Technologies 的小公 司设计的 甚至这个虚拟机最初并非是为Java语言而开发的
  • FPGA图像处理基础----直方图统计

    直方图统计的原理 直方图统计从数学上来说 是对图像中的像素点进行统计 图像直方图统计常用于统计灰度图像 表示图像中各个灰度级出现的次数或者概率 统计直方图的实现采用C C 或者其他高级语言实现十分简单 单采用FPGA来实现直方图的统计就稍显
  • Tensorflow分布式训练

    Tensorflow分布式训练 一 分布式训练模式 1 模型并行 In graph 2 数据并行 Between graph 二 异步 同步训练 1 异步训练 2 同步训练 三 同步更新和异步更新的优缺点 四 分布式机器类型 TODO 1
  • 干货|Pytorch弹性训练极简实现( 附源码)

    点击上方 视学算法 选择加 星标 或 置顶 重磅干货 第一时间送达 作者丨颜挺帅 知乎 已授权 来源丨https zhuanlan zhihu com p 489892744 编辑丨极市平台 导读 作者将以往抽象的分布式训练的概念以代码的形
  • C++11的时间新特性之high_resolution_clock

    转自 https blog csdn net cw hello1 article details 66476290 我在这里只是说一说high resolution clock的时间用法 这里有一个C 的网上的API地址 包含了C 11的新
  • 设计模式之迭代器模式

    迭代器 Iterator 模式的定义 提供一个对象来顺序访问聚合对象中的一系列数据 而不暴露聚合对象的内部表示 迭代器模式是一种对象行为型模式 其主要优点如下 访问一个聚合对象的内容而无须暴露它的内部表示 遍历任务交由迭代器完成 这简化了聚
  • 程序员python表白代码

    python表白代码 源代码如下 coding utf 8 import turtle import time 画爱心的顶部 def LittleHeart for i in range 200 turtle right 1 turtle
  • 3-jeecg-boot前端组件——字段与列表混排的表单处理

    引言 jeecg可以通过formSchema FormSchema 的方式快速定义表单字段 export const formSchema FormSchema label 父级节点 field pid component JTreeSel
  • ESP32-C3 应用程序的启动流程

    网上说明一大堆 基本是官网文档复制没有额外解释 对于ESP32 C3的 risc v 内核 是我选择他的原因之一 了解芯片上电后的启动流程 有利于我们更加深入理解芯片 目录 前言 一 应用程序启动阶段 1 1 app main c 1 2
  • [1215]小米手机USB安装出现当前设备已被临时限制

    小米系列手机 开发者版本 之 USB安装出现当前设备已被临时限制 USB安装出现当前设备已被临时限制 3 2 解决方案 1 更换SIM卡 更换小米账号 2 重新启动手机 即可解决 实战分析 SIM卡数据异常 触发限制代码 3 2 USB安装
  • Uncaught Error: useNavigate() may be used only in the context of a <Router> component.

    出现此问题的原因是因为使用useNavigate的模块没有被react的路由所包围 导致路由并不能在这个层面上使用 解决办法有两种 一 将这个模块被路由模块包围 export default memo gt return
  • React-Router实战:NavLink

    基础 1 引入使用 import NavLink from react router dom
  • rs232接口_串口,COM口,TTL,RS232,RS485,UART的区别详解

    在电路设计或者实际应用过程中 我们往往会遇到下面几种接口 在下面文章中我们详细介绍串口 COM口 RRL RS232 UART几种接口之间的区别与联系以及常见的连接使用方式 串口 串口 即串行接口 与之相对应的另一种接口叫并口 并行接口 两
  • 树莓派做无线网络服务器,树莓派做无线热点

    虽然之前我们使用树莓派成功刷入 OpenWrt 来做路由器使用 不过娱乐性却显得比较单一 无法方便地安装其他各种软件 从源码编译也会更加麻烦 经常是缺少各种头文件 因此 今天我们决定使用官方的 Raspbian 系统来设置树莓派作为一个无线
  • 学习编程过程中-->遇到的错误

    文章目录 学习编程过程中 gt 遇到的错误 吕招焕 1 java sql SQLException Parameter index out of range 2 gt number of parameters which is 1 详情如下
  • 使用 Blazor 开发内部后台(二):了解 Blazor 组件

    James 转载技术社区中一位朋友最新的文章 介绍自己为公司的 WebForm 遗留系统使用 Blazor 重写前端 UI 的经历 什么是Blazor组件 Blazor 应用是使用 Razor 组件构建的 组件是用户界面 UI 的自包含部分