简介

Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性。

  • 使用 C# 语言创建丰富的交互式 UI
  • 共享前后端应用逻辑
  • 可以生成混合桌面和移动应用
  • 受益于 .NET 的性能、可靠性和安全性
  • 需要有 HTML、CSS、JS 相关基础(开发 UI 框架的话)
  • 组件化设计,类似 React、Vue 等前端框架

组件

Blazor 应用基于组件。 Blazor 中的组件是指 UI 元素,例如页面、对话框或数据输入窗体,甚至小到一个输入框。

  • 定义灵活的 UI 呈现逻辑
  • 处理用户事件
  • 可以嵌套和重用 (大大提高开发效率和维护成本)
  • 可作为 Razor 类库或 NuGet 包共享和分发
  • 有 Razor 标记页(.razor文件)和纯 C# 高级写法两种编写形式

1. Razor 常用写法

此写法为 HTML 和 C# 混合开发,HTML 结构清晰,示例如下:

<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code {
private int currentCount = 0; private void IncrementCount()
{
currentCount++;
}
}

2. C# 高级写法

如下代码为纯 C# 高级写法,这段代码也是 .razor 文件编译后生成的格式。如果你反编译 Razor 语法写的组件dll,发现上述 HTML 和 C# 混合开发的组件代码与下面类似。

class Counter : ComponentBase
{
private int currentCount = 0; protected override void BuildRenderTree(RenderTreeBuilder builder)
{
//构建 h1 标签
builder.OpenElement(0, "h1");
builder.AddMarkupContent(1, "Counter");
builder.CloseElement(); //构建 P 标签
builder.OpenElement(0, "p");
builder.AddMarkupContent(1, $"Current count: {currentCount}");
builder.CloseElement(); //构建按钮
builder.OpenElement(0, "button");
builder.AddAttribute(1, "class", "btn btn-primary");
builder.AddAttribute(2, "onclick", EventCallback.Factory.Create(this, IncrementCount));
builder.AddMarkupContent(3, "Click me");
builder.CloseElement();
} private void IncrementCount()
{
currentCount++;
}
}

上述 BuildRenderTree 方法代码较长,我们可以将 UI 元素封装成扩展方法,button封装成组件,这样构建组件既方便又可读。使用扩展方法后组件代码改进如下:

class Counter : ComponentBase
{
private int currentCount = 0; protected override void BuildRenderTree(RenderTreeBuilder builder)
{
//构建 h1 标签
builder.H1("Counter");
//构建 P 标签
builder.P($"Current count: {currentCount}");
//构建按钮
builder.Component<Button>()
.Set(c => c.Style, "btn btn-primary")
.Set(c => c.Text, "Click me")
.Set(c => c.OnClick, IncrementCount)
.Build();
} private void IncrementCount()
{
currentCount++;
}
}

Web 应用

Blazor Web应用提供了一种基于组件的体系结构,该体系结构具有在单个解决方案中实现服务器端呈现和完整的客户端交互性的能力。在这种体系结构中,你可以在服务器端和客户端呈现模式之间进行切换,甚至可以在同一页面中混合使用这两种模式。

Blazor Web应用可以通过静态呈现来自服务器的HTML内容来响应,这种方式的优点是能够快速将UI传送到浏览器。由于UI呈现在服务器上快速执行,所以无需下载大型JavaScript捆绑包,从而大大加快了页面加载速度。

Blazor Web应用还支持交互式服务器呈现,这种方式通过与浏览器的实时连接在服务器上处理UI交互。这种呈现方式可以实现丰富的用户体验,就像客户端应用所提供的那样,不过无需创建API终结点就能访问服务器资源。

此外,Blazor Web应用也支持通过客户端呈现来处理交互。这种呈现方式依赖于使用可随附应用下载的WebAssembly构建的.NET运行时。在WebAssembly上运行Blazor时,.NET代码可以访问浏览器的完整功能,并可与JavaScript互操作。 .NET 代码在浏览器的安全性沙盒中运行,沙盒提供的保护可防御客户端计算机上的恶意操作。

对于独立Blazor WebAssembly应用,该应用可以完全在浏览器中直接运行,无需服务器参与。对于这种应用,资产可作为静态文件部署到可为客户端提供静态内容的Web服务器或服务中。下载后,可以将独立Blazor WebAssembly应用作为渐进式Web应用(PWA)进行缓存并脱机执行。

混合应用

Blazor Hybrid 允许在本地客户端应用中将 Razor 组件与适用于 Web、移动和桌面平台的本机及 Web 技术进行混合使用。其实现方式是,代码在 .NET 进程中以本地形式运行,并使用本地互操作通道将 Web UI 呈现在嵌入式 Web View 控件中。

