Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Blazor WebAssembly 修仙之途 - 组件与数据绑定

Blazor WebAssembly 修仙之途 - 组件与数据绑定

作者头像
晓晨
发布于 2020-06-02 02:54:22
发布于 2020-06-02 02:54:22
2.3K00
代码可运行
举报
文章被收录于专栏:晓晨的专栏晓晨的专栏
运行总次数:0
代码可运行

一.前言

在第一篇文章中,有提到过组件(Component)这个概念。组件在 Blazor 中是必不可少的,UI 全靠它组装起来,和前端的 JS 组件是一个意思,比如:vue component、react component 等等。借用官方文档的描述:

Blazor 应用是使用组件构建的。 组件是自包含的用户界面 (UI) 块,例如页、对话框或窗体。 组件包含插入数据或响应 UI 事件所需的 HTML Tag和处理逻辑。 组件非常灵活且轻量。 可在项目之间嵌套、重复使用和共享。

二.组件

组件一般以 .razor 为文件名后缀,且组件名必须以大写字母开头(猜测可能是和VUE里的命名限制一样,表面和Html标签名重复)。

我们新建的项目,Shared 文件夹中就有三个组件:

左侧导航菜单组件:

在主布局组件中应用了导航菜单组件:

更多关于组件的资料请查阅官方文档:创建和使用 ASP.NET Core Razor 组件

三.数据绑定

1.介绍

Razor 组件通过名为 @bind 的HTML元素属性提供数据绑定功能,这个绑定是双向的。

@bind 是区分大小写的,例如:@BIND@Bind 都是错误的,下面写了一个例子,将 CurrentValue 绑定到两个文本框中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="row">
    <div class="col-6">
        <input class="form-control" type="text" @bind="CurrentValue" />
    </div>
    <div class="col-6">
        <input class="form-control" type="text" @bind="CurrentValue" />
    </div>
</div>

<div class="row">
    <button class="btn btn-primary" @onclick="ChangeValue">变 更</button>
</div>

@code
{
    public int CurrentValue { get; set; } = 0;

    private void ChangeValue()
    {
        CurrentValue ++;
    }
}

需要注意的是在文本框的绑定中,仅当呈现组件时,UI才会更新文本框,而不响应于更改属性的值。由于组件是在事件处理程序代码执行后呈现的,因此属性更新通常在触发事件处理程序后立即反映在UI中。

@bind="CurrentValue" 等同于以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input value="@CurrentValue"
    @onchange="@((ChangeEventArgs __e) => CurrentValue = 
        __e.Value.ToString())" />
        
@code {
    public int CurrentValue { get; set; } = 0;
}

点击按钮,变更了值,也会应用到文本框中:

2.变更绑定事件

上面小节中,默认绑定了 onchange 事件,只有文本框失去焦点才会触发,体验不是很好,那么可不可以在输入的时候就同步更新值呢,当然是可以的,解决方案就是变更绑定事件为 oninput,通过设置@bind:event属性来变更绑定事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="col-6">
    <input class="form-control" type="text" @bind="CurrentValue" @bind:event="oninput" />
</div>
<div class="col-6">
    <input class="form-control" type="text" @bind="CurrentValue" @bind:event="oninput" />
</div>

3.输入错误的值

我们设置的 CurrentValue 的类型是 int ,如果我们输入字母,那么字母将不会被接受,同时值会恢复到输入前的正确值。

4.子父组件数据传递

在 vue、react 等 js 中,都有子父组件传值概念,Blazor 也不例外。

(1)父传子

新建一个子组件命名为 ChildComponent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="row">
    <h2>子组件</h2>
</div>

<div class="row">
    <span>Year: </span> <input class="form-control" type="text" value="@Year" />
</div>

