通过Blazor使用C#开发SPA单页面应用程序(3)

时间:2022-04-17 09:57:58

通过Blazor使用C#开发SPA单页面应用程序(1) - 简介及特点

通过Blazor使用C#开发SPA单页面应用程序(2) - 开发环境

通过Blazor使用C#开发SPA单页面应用程序(3) - 基础知识

通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design Button

今天我们来看看Blazor开发的一些基本知识。

一、Blazor组件结构


Blazor中组件的基本结构可以分为3个部分,如下所示:

//Counter.razor
//Directives section 指令部分
@page "/counter" //Razor HTML section Razor HTML部分
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" onclick="@IncrementCount">Click me</button> //code sections 功能部分
@code {
private int currentCount = ;
private void IncrementCount()
{
currentCount++;
}
}

指令部分:

  • 路由   - @page
  • DI     - @inject
  • 导入库 - @using

Razor HTML 部分:

Razor HTML语法是C#代码与HTML的结合。此部分最终在浏览器中呈现。

指令部分:

组件中的函数部分包含用户操作函数(事件方法),局部变量和从/向父/子组件传递的属性。

当然如果愿意,这部分也可以单独写道类文件中。

二、Blazor的属性和参数


我们看看属性和参数,

<button id="btnClickMe" class="btn btn-primary"
onclick="@IncrementCount">Click me</button>

在这里,在按钮元素的id,class和onclick被称为HTML属性。

类似地,组件的定义方式与HTML元素相同,

 //MyDemo.razor
@page "/myDome"

<h3>MyDemo</h3>

<ChildComponent Title="来自MyDemo"></ChildComponent>

在Child Component中,该属性Title与装饰的子组件函数部分中的属性匹配 [Parameter] 关键字。

//ChildComponent.razor

//Child Component
<div>
<p>标题 : @Title</p>
</div>
@code {
[Parameter]
private string Title { get; set; }
}

运行效果如下:

通过Blazor使用C#开发SPA单页面应用程序(3)

三、Blazor的数据绑定


Blazor的数据绑定同时提供了单向绑定和双向绑定两种机制。

(一)单向绑定:

单向绑定在Blazor中简单直接,无需任何UI刷新。还记得Counter示例吗,他显示了单向数据绑定,

@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="@IncrementCount">Click me</button>

@code {
int currentCount = ; void IncrementCount()
{
currentCount++;
}
}

此处 @currentCount 值根据点击按钮的数量递增Click me。<p>标记元素中的值会自动刷新,无需任何组件刷新。

(二)双向绑定:

在Blazor中可以实现双向绑定,与一些流行的JS语言框架相比,Blazor为双向绑定提供了多种实现方式,Blazor可以优雅地进行编写。

 (1) @bind属性在Blazor中提供双向数据绑定。下面的示例复选框演示在同一组件中的bind属性,

@page "/myDome"

<span>请选择:</span>
<input type="checkbox" @bind="myChecked" />
<p>我选择了 : @myChecked.ToString()</p> @code {
bool myChecked { get; set; } = true;
}

运行效果如下,是不是很简单,很优雅。

通过Blazor使用C#开发SPA单页面应用程序(3)

再来一个控制样式表的例子看看,

@page "/myDome"

<p>
<span>显示/隐藏:</span>
<input type="checkbox" @bind="myChecked" />
</p>
<p style="display:@(myChecked ? "inline":"none")">看到我了</p> @code {
bool myChecked { get; set; } = true;
}

通过Blazor使用C#开发SPA单页面应用程序(3)

(2) @bind属性在Blazor中提供双向数据绑定,但是只提供了默认的绑定事件,如果们想在不同的时机触发双向绑定该怎么办呢,别急同样很简单的,我们看看下面的代码,展示了几种绑定实例,

@page "/myDome"

<p>
<span>onchange 方式一</span>
<input @bind="changeString" />
</p>
<p>
<span>onchange 方式二</span>
<input type="text"
value=
"@changeString"
@onchange="@((UIChangeEventArgs _e) => changeString = _e.Value.ToString())"
/>
</p>
<p>
<span>onchange 方式三</span>
<input @bind-value="changeString" @bind-value:event="onchange" />
</p>
<p>
<span>oninput</span>
<input @bind-value="changeString" @bind-value:event="oninput" />
</p>
<p>这是我输入的内容: @changeString</p> @code {
string changeString = "";
}

