Blazor带我重玩前端(五)

摘要:
概述本文主要讨论Blazor事件。因为有很多blazor事件,它将被分为两部分。这是第一部分,接下来是第二部分。需要注意的是,当您在编写Blazor项目时遇到问题时,可以查看Razor页面生成的更多C#代码。要创建简单的组件,应该注意,在Blazor项目中,Razor页面、布局和组件是隐式或显式继承自ComponentBase的。在Blazor中,在Client项目的Shared文件夹中,我们创建了一个Components文件夹来存储定制的组件。
概述

本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第一篇,后续会有第二篇。

我们可以视组件是一个类,我们先看一下前文所说的Index.Razor页面生成的C#代码。

在此,先补充一下该页面的原始代码:

   1:  @page "/"
   2:  @layout MyLayout
   3:  <h1>Hello, world!</h1>
   4:   
   5:  Welcome to your new app.
   6:   
   7:  <SurveyPrompt Title="How is Blazor working for you?" />

Index.razor页面在项目编译后会生成Index.razor.g.cs文件,其位置如图所示,在obj文件夹下面:

1

具体的源码如下:

   1:  [Microsoft.AspNetCore.Components.LayoutAttribute(typeof(MyLayout))]
   2:  [Microsoft.AspNetCore.Components.RouteAttribute("/")]
   3:  public partial class Index : Microsoft.AspNetCore.Components.ComponentBase
   4:  {
   5:      #pragma warning disable 1998
   6:      protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
   7:      {
   8:          __builder.AddMarkupContent(0, "<h1>Hello, world!</h1>

Welcome to your new app.

");
   9:          __builder.OpenComponent<BlazorApp.Client.Shared.SurveyPrompt>(1);
  10:          __builder.AddAttribute(2, "Title", "How is Blazor working for you?");
  11:          __builder.CloseComponent();
  12:      }
  13:      #pragma warning restore 1998
  14:  }

可以看到,以上代码并不难理解,同时它还有两个特性,一个是布局的标识,一个是路由的标识。紧接着就是该类重写了BuildRenderTree方法,这个以后会说。需要提醒的是,大家在写Blazor项目遇到问题时,可以多查看razor页面所生成的C#代码。

创建简单组件

需要注意的是,在Blazor项目中,包括razor页面,布局以及组件都隐式或显示的继承自ComponentBase的。

在Blazor.Client项目的Shared文件夹中,我们创建一个Components文件夹用于存放我们自定义的组件。

(1)创建页面,并暂且先使用下面的默认内容

2

(2)然后在_Imports.razor文件中添加@using BlazorApp.Client.Shared.Components,以使得该组件可以全局使用,从这个引用的命名空间来看,我们新建的组件的命名空间默认就是文件所在的位置

3

(3)在Index.razor页面使用

4

(4)运行后的结果如图所示

5

单项绑定

如果读者接触了比较多的前端框架,可能会对理解单项绑定有很大的帮助,这实际上一种插值或者说是动态数据的占位(变量)。

大部分情况下,我们都希望我们的组件是可以输出动态内容,那么我们应该如何实现呢?这个时候我们就需要在页面上写一写C#代码了。

(1)在MyComponent组件中添加参数,并标记[Parameter]特性

6

(2)在Index页面上,添加按钮和事件功能,可以参考Counter页面的按钮

7

这个页面的功能我们暂时只关注如何传值即可,也就是在调用MyComponent组件的时候,调用其属性Counter并赋值。

(3)运行效果如下所示

1


组件事件

添加组件自定义事件,其实就是声明一个EventCallback<int>类型的组件参数,如下代码所示:

   1:  [Parameter]
   2:  public EventCallback<int> EventSample { get; set; }

(1)自定义组件修改

增加一个计数方法,可以参考Counter中代码。在IncrementCount方法中,采用await ClickCountCallback.InvokeAsync(currentCount*2)方式传值给Index.Razor页面,页面源码:

   1:  @*<h3>My Component</h3>*@
   2:   
   3:  这里是自定义组件的区域,我点击了几次 <strong style="color: red">@currentCount</strong>
   4:  <br>
   5:  <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
   6:   
   7:  @code {
   8:      private int currentCount { get; set; }
   9:   
  10:      [Parameter]
  11:      public EventCallback<int> ClickCountCallback { get; set; }
  12:   
  13:      private async Task IncrementCount()
  14:      {
  15:          currentCount++;
  16:          await ClickCountCallback.InvokeAsync(currentCount*2);
  17:      }
  18:  }

(2)Index.razor页面

   1:  @page "/"
   2:  @layout MyLayout
   3:  <h1>&nbsp;</h1>
   4:   
   5:  @*Welcome to your new app.*@
   6:   
   7:  @*<SurveyPrompt Title="How is Blazor working for you?" />*@
   8:   
   9:  <h2>Index页面的CurrentCount=<strong style="color: red">@currentCount</strong></h2>
  10:   
  11:  <br>
  12:  <MyComponent ClickCountCallback="IncrementCount1" />
  13:  <br />
  14:   
  15:  @code {
  16:      private int currentCount;
  17:   
  18:      private void IncrementCount1(int value)
  19:      {
  20:          currentCount = value;
  21:      }
  22:  }

使用currentCount接收自定义组件中传来的值。

运行效果如下:

2

Index.razor页面生成的C#源码如下所示:

8

会往RenderTreeBuilder对象中添加AddAttribute,用于接收自定义组件回调过来的值。





免责声明:文章转载自《Blazor带我重玩前端(五)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇全方位打造 Eclipse 自定义开发环境解决Android Studio的安装问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端简历

简历的本质在写简历之前,我们必须清楚的了解一件事情,那就是简历是什么?它不是人生履历,不是项目清单,也不是技能大放送。简历的存在只有一个目的 —— 帮你约到面试。只要能达到这个目的,简历可以是一段视频,一个开源项目,一张照片,甚至是一行字,比如: I wrote javascript 当然,绝大部分简历的形式,就是我们所熟知的,是一篇文章。即使你通过其他方...

5款vue前端UI框架

Vue.js是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。 实用的 Vue.js组件库可以帮助我们快速搭建页面,下面介绍小编认为比较受欢迎的五个vue前端ui框架。 TOP5——Vue-Blu Vue-Blu是基于Vuejs和Bulma开发的开源UI组件库。旨在为PC端的前端开发(特别是中后台产品)提供一...

使用 dumi 打包 React 组件库并生成文档站点

对于前端团队来说,公共组件库是必须的,紧接着就是完善组件库的文档 社区里关于快速生成文档的工具有很多,如 StoryBook、Docz、Gatsby 在调研了几种文档工具之后,最终我选择了 umi 家族的另一个成员:dumi 因为它集成了 docz,以及打包工具father-build,同时支持创建自己的Markdown 组件 当然最重要的是,我的项目是基...

三: vue组件开发及自动化工具vue-cli

一: 组件化开发 1 组件 1: 组件(Component)是自定义封装的功能。在前端开发过程中,经常出现多个网页的功能是重复的,而且很多不同的网站之间,也存在同样的功能。 2: 什么是组件 而在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js来定义功能的特效,因此就产生了把一个功能相关的[HTML、cs...

UI组件库Kendo UI for jQuery R3 2021

9月我们正式迎来了Kendo UI for jQueryR3 2021新版!在我们的新版中,添加了高度需求的组件,如 OrgChart、Heatmap、Popover 和 Captcha,以及现有组件中的各种功能,同时还发布了全新的UI Kit for Figma组件!接下来,跟我们一起了解一下这些功能吧! Kendo UI for jQuery R3 2...

云平台设计系统,助力业务快速开发

用友进入3.0阶段,敏捷开发、逆向开发、双披萨饼原则快速作战,“用户之友”价值回归,这些都为快速原型、高保真验证、快速开发、体验一致提出了更高的要求。也带来了更大的压力。 新的变化体现在: 1、阶段性发版变成持续迭代,周期短,进度快 2、单周或双周迭代留给各个角色的时间非常少 3、被C端应用“惯坏”的用户要求更高的B端体验 4、为避免资源浪费,研发流程必须...