资讯专栏INFORMATION COLUMN

Study Blazor .NET(四)数据绑定

incredible / 3048人阅读

摘要:下面是支持的事件参数方法方法这里是组件间双向绑定的另一种方法,我们可以基于任何事件方法的执行手动触发一个,在中,用内置函数手动触发属性,同时回调父组件中相应的方法,在父组件中,通过通知状态已经改变。

翻译自:Study Blazor .NET,转载请注明。

数据绑定

单向绑定

在blazor中单向绑定简单而直接,无需UI刷新或渲染。下面示例展示了单向数据绑定:

//Counter.razor@page "/counter"

Counter

Current count: @currentCount

@functions { int currentCount = 0; void IncrementCount() { currentCount++; }}

这里 @currentComponent 的值会根据点击 Click me 按钮的次数而增加。

标签元素的值会自动刷新无需任何其它组件刷新。

双向绑定

Blazor为双向绑定提供多种选择,与一些流行的JS语言相比实现起来更加优雅。

相同组件中使用绑定

在blazor中,bind 特性支持双向数据绑定,在下面的例子中,checkbox 在同一个组件中使用了 bind 属性:

//TwoWayBind.razor@page "/two-way-binding"

This string will get value from above text field : @updateString.ToString()

@functions { Boolean updateString {get; set;} = true;}

双向数据绑定也能用lamda表达式通过 onchange 特性实现。不用担心,Blazor提供了绑定属性的简单方法,更多细节如下:

//TwoWayBind.razor@page "/two-way-binding"

This string will get value from above text field: @updateString

@functions { string updateString = "";}

bind 特性可以使用值和事件 bind-value- 进行扩展,上面的示例可以用 oninput 代替 onchange 重写如下:

//TwoWayBind.razor@page "/two-way-binding"

This string will get value from above text field : @updateString

@functions { string updateString = "";}

不同组件间使用绑定

方法 1

组件之间传递的数据通过组件属性及其属性映射完成,这种方法使用 Action 数据类型。

//ParentComponent.razor

Parent Component

String in Parent: @parentString

@functions{ private string parentString = "Initial Parent String"; private void PassToChild() { parentString += "- To Child"; } private void ReceivedFromChild(string str) { parentString = str; StateHasChanged(); }}
//ChildComponent.razor

Child Component

String received from Parent : @ToChild

@functions{ [Parameter] private string ToChild{get;set;} [Parameter] Action FromChild{get;set;} private string childString; private void PassToParent() { childString = ToChild + "- To Parent"; FromChild(childString); }}

ChildComponent中的 FromChild 特性/属性用 Action 类型从子组件向父组件传递值。在父组件中有一个带有 string 类型参数的响应函数,ChildComponent组件中的按钮点击操作触发这个函数,并且反过来通知 PassToParent 函数,为了通知父组件中的状态已经改变,我们使用了Blazor内置函数 StateHasChanged()

方法 2

这种方法使用 EventCallback 数据类型指定事件变更来传递信息从而代替具体的数据,这里不需要再调用 StateHasChanged() 函数。

//ParentComponent.razor

Parent Component

Logging Event triggered from Child: @logString

@functions{ private string logString = ""; private void TriggerFromChild(UIMouseEventArgs e) { logString = e.ToString(); }}
//ChildComponent.razor

Child Component

@functions{ [Parameter] private EventCallback Trigger { get; set; } }

在ChildComponent中,Trigger 属性回调ParentComponent中相应的带有 UIMouseEventArgs参数的TriggerFromChild 方法,同时在父组件中以字符串形式记录。

下面是支持的事件参数:

  • UIEventArgs
  • UIChangeEventArgs
  • UIKeyboardEventArgs
  • UIMouseEventArgs

方法 3

这里是组件间双向绑定的另一种方法,我们可以基于任何事件/方法的执行手动触发一个 Action

//ParentComponent.razor

Parent Component

Logging Event triggered from Child: @logString

@functions{ private string logString = ""; private void TriggerFromChild() { logString = "Triggered From Child using Action and Invoke"; StateHasChanged(); }}
//ChildComponent.razor

Child Component

@functions{ [Parameter] private Action EventFromChild{get;set;} private void Trigger() { EventFromChild?.Invoke(); } }

在ChildComponent中,用内置函数 Invoke 手动触发 EventFromChild Action 属性,同时回调父组件中相应的 TriggerFromChild 方法,在父组件中,通过 StateHasChanged() 通知状态已经改变。