@code {
    [Parameter]
    public int Year { get; set; }

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

定义一个 Year 属性和 EventCallback<int> 类型的属性 YearChanged

新建一个父组件命名为ParentComponent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="row">
    <h2>父组件</h2>
</div>

<div class="row">
    <span>ParentYear: </span> <input class="form-control" type="text" @bind="ParentYear" @bind:event="oninput"/>
</div>

<ChildComponent @bind-Year="ParentYear" />

@code {
    [Parameter]
    public int ParentYear { get; set; } = 1978;
}

在页面中引用父组件:

YearChanged 是一个约定命名,不能更改,更改将会报错:

EventCallback 用于子父组件嵌套时公开事件,比如 YearChanged 就公开了子组件 Year 属性的 changed 事件。父组件里,通过 @bind-Year 来绑定 Year 的 changed 事件,然后将父组件 ParentYear 的值传递过去,达成父级组件向子级组件传递值。

<ChildComponent @bind-Year="ParentYear" /> 等同于 <ChildComponent @bind-Year="ParentYear" @bind-Year:event="YearChanged" /> ,如果使用后者,那么事件命名将不会受约定命名限制。

运行效果:

(2)子传父(链式绑定)

子传父,无法直接通过 @bind 来实现,需要单独指定事件处理程序和值,我们更改上面的子组件,定义一个 OnYearChanged 事件,并将其绑定到文本框的 oninput 事件,在事件里手动更新了 Year的值,并调用 YearChanged 来进行传递。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="row">
    <h2>子组件</h2>
</div>

<div class="row">
    <span>Year: </span> <input class="form-control" type="text" @oninput="OnYearChanged" value="@Year" />
</div>

@code {
    [Parameter]
    public int Year { get; set; }

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

    private Task OnYearChanged(ChangeEventArgs e)
    {
        Year = int.Parse(e.Value.ToString());

        return YearChanged.InvokeAsync(Year);
    }
}

运行:

四.资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(8/30)Blazor系列:CSS样式修改和数据绑定详述
现在每次启动项目,预设路径都会是/,但我们目前没有Component套用这个路由,要自己切换到Post实在有些麻烦,另外Menu的图案也跟名称不符,我们来调整一下。
沙漠尽头的狼
2021/12/16
2.8K0
(8/30)Blazor系列:CSS样式修改和数据绑定详述
C# 一分钟浅谈:Blazor Server 端开发
随着 .NET Core 的不断成熟与完善,Microsoft 推出了 Blazor 框架,旨在简化 Web 应用程序的开发过程。Blazor 支持两种模式:Blazor Server 和 Blazor WebAssembly。本文将重点介绍 Blazor Server 端开发,从基础概念到常见问题及解决方案,帮助开发者快速上手。
Jimaks
2024/11/17
2120
Vue自定义组件如何使用v-model
我们在使用vue的时候如果想实现双向数据绑定,就会使用v-model,代码如下:
挥刀北上
2019/07/19
3.3K0
Blazor-父子组件传值
在子组件中可以使用[Parameter]特性将组件中的属性暴露出来,让调用方可以控制特性所标记的属性的值,在调用方可以直接传具体的值,也可以传变量,这里我们传入变量就可以完成父组件给子组件传值的操作,示例如下: 子组件:
MaybeHC
2025/02/12
570
Blazor-父子组件传值
43. Vue组件案例-评论列表
好了,现在基本页面已经写好了。但是为了演示父组件与子组件之间的传值以及调用关系,我将上面提交评论的部分抽出来作为一个子组件。
Devops海洋的渔夫
2020/07/20
2.2K0
43. Vue组件案例-评论列表
ASP.NET Core Blazor Webassembly 之 数据绑定
上一次我们学习了Blazor组件相关的知识(Asp.net Core Blazor Webassembly - 组件)。这次继续学习Blazor的数据绑定相关的知识。当代前端框架都离不开数据绑定技术。数据绑定技术以数据为主导来驱动UI界面,用户对数据的修改会实时提现在UI上,极大的提高了开发效率,让开发者从繁琐的dom操作中解脱出来。对于数据绑定.NET开发者并不会陌生,WPF里大量应用数据绑定技术,有过WPF开发经验的同学其实很容易理解前端的数据绑定。总之数据绑定技术及其概念、思维极其重要。下面让我们看看Blazor的数据绑定技术。
MJ.Zhou
2020/06/19
4.9K1
Blazor学习之旅(5)数据绑定
如果希望 HTML 元素显示值,可以编写代码来更改显示内容。如果值发生更改,则需要编写额外的代码以更新显示内容。
Edison Zhou
2023/07/25
5450
Blazor学习之旅(5)数据绑定
(13/30)Blazor系列:EventCallback, event from child to parent
目前的4篇日志是来自我们写好的假数据,但正常来说不会这样做,而是有个按钮让用户点击了之后,增加或减少日志的数量。
沙漠尽头的狼
2021/12/21
1.4K0
(13/30)Blazor系列:EventCallback, event from child to parent
Blazor WebAssembly 修仙之途 - 初尝
Blazor 是一个可是使用 .NET/C# 来编写交互式客户端的 Web UI 框架,在官网有一句话概括 “Build client web apps with C#”。在 Blazor 里面有三个比较重要的概念:
晓晨
2020/06/02
3.6K0
C#一分钟浅谈:Blazor WebAssembly 开发
随着Web技术的发展,前端开发越来越受到重视。传统的Web应用通常依赖于JavaScript来实现交互逻辑,但随着.NET Core的推出,微软为我们带来了Blazor框架,使得我们可以在Web前端使用C#进行开发。Blazor有两种模式:Server和WebAssembly。本文将重点介绍Blazor WebAssembly模式的开发,包括常见问题、易错点及如何避免。
Jimaks
2024/11/15
2240
[C#] Blazor练习3 -数据绑定
Blazor中Razor组件通过一个名为@bind的HTML元素属性提供数据绑定功能,数据绑定的对象可以为字段、属性或表达式值。例如:
科控物联
2022/03/29
5140
[C#] Blazor练习3 -数据绑定
ASP.NET Core Blazor Webassembly 之 组件
现在前端几大轮子全面组件化。组件让我们可以对常用的功能进行封装,以便复用。组件这东西对于搞.NET的同学其实并不陌生,以前ASP.NET WebForm的用户控件其实也是一种组件。它封装html代码,封装业务逻辑,对外提供属性事件等信息,它完完全全就是个组件,只是用户控件跑在服务端,而现在的组件大多数直接跑在前端。现在Blazor Webassembly微软正式把组件带到前端,让我们看看它是怎么玩的。
MJ.Zhou
2020/06/19
1.6K0
Blazor学习之旅 (13) Razor类库的使用
在上一篇我们学习了Blazor和JavaScript的互操作性,这一篇我们了解下如何创建和使用Razor类库。
Edison Zhou
2024/01/03
4420
Blazor学习之旅 (13) Razor类库的使用
Blazor带我重玩前端(六)
本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第二篇。
AI.NET 极客圈
2020/09/01
1.3K0
Blazor带我重玩前端(六)
7个 Vue3 中的组件通信方式
本文采用<script setup />的编写方式,比options API更自由。然后我们会讲以下七种组件通信方式:
唐志远
2023/08/01
3240
7个 Vue3 中的组件通信方式
ASP.NET Core Blazor 初探之 Blazor WebAssembly
最近Blazor热度很高,传说马上就要发布正式版了,做为微软脑残粉,赶紧也来凑个热闹,学习一下。
MJ.Zhou
2020/05/18
6.6K0
ASP.NET Core Blazor 初探之 Blazor WebAssembly
ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证
前文索引: ASP.NET Core教程【一】关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand">RazorPagesMovie</a> 这段代码中用到asp-page这样的一个特有属性,这是razor page特有的, 这是一个锚点属性,它的值将被编译到a标签的href属性上; 跟多的时候,我们会像下面这样使用锚点属性 <a asp-controller="Speaker" asp-
liulun
2018/01/12
1.6K0
Blazor一个简单的示例让我们来起飞
Blazor他是一个开源的Web框架,不,这不是重点,重点是它可以使c#开发在浏览器上运行Web应用程序.它其实也简化了SPA的开发过程.
HueiFeng
2020/05/06
1.3K0
Blazor WASM 实现人民币大写转换器
.NET 5 正式发布已经有一段时间了,其中 Blazor 技术是该版本的亮点之一。作为微软技术的被坑者,年少的我曾经以为 SilverLight 能血虐 Flash,Zune 能团灭 iPod,WP 能吊打 iPhone,UWP 能统一全平台…… 可是后…… 最终步入大龄程序员的我发现,只有陪伴了我将近 20 年的ASP.NET 还没有完蛋。于是我这两天花了点时间,尝试将我的一个 UWP 小工具用 Blazor 重写,分享给大家。
Edi Wang
2021/03/11
2.2K0
Blazor WASM 实现人民币大写转换器
Blazor VS Vue
在其最简单的模式中,您可以简单地将核心 Vue 脚本包含在您的应用程序中,然后开始构建您的组件。
Chester Chen
2022/08/18
4.4K0
Blazor VS Vue
相关推荐
(8/30)Blazor系列:CSS样式修改和数据绑定详述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验