运行效果如下,

通过Blazor使用C#开发SPA单页面应用程序(3)

呈现组件时, input元素value的值来自changeString。 当用户在文本框中键入内容并离开时, 将触发事件onchange更改changeString的值。原则上, @bind将表达式的当前值value与changeString相关联, 并使用注册的处理程序来处理更改。
    除了使用@bind语法处理onchange事件之外, 还可以通过使用event参数 (@bind-value:event) 指定@bind-value属性, 使用其他事件来绑定属性或字段。例如第四个文本框就是绑定changeString采用oninput事件的属性,以到达在文本框的值更改时激发。

(三)组件之间绑定:

(1)绑定可识别组件参数, @bind-{property}可在其中跨组件绑定属性值。

//MyDemo.razor

@page "/myDome"

<h1>Parent Component</h1>
<p>当前时间: @ParentNow</p>
<hr /> <ChildComponent @bind-Now="ParentNow" /> <hr />
<button class="btn btn-primary" @onclick="@ChangeTheYear">
更新当前时间
</button> @code {
[Parameter]
public DateTime ParentNow { get; set; } = DateTime.Now; private void ChangeTheYear()
{
ParentNow = DateTime.Now;
}
}
//ChildComponent.razor

<h2>Child Component</h2>

<p>当前时间: @Now</p>

@code {
[Parameter]
public DateTime Now { get; set; } [Parameter]
public EventCallback<DateTime> NowChanged { get; set; }
}

以上代码中,子组件 (ChildComponent) 具有一个Now组件参数和NowChanged回调参数,父组件MyDemo使用ChildComponent并将ParentNow参数从父级绑定到子组件上Now的参数上,如果通过点击MyDemo中的"更新当前时间"按钮来更改属性的值, Now则将更新ChildComponent属性,将新值呈现在 UI中。其中,参数Now是可绑定的, 因为它具有NowChanged与参数类型匹配的伴随事件。按照约定,其等效于

<ChildComponent @bind-Now="ParentNow" @bind-Now:event="NowChanged" />

运行效果:

通过Blazor使用C#开发SPA单页面应用程序(3)

(2)组件之间传递的数据通过组件属性及其属性映射发生,此方法使用委托Action<T>类型。

//MyDemo.razor

@page "/myDome"

<h3>Parent Component</h3>
<p>来自Child组件: @childString</p>
<p>
<input @bind="inputText" />
</p>
<hr />
<ChildComponent ToChild="@inputText"
FromChild="@ReceivedFromChild">
</ChildComponent> @code{
private string inputText = "";
private string childString = ""; private void ReceivedFromChild(string str)
{
childString = str;
StateHasChanged();
}
}
//ChildComponent.razor

<h4>Child Component</h4>
<p>
<input @bind="inputText" />
<button @onclick="@PassToParent">显示到Parent组件</button>
</p>
<p>来自Parent组件 : @ToChild</p> @code{
[Parameter]
private string ToChild { get; set; } [Parameter]
Action<string> FromChild { get; set; } private string inputText = ""; private void PassToParent()
{
FromChild(inputText);
}
}

这里FromChild是ChildComponent中的属性,属性使用Action<string>数据类型将值从Child传递给Parent Component。在Parent中,有相应的接收器函数ReceivedFromChild和字符串参数,这将在ChildComponent中按钮单击并触发通知时触发PassToParent,但是为了通知状态已在父组件中更改,我们使用StateHasChanged()的内置Blazor函数通知组件其状态已更改。

运行效果如下:

通过Blazor使用C#开发SPA单页面应用程序(3)

四、 生命周期方法


(1) OnInitializedAsync和OnInitialized方法,执行代码来初始化组件。要执行异步操作,请在操作上使用OnInitializedAsync和await关键字。

(2)OnParametersSetAsync和OnParametersSet当组件已接收到的参数从其父和值被分配给属性被调用。这些方法在组件初始化后以及每次呈现组件时执行。