混合应用采用 .NET Multi-platform App UI (.NET MAUI)来构建,这是一个跨平台框架,利用 C# 和 XAML 来创建本机移动应用和桌面应用。

再学Blazor——概述的更多相关文章

  1. 【C】 01 - 再学C语言

    “C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了”.这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有 ...

  2. 再聊 Blazor,它是否值得你花时间学习

    之前写了一篇文章<快速了解 ASP.NET Core Blazor>,大家关心最多的问题是,我该不该花时间去学习 Blazor.今天聊聊这个话题,并表达一下我个人的看法. 在此之前,我还是 ...

  3. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  4. 再学Java 之 interface的成员变量

    前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...

  5. 不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧

    老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 读 ...

  6. 再学python类(终结篇)

    续写 初学python类,这几天吃坏东西了,拖着虚弱的身躯写的.有些乱请各位看官海涵. 声明:本人编程新手,还在学习中.所表述的东西都是基础语法之类的,分享我的学习笔记.还望多多指点,我一定虚心接受. ...

  7. 他学习一年Python找不到工作,大佬都说你别再学Python了!

    引言: 都说,滴水穿石非一日之功.然而有些人即使奋斗一辈子也比不上别人一年,别人学习一年比不得你学习一个月.其中缘由,有些人看了大半辈子还没看明白. 即使Python这么火,为何你学习一年的Pytho ...

  8. Java编码方式再学

    一直以来对编码方式对了解不是很深入.建议读下这几篇博文 学点编码知识又不会死:Unicode的流言终结者和编码大揭秘 编码研究笔记 这几篇博文上回答了内心存在的一些问题,这些问题可能也是大家经常遇到的 ...

  9. 一起学Blazor WebAssembly 开发(1)

    最近blazor的WebAssembly 正式版出来了,正好手头有一个项目采用的前后端分离模式做的,后端用的abp vnext(.net core 的一个很著名的框架)框架开发的,其实前端之前考虑的使 ...

  10. 再学ajax--第二天 | 基于php+mysql+ajax的表单注册、登录、注销

    写在前面 ajax学习到了第二天,这次是用第一天封装的ajax函数,后端使用了php+mysql实现基本的注册,登录,注销. php是我前几个月get到的技能,我已经学习到了面向对象,知道各修饰符的含 ...

随机推荐

  1. C# 集合类 入门

    什么是集合类? 集合类的位置在System.Collections.Generic命名空间中. 在我看来,集合类和大学里<数据结构>中所学的各种结构很像.集合类中包含Queue<T& ...

  2. Codeforces Round #877 (Div. 2) A-E

    A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { int n; ...

  3. 聊聊JVM虚方法表和方法调用

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.源码解析.科技故事.项目实战.面试八股等更多硬核文章,首发于公众号「小牛呼噜噜」 大家好,我是呼噜噜,好久没更新文 ...

  4. 春节无法线下社交聚会,来线上“一起X”共享体验

    引语: 共享体验或许是全真互联网时代最显著的标志. 被疫情深刻改变的一年里,人们的社交关系和社交活动正在发生巨大的改变. 一方面,从线下转线上,我们能通过互联网连接更多的人,参与各种形式的社交活动,将 ...

  5. 使用官方推荐的库来测react hook组件

    最近写单元测试的时候遇见了一些问题,当我使用使用jest测React. useRef,  React. useEffect时,总是测不到, 然后我去查阅了一下官方文档,它推荐了使用下面这个库 @tes ...

  6. linux内核编译中常用的目标(二)

    文章目录 一. 目标 all 或者 空 二. 目标 vmlinux 三. 目标 modules 四. 目标 Image/zImage/uImage 1.Image和zImage的区别 2.uImage ...

  7. 【go语言】2.1.3 函数的定义和使用

    在 Go 语言中,函数是一种代码抽象和复用的方式.函数可以接受参数,执行特定的操作,并返回结果. 函数的定义 函数的定义以 func 关键字开始,后面跟着函数名.参数列表.返回值列表(可选)以及函数体 ...

  8. go 判断文件是否存在,并创建

    1 package main 2 3 import ( 4 "fmt" 5 "os" 6 ) 7 8 //判断文件夹是否存在 9 func PathExists ...

  9. 【技术积累】Linux中的命令行【理论篇】【四】

    ar命令 命令介绍 ar命令是Linux系统中的一个工具,用于创建.修改和提取静态库文件(archive files).静态库文件是一组已编译的目标文件的集合,可以被链接到可执行文件中. 命令说明 a ...

  10. [ansible]建立ssh互信

    创建密钥 # 创建基于rsa算法的密钥,也可以创建ed25519算法的密钥,性能比rsa高 # 一般直接回车即可 ssh-keygen -t rsa 少量建立互信 如果主机数不多的话,可以手动建立互信 ...