1.环境

VS2019 16.5.1

.NET Core SDK 3.1.200

Blazor WebAssembly Templates 3.2.0-preview2.20160.5

2.默认绑定

2.1.使用方法

Blazor中Razor组件通过一个名为@bind的HTML元素属性提供数据绑定功能,数据绑定的对象可以为字段、属性或表达式值。例如:

<input @bind="_bindValue1" />
@code{
private int _bindValue1 { get; set; } = ;
}

@bind默认绑定的是元素的onchange事件,通过在组件中添加一个元素p可以看出效果,每当input离开focus或者回车时,p中的值才会更新:

<p>@_bindValue1</p>

2.2.等价单向绑定

由于@bind绑定的数据是强类型,在从input的value到绑定的数据时,会做相关的数据转换,如果转换失败,则会保持上次的值不变。也就是说,默认绑定类似于以下代码:

<input value="@_bindValue1" @onchange="(e) => { _bindValue1 = int.TryParse(e.Value.ToString(), out var val) ? val : _bindValue1;}" />

之所以说是类似,是因为当无法转换时,例如输入的是小数123.1,当触发onchange事件时,通过@bind绑定数据时,input中value会变回上一次的整数;而这种单向绑定时,input的value显示的依然为123.1,不过通过C#获取_bindValue1的值时,得到的与通过@bind绑定数据时的行为是一致的。在单向绑定时,即使使用StateHasChanged(),由于渲染引擎未发现状态的变化,依然是不会改变显示的值。

3.字符串格化

@bind可以使用@bind:format指定字符串的格式化表达式,个人觉得此功能有些鸡肋,其支持的格式表达式较为有限,而且还具有一些其他的问题,不知道是bug还是本身就这样设计的,我目前已经在AspNetApiDocs提交了相关的反馈。

4.修改默认绑定事件

在有些时候,我们可能需要实时响应input中的输入内容,例如搜索提示,这个时候需要相应input的oninput事件,@bind通过指定event参数来在指定绑定属性或字段响应的事件,其形式为@bind:event="eventName",例如:

<input @bind="_bindValue2" @bind:event="oninput" />

5.组件间的事件绑定

5.1.父组件到子组件

通过使用@bind-{PROPERTY}的形式,可以将属性值从父组件向下绑定到子组件,其中PROPERTY必须为组件参数,例如在子组件中添加一个DateTime参数,要想使用@bind为此子组件在父组件中绑定数据,按照约定还必须定义一个名为事件{PROPERTY}Changed的事件,这个事件用于响应当子组件中更改组件参数时,子组件对数据的回调。代码如下:

<input @bind="DateTime" @bind:format="yyyy-MM-dd HH:mm:ss" />
<p>@DateTime.ToString("o")</p>
[Parameter]
public DateTime DateTime { get; set; } = DateTime.Now;
[Parameter]
public EventCallback<DateTime> DateTimeChanged { get; set; }

这样就可以在父组件中使用如下代码进行数据绑定了:

<Component @bind-DateTime="_dateTime" />

这行代码实际上等价于以下代码:

<Component @bind-DateTime="_dateTime" @bind- DateTime:event=" DateTime Changed"/>

因此我们可以自定义上述约定中的默认事件{PROPERTY}Changed的名称,现在效果如下(请注意,此时如果子组件更新的参数,数据是无法流向父组件的):

5.2.子组件到父组件

通常,参数流是从上往下的,即从父组件流到子组件,这是与渲染流程是保持一致的。因此当父组件更新子组件的组件参数时,往往子组件会很容易的进行渲染,但是当子组件向父组件传递数据,则必须使用相应的回调事件。这种限制是组件设计必然结果。@bind在组件间进行数据的双向绑定正式通过在5.1.中的所介绍的{PROPERTY}Changed事件来向父组件进行数据的传递的。

首先,在之前组件间事件绑定的代码上为input的oninput事件添加响应函数ChangeParentValue:

private async Task ChangeParentValue(ChangeEventArgs e)
{
var dateStr = e.Value.ToString();
await DateTimeChanged.InvokeAsync(DateTime.Parse(dateStr));
}

