Blazor入门笔记(5)-数据绑定
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的。现在,效果如下:

Blazor入门笔记(5)-数据绑定的更多相关文章
- Blazor入门笔记(6)-组件间通信
1.环境 VS2019 16.5.1.NET Core SDK 3.1.200Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.简介 在使用B ...
- Blazor入门笔记(4)-组件的生命周期
1.环境 VS2019 16.5.1.NET Core SDK 3.1.200Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.简介 Blaz ...
- 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 ...
- Blazor入门笔记(2)-分部类组件与组件的继承
1.前言 本文接自Blazor的组件(1)-从0构建一个组件 2.分部类组件 Razor组件你可理解为就是一个类名与文件名相同的类,因此,可以新建一个同名的partial类,将组件中@code里面的代 ...
- Blazor入门笔记(1)-从0构建一个组件
1.环境 VS2019 16.5.1 .NET Core SDK 3.1.200 Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.创建项目 ...
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- ES6入门笔记
ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
随机推荐
- Error response:/usr/bin/tf_serving_entrypoint.sh: line 3: 6 Illegal instruction (core dumped) ...
用docker部署tensorflow-serving:gpu时,参照官方文档:https://tensorflow.google.cn/tfx/serving/docker 本应该是很简单的部署,没 ...
- 微信小程序接入百度OCR(身份证识别)
微信小程序接入百度OCR(身份证识别) 1.接口描述 支持对二代居民身份证正反面所有8个字段进行结构化识别,包括姓名.性别.民族.出生日期.住址.身份证号.签发机关.有效期限,识别准确率超过99%:同 ...
- 对两个有序数组重新去重合并排序js实现
这里主要是要利用两个数组有序这个条件,所以只需两个指针分别指向两个数组,当其中一个小于另外一个就移动该指针,反之则移动另外一个指针,如果相等则均向后移动. 结束条件是,当任意一个数组的指针移到末尾则跳 ...
- Redis系列五 - 哨兵、持久化、主从
问:骚年,都说Redis很快,那你知道这是为什么吗? 答:英俊潇洒的面试官,您好.我们可以先看一下 关系型数据库 和 Redis 本质上的区别. Redis采用的是基于内存的,采用的是单进程单线程模型 ...
- Vue Snackbar 消息条队列显示,依次动画消失的实现
效果预览 思路 封装 Snackbar 组件: 在根路由页面下建立全局 Snackbar 控制器,统一管理 Snackbar: 通过事件通知全局 Snackbar 控制器显示消息: 实现 1. 封装 ...
- openwrt MT7620A MT7610E 5G 驱动添加移值
使用 github 上别人提供好的源码.整合到最新的 openwrt 18 中,目前 kernel 的版本为 4.1 . 编辑中....
- Java集合02——三分钟了解你必须掌握的两个Set
上一篇文章我们说到了 List ,本章开始,我们将继续讲解Set相关的知识.关注公众号「Java面典」了解更多 Java 知识点. Set 是一个无重复对象的集合类.值的重复与否是根据对象的 hash ...
- MySQL记录操作(增删改)
概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据 ...
- Android位置服务开发
1. 使用LocationManager获取地理位置信息 代码如下: private TextView positiontext; private String provider; private L ...
- MVC设计模式简介
刚刚学习了MVC相关知识,在这里进行一下总结MVC设计模式提高了Java开发中的代码可读性,提高了开发效率,实乃开发利器 1在MVC中由客户端发送一个带参数的请求,经过servlet处理后做出相应的处 ...