(3)OnAfterRenderAsync并OnAfterRender在组件完成渲染后调用。此时填充元素和组件引用。使用此阶段使用呈现的内容执行其他初始化步骤,例如激活对呈现的DOM元素进行操作的第三方JavaScript库。

五、级联值和参数


在某些情况下, 使用组件参数将数据从祖先组件流式传输到附属组件是不方便的, 尤其是在有多个组件层时。 级联值和参数通过提供一种方便的方法, 使上级组件为其所有子代组件提供值。 级联值和参数还提供了一种方法来协调组件。

Blazor提供了一种在整个RenderTree(所有组件)中传递数据的方法,使用CascadingValue和CascadingParameter不需要传递作为组件属性,并且可以通过装饰属性[CascadingParameter]而不用在RenderTree(子组件)中接收值[Parameter]。

//MyDemo.razor

@page "/myDome"

<p><span>姓名:</span><input @bind="@pName" /></p>
<p><span>年龄:</span><input @bind="@pAge" /></p>
<hr />
<CascadingValue Value="@pName" Name="ProfileName">
<CascadingValue Value="@pAge" Name="ProfileAge">
<ParentComponent />
</CascadingValue>
</CascadingValue> @code {
private string pName { get; set; } = "张三";
private int pAge { get; set; } = ;
}
//ParentComponent.razor

<div style="background-color:darkgray">
<p>Parent Component</p>
<div style="padding:10px;">
<ChildComponent />
</div>
</div>
//ChildComponent.razor

<div style="background-color:beige">
<p>Child Component</p>
<p>输入的 姓名: @Name , 年龄 : @Age.ToString()</p>
</div> @code{
[CascadingParameter(Name = "ProfileName")]
string Name { get; set; }
[CascadingParameter(Name = "ProfileAge")]
int Age { get; set; }
}

代码中MyDemo的姓名、年龄穿透ParentComponent直接级联到ChildComponent中。

在这里CascadingParameter,Name参数必须与Name带有CascadingValue组件的属性匹配,如果我们没有提到任何Name,则CascadingParameter中的变量类型与CascadingValue中的Value属性匹配。

运行效果:

通过Blazor使用C#开发SPA单页面应用程序(3)

六、路由


我们在看一个SPA中一个基本但很重要的功能路由。客户端路由可以通过使用@page指令装饰组件来在Blazor中完成。

@page "/myDome"
@page "/myDome/{text}"

@page在上面的示例中应用了两个指令。

第一个允许在没有参数的情况下导航到组件。

第二个@page指令采用{text}route参数并将值赋给Text属性。

好了今天Blazor的组件开发就先学习到这,有意犹未尽的可以查看官方文档深入学习。