注意,在这里代码并没有直接更改本组件中的组件参数DateTime,因为父组件中更改了状态后,会将该数据传递到子组件,子组件会重新渲染。按照微软官方的代码,这个是可以更改本组件中的组件参数DateTime的。现在,效果如下:

代码:LearningBlazor

本文参考:ASP.NET Core Blazor 数据绑定

Blazor入门笔记(5)-数据绑定的更多相关文章

  1. Blazor入门笔记(6)-组件间通信

    1.环境 VS2019 16.5.1.NET Core SDK 3.1.200Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.简介 在使用B ...

  2. Blazor入门笔记(4)-组件的生命周期

    1.环境 VS2019 16.5.1.NET Core SDK 3.1.200Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.简介 Blaz ...

  3. Blazor入门笔记(3)-C#与JS交互

    1.环境 VS2019 16.5.1 .NET Core SDK 3.1.200 Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.前言 Bl ...

  4. Blazor入门笔记(2)-分部类组件与组件的继承

    1.前言 本文接自Blazor的组件(1)-从0构建一个组件 2.分部类组件 Razor组件你可理解为就是一个类名与文件名相同的类,因此,可以新建一个同名的partial类,将组件中@code里面的代 ...

  5. Blazor入门笔记(1)-从0构建一个组件

    1.环境 VS2019 16.5.1 .NET Core SDK 3.1.200 Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.创建项目 ...

  6. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  7. ES6入门笔记

    ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...

  8. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  9. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

随机推荐

  1. Typora[MarkDown编辑器]+(PicGo+Github+JsDelivr)[个人图床] ,开启你的高效创作

    使用Typora搭配Picgo开启你的高效创作 0x00 一切都要从MarkDown说起 富文本语言的弊端 平常我们最常用的写作工具,无非是富文本编辑器中的代表--微软家的Office Word.这种 ...

  2. Sequence to Sequence Learning with Neural Networks论文阅读

    论文下载 作者(三位Google大佬)一开始提出DNN的缺点,DNN不能用于将序列映射到序列.此论文以机器翻译为例,核心模型是长短期记忆神经网络(LSTM),首先通过一个多层的LSTM将输入的语言序列 ...

  3. TARS基金会:构建微服务开源生态

    导语 在20世纪60至70年代,软件开发人员通常在大型机和小型机上使用单体架构进行软件开发,没有一个应用程序能够满足大多数最终用户的需求.垂直行业使用的软件代码量更小,与其他应用程序的接口更简单,而可 ...

  4. Web架构之Nginx基础配置

    目录 1.Nginx 虚拟主机 1.1.基于域名的虚拟主机 1.2.基于端口的虚拟主机 1.3.基于IP的虚拟主机 2.Nginx include 3.Nginx 日志配置 3.1.访问日志 3.2. ...

  5. django 从零开始 11 根据时间戳加密数据

    django自带一个加密的方法signer,对数据进行一个加密 一般这种方式用于账号密码邮箱找回,或者token设置 class TimestampSigner(Signer): def timest ...

  6. 03 Uipath调用VBA脚本,处理excel文档格式

    前言: 在平时我们的工作中,经常需要使用Uipath自动的导入大量数据到Excel表格中,但是却发现,数据导入到Excel之后,格式却是很乱,基本不能看,就像下图: ​ 而Uipath对Excel的操 ...

  7. 面试官:HashMap死循环形成的原因是什么?

    介绍 HashMap实现原理 之前的文章已经分析了HashMap在JDK1.7的实现,这篇文章就只分析HashMap死循环形成的原因 死循环形成是在扩容转移元素的时候发生的 void resize(i ...

  8. 2019-2020-2 20174313张博 《网络对抗技术》Exp1 PC平台逆向破解

    写在前面 ·实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同时包含另一个代码片段——g ...

  9. 手写 Promise 符合 Promise/A+规范

    异步编程是前端开发者必需的技能,过去管理异步的主要机制都是通过函数回调,然而会出现像“回调地狱”这样的问题.为了更好的管理回调,ES6 增加了一个新的特性 Promise.Promise 是 ES7 ...

  10. Spring bean配置 入门

    Spring 的入门案例:(IOC)  IOC 的底层实现原理(结构图2.01) 图:2.01 IOC:Inversion of Control 控制反转,指的是对象的创建权反转(交给)给Spring ...