前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Blazor带我重玩前端(五)

Blazor带我重玩前端(五)

作者头像
Edison.Ma
发布2020-08-12 15:14:59
1.2K0
发布2020-08-12 15:14:59
举报
文章被收录于专栏:DotNet Core圈圈DotNet Core圈圈

概述

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

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

代码语言:javascript
复制
@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文件夹下面:

具体的源码如下:

代码语言:javascript
复制
[Microsoft.AspNetCore.Components.LayoutAttribute(typeof(MyLayout))]
[Microsoft.AspNetCore.Components.RouteAttribute("/")]
public partial class Index : Microsoft.AspNetCore.Components.ComponentBase
{
    #pragma warning disable 1998
    protected 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类型的组件参数,如下代码所示:

代码语言:javascript
复制
[Parameter]
public EventCallback<int> EventSample { get; set; }

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

代码语言:javascript
复制
  @*<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页面

代码语言:javascript
复制
  @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接收自定义组件中传来的值。运行效果如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet技术平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 创建简单组件
  • 单项绑定
  • 组件事件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档