通过Blazor使用C#开发SPA单页面应用程序(3)的更多相关文章

  1. 通过Blazor使用C&num;开发SPA单页面应用程序&lpar;1&rpar;

    2019年9月23——25日 .NET Core 3.0即将在.NET Conf上发布! .NET Core的发布及成熟重燃了.net程序员的热情和希望,一些.net大咖也在积极的为推动.NET Co ...

  2. 通过Blazor使用C&num;开发SPA单页面应用程序&lpar;2&rpar;

    今天我们尝试创建一个默认的Blazor应用. 1.安装 .Net Core 3.0需要Visual Studio 2019 的支持. 安装.Net Core 3.0 预览版 SDK版本,注意预览版对应 ...

  3. 通过Blazor使用C&num;开发SPA单页面应用程序&lpar;4&rpar; - Ant Design Button

    前面学习了Blazor的特点.环境搭建及基础知识,现在我们尝试的做个实际的组件. Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组件库,主要用于研发企业级中后台产品.目前官 ...

  4. SPA 单页面应用程序。

    看到这个问题,先说下自己的理解到的程度,再去参考做修正,争取这一次弄懂搞清楚 自己的理解: 单页面应用程序,解决浏览器获取数据刷新页面的尴尬,通过ajax请求获取数据达到异步更新视图的按钮,原理的实现 ...

  5. 单页面应用程序(SPA)的优缺点

    我们通常所说的单页面应用程序通常通过前端框架(angular.react.vue)进行开发,单页面应用程序将所有的活动局限于一个Web页面中,仅在该Web页面初始化时加载相应的HTML.JavaScr ...

  6. Java快速开发平台强大的代码生成器,JEECG 3&period;7&period;5 VUE&plus;ElementUI SPA单页面应用版本发布

    JEECG 3.7.5 VUE+ElementUI SPA单页面应用版本发布 此版本为Vue+ElementUI SPA单页面应用版本,提供新一代风格代码生成器模板,采用Vue技术,提供两套精美模板E ...

  7. 单页面应用程序&lpar;SPA&rpar;

    一.概念 ①在一个页面上实现网站的大部分功能,就是单页面应用程序,是一种常见的网页开发模式. ②整个网站就只有一个Html文件,每次在切换页面时,不需要请求服务器,只要通过本地的js来切换即可.这样可 ...

  8. AngularJs&lpar;SPA&rpar;单页面SEO以及百度统计应用(上)

    只有两种人最具有吸引力,一种是无所不知的人,一种是一无所知的人 问:学生问追一个女孩总是追不上怎么办?回答:女孩不是追来的,是吸引来的,你追的过程是吸引女孩的过程,如果女孩没有看上你,再追都是没有用的 ...

  9. 只需要4步就可以将asp&period;net mvc变成SPA&lpar;单页面&rpar;应用&comma;实现无刷新页面切换&excl;

    SENNA.js Senna.js是一个超快速的单页面应用程序引擎,轻松构建基于Web的现代应用程序,只有大约8KB的JavaScript而没有任何依赖性.还提供非常酷炫的动画效果.想要详细了解的朋友 ...

随机推荐

  1. 《Entity Framework 6 Recipes》中文翻译系列 &lpar;33&rpar; ------ 第六章 继承与建模高级应用之TPH与TPT &lpar;2&rpar;

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-8  嵌套的TPH建模 问题 你想使用超过一层的TPH继承映射为一张表建模. 解 ...

  2. 个人作业-Week2 案例分析

    微软必应词典客户端的案例分析 第一部分 调研,评测 1)bug: 运行平台:iOS 10.0.2 必应词典版本:4.2.2 1. bug标题:词库加载错误 bug详细描述:学习界面中的经典词库出国考试 ...

  3. &lpar;一&rpar;学习MVC之制作验证码

    制作验证码的方法在@洞庭夕照 看到的,原文链接:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 现自己利用该方法制作一个简单的 ...

  4. 字符串匹配算法1-KMP

    前面介绍过,字符串搜索一般来说有三种方式,前缀搜索,后缀搜索,子串搜索.KMP使用的是前缀搜索. 假设p的偏移是i,也就是窗口的位置是i,匹配到位置j+1时发现了不匹配.现在的问题是向前移动窗口到什么 ...

  5. Robots&period;txt - 禁止爬虫

    robots.txt用于禁止网络爬虫访问网站指定目录.robots.txt的格式采用面向行的语法:空行.注释行(以#打头).规则行.规则行的格式为:Field: value.常见的规则行:User-A ...

  6. 将preg&lowbar;replace&lpar;&rpar;改写为preg&lowbar;replace&lowbar;callback&lpar;&rpar;

    preg_replace()函数使用/e修饰符可能带来安全隐患,PHP5.5之后,该用法被抛弃使用,升级为preg_replace_callback().在新版本下运行老版本的代码,会出现错误,如: ...

  7. PHP定界符eof 的使用

    PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话, 肯定要有大量的转义符来对字符串中的引号等 ...

  8. MySQL5&period;6的4个自带库详解

    MySQL5.6的4个自带库详解 1.information_schema详细介绍: information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数 ...

  9. 新建一个Windows Service的方法

    http://www.cnblogs.com/YanPSun/archive/2010/05/22/1741381.html http://blog.csdn.net/m15188153014/art ...

  10. ssm中返回中文字符串时出现乱码?

    问题:返回json格式时,前端ajax请求,响应数据接收正常:     返回String时,响应数据是乱码? 解决:@RequestMapping注解中添加:produces = "text ...