概述

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

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

@page "/"
@layout MyLayout
<h1>Hello, world!</h1>Welcome to your new app.<SurveyPrompt Title="How is Blazor working for you?" />

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

[Microsoft.AspNetCore.Components.LayoutAttribute(typeof(MyLayout))]
[Microsoft.AspNetCore.Components.RouteAttribute("/")]
public partial class Index : Microsoft.AspNetCore.Components.ComponentBase
{#pragma warning disable 1998protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder){__builder.AddMarkupContent(0, "<h1>Hello, world!</h1>\r\n\r\nWelcome to your new app.\r\n\r\n");__builder.OpenComponent<BlazorApp.Client.Shared.SurveyPrompt>(1);__builder.AddAttribute(2, "Title", "How is Blazor working for you?");__builder.CloseComponent();}#pragma warning restore 1998
}

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

创建简单组件

需要注意的是,在Blazor项目中,包括razor页面,布局以及组件都隐式或显示的继承自ComponentBase的。在Blazor.Client项目的Shared文件夹中,我们创建一个Components文件夹用于存放我们自定义的组件。(1)创建页面,并暂且先使用下面的默认内容。(2)然后在_Imports.razor文件中添加@using BlazorApp.Client.Shared.Components,以使得该组件可以全局使用,从这个引用的命名空间来看,我们新建的组件的命名空间默认就是文件所在的位置。(3)在Index.razor页面使用(4)运行后的结果如图所示:

单项绑定

如果读者接触了比较多的前端框架,可能会对理解单项绑定有很大的帮助,这实际上一种插值或者说是动态数据的占位(变量)。大部分情况下,我们都希望我们的组件是可以输出动态内容,那么我们应该如何实现呢?这个时候我们就需要在页面上写一写C#代码了。(1)在MyComponent组件中添加参数,并标记[Parameter]特性(2)在Index页面上,添加按钮和事件功能,可以参考Counter页面的按钮。这个页面的功能我们暂时只关注如何传值即可,也就是在调用MyComponent组件的时候,调用其属性Counter并赋值。(3)运行效果如下所示

组件事件

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

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

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

  @*<h3>My Component</h3>*@这里是自定义组件的区域,我点击了几次 <strong style="color: red">@currentCount</strong>
<br>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>@code {private int currentCount { get; set; }[Parameter]public EventCallback<int> ClickCountCallback { get; set; }private async Task IncrementCount(){currentCount++;await ClickCountCallback.InvokeAsync(currentCount*2);}
}

(2)Index.razor页面

  @page "/"
@layout MyLayout
<h1> </h1>@*Welcome to your new app.*@@*<SurveyPrompt Title="How is Blazor working for you?" />*@<h2>Index页面的CurrentCount=<strong style="color: red">@currentCount</strong></h2><br>
<MyComponent ClickCountCallback="IncrementCount1" />
<br />@code {private int currentCount;private void IncrementCount1(int value){currentCount = value;}
}

使用currentCount接收自定义组件中传来的值。运行效果如下:

Blazor带我重玩前端(五)相关推荐

  1. Blazor带我重玩前端(四)

    布局 Blazor中的布局和MVC中的布局是类似的. 创建布局 新建一个Razor页面,所有新增的布局都要继承LayoutComponentBase,同时标识自定义内容的输出位置,即标识Body的位置 ...

  2. Blazor带我重玩前端(三)

    VS自带的Blazor模板介绍 需要升级VS2019以及.NET Core到最新版(具体的最低支持,我已经忘了,总是越新支持的就越好),以更好的支持自己开发Blazor项目. 使用VS创建Blazor ...

  3. Blazor带我重玩前端(一)

    写在前面 曾经我和前端朋友聊天的时候,我说我希望有一天可以用C#写前端,不过当时更多的是美好的想象,这一切正变得真实-- 什么是Blazor 我们知道浏览器可以正确解释并执行JavaScript代码, ...

  4. Blazor带我重玩前端(六)

    本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第二篇. 双向绑定 概述 如图所示 当点击单项绑定的时候,MyOnewayComponent里的属性值会发生变 ...

  5. Blazor带我重玩前端(二)

    概览 Blazor目前有两种托管模式,一种是Server-Side模式,一种是WebAssembly模式.官方首先支持的是Service-Side模式,使用WebAssembly模式,需要更新到最新版 ...

  6. 一个计算机爱好者的不完整回忆(十五)自带游戏你玩过么?

    Windows自带的小游戏小软件你们都玩过么? Windows捆绑的最古老的程序是啥我不知道,我知道的是纸牌游戏,知道windows做这个游戏干什么么?是为了让大家练习鼠标操作的,你会用到拖动.双击等 ...

  7. 柚缘航海:Tik Tok电商带货怎么玩?

    以下全是吐血干货(建议点赞+收藏,再慢慢看)如果想了解更多的干货,可以关注旭柚. 我们讲了Tik Tok目前常见的五种变现方式,这篇文章就给大家着重来讲讲其中的创作者基金和电商带货. 一.创作者基金 ...

  8. 【重识前端】闭包与模块

    最近在写[重拾前端]系列,下面有几个快速通道,大家自取 [重识前端]原型/原型链和继承 [重识前端]闭包与模块 [重识前端]全面攻破this [重识前端]一次搞定JavaScript的执行机制 [重识 ...

  9. winter重学前端——训练营预习课

    重学前端读书笔记 javascript javascript 类型 javascript对象 面向对象与基于对象 模拟类 JavaScript 中的对象分类 javascript 执行 Promise ...

最新文章

  1. mciSendString用法
  2. python 类函数 成员函数_python中的类函数、静态函数、成员函数以及类变量、成员变量...
  3. 关于CS1061报错(XX不包含XXX的定义,并且找不到类型为XX的第一个参.....)的一种可能的解决的办法...
  4. 深度学习pytorch--线性回归(二)
  5. poj1949Chores(建图或者dp)
  6. 信息学奥赛一本通 1117:整数去重 | OpenJudge NOI 1.9 13
  7. GitHub 再次呼吁用户采取双因素认证机制
  8. 如何在TypeScript的`window`上显式设置新属性?
  9. 一种对云主机进行性能监控的监控系统及其监控方法
  10. 汪琪玩Excel:只复制可见单元格
  11. c语言买100只鸡,C语言经典问题--百钱买百鸡问题
  12. python中def main是什么意思_Python main()函数解析
  13. 那些酷炫的网页你也可以做到——第二篇(HTML排版)
  14. 日本国家旅游局的新版《日本本土风情导览》主打人迹罕至的名胜、劲酷的景点以及鲜为人知的攻略
  15. remote-incorrect-username-or-password-access-token
  16. Linux的基本操作——总结版
  17. 现在当兵有什么待遇复原以后_大学生当兵有什么好处 退伍后待遇怎么样
  18. 【优化控制】基于遗传算法实现优化LQR控制器含Matlab源码
  19. ajdt插件安装后无效_使用Eclipse和AJDT开发面向方面的Java应用程序
  20. 抖音视频解析的工具类

热门文章

  1. webform数据导出
  2. 随机给出三十道四则运算题目
  3. 在Cocos2d中实现能够惯性拖动的选择界面
  4. [设计模式]桥接模式
  5. VIM之Project 项目管理工具
  6. 烟袋斜街-后海,印象已模糊
  7. android bilibili搜索框,仿bilibili搜索框效果(三句代码实现)
  8. Teams Bot开发系列:Activity和Turn
  9. 如何在PowerPoint演示文稿中使用iTunes音乐
  10. 新垣结衣自拍照_如何阻止自拍照出现在iPhone的自拍照专辑中