级联值和参数

Blazor提供了一种跨越整个RenderTree(所有组件)传递数据的方法,使用 CascadingValueCascadingParameter 代替传递组件特性。传递的值可以被RenderTree (子组件)通过装饰属性 CascadingParameter 代替 Parameter 接收。

//RootComponent.razor@page "/base-component"

App Base Component

@functions { private string pName {get;set;} = "New To Blazor"; private int pAge {get;set;} = 35;}
//ParentComponent.razor

Parent Component

Profile Name is : @Name and Age is : @Age.ToString();

@functions{ [CascadingParameter(Name = "ProfileName")] string Name { get; set; } [CascadingParameter(Name = "ProfileAge")] int Age {get;set;}}

CascadingParameter 中,Name 参数必须与具有 CascadingValue 组件的 Name 属性匹配,如果我们没有声明 Name,那么 CascadingParameter 中的变量类型与 CascadingValue 中的 Value 属性匹配。

最好声明 Name 参数,以避免混淆,这在应用程序规模增长时很有用。

渲染片段,动态内容

除了用特性从父组件向子组件传递内容,还可以在组件的 tag 元素中传递内容,并且可以使用 RenderFragment 属性在子组件中呈现。

方式 1

ChildContent 是我们需要在子组件中使用的命名约定,以获取父组件的内容,

//ParentComponent.razor

Parent Component

The line here is passed to child from Parent!!!
//ChildComponent.razor

Child Component

@ChildContent

@functions{ [Parameter] private RenderFragment ChildContent { get; set; } }

方式 2

RenderFragment 主要用于模板化目的,并基于子组件内部的逻辑呈现内容。

//ParentComponent.razor

Parent Component

Bold Text here!!!

//ChildComponent.razor

Child Component

@for(var i = 1; i <= 3; i++) {
Line No : @i
@SampleText
}
@functions{ [Parameter] private RenderFragment SampleText { get; set; } }

此时 SampleText 不是已经存在的组件,它是在父组件中的 ChildComponent tag元素中新生成的,同时在子组件中也声明了相同的命名为 SampleText 的属性。

SampleText 中的文本在子组件里循环渲染3次,这非常有助于创建模板组件、表格等。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124543.html

相关文章

  • React 导读(一)

    摘要:需要有一定的基础和的使用经验。这就是属性的作用。方法接收一个新对象来重新赋值。也接收一个函数,这个回调函数这里我默认有一个参数,表示之前的的值,这个函数的返回值就是最新的。但是不同的是在组件内部是只读的。 前言 写这篇文章的主要目标是让初学者更快的上手 React 的项目开发,能有一个循循渐进的理解过程。需要有一定的 JavaScript 基础和 NPM 的使用经验。不多说了,下面会按...

    kumfo 评论0 收藏0
  • Cookie学习

    摘要:服务器检查该,以此来辨认用户状态。该值会在浏览器再次发起请求时,传递给服务器失效的时间,单位秒。如果为,表示删除该。该值可以在服务器运行时动态设置该是否仅被使用安全协议传输。安全协议有,等,在网络上传输数据之前先将数据加密。 什么是Cookie?     Cookie是由W3C组织提出,最早由NetScape社区发展的一种机制。     Cookie是存储于访问者的计算机中的变量。每当...

    Bamboy 评论0 收藏0
  • .net打独立运行环境遇到无法trim遇到的bug

    摘要:如何解决呢编辑器解决方案编辑器编辑器介绍如下编辑器编辑器这是一个大佬用写的支持把你的所有依赖打包独立运行时,支持跨平台的。背景介绍工作中我用到kotlin写代码,在orm上ktorm是一款非常优秀的操作db的框架,我喜欢用它所以我写了一个插件能够增加我的工作效率,这款idea插件的主体逻辑是.net开发的(没错是跨平台的.net)。因为db-schema的解析逻辑我很在以前写的一个visua...

    不知名网友 评论0 收藏0
  • Node.js this指针指向module.exports、global、实例,指针显式、隐式传

    摘要:一指针指向全局中的指向的是二指针指向对象在函数中指向的是对象,和全局中的不是同一个对象 一、this指针指向module.exports console.log(全局中的this指向的是module.exports); console.log(this); //{} this.obj = Hello World; console.log(this.obj); //Hello World...

    beita 评论0 收藏0

发表评论

0条评论

incredible

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<