Blazor学习之旅(4)数据共享

06cbec7de6bfdb724cc8d75a1f732466.jpeg

【Blazor】| 总结/Edison Zhou


大家好,我是Edison。前几天没有发布本篇就发布了第五篇,属于操作失误哈,这次把第四篇补上!

本篇,我们来了解下在Blazor中数据是如何共享的,组件之间又该如何传递参数。

关于Blazor组件

在 Blazor 中,从名为“组件”的自包含代码部分生成 UI。每个组件都可以包含 HTML 和 C# 代码的混合。组件是通过使用 Razor 语法编写的,其中的代码是用 @code 指令标记的。其他指令可用于访问变量、绑定到值以及实现其他呈现任务。

编译应用时,HTML 和代码将编译为组件类。组件一般被编写为扩展名为 .razor 的文件。

关于数据共享

Blazor 包含多种在组件之间共享信息的方法。

(1)可使用组件参数或级联参数将值从父组件发送到子组件。

(2)AppState 模式是另一种可用于存储值并从应用程序中的任何组件访问这些值的方法。

使用组件参数共享

在父组件和子组件的此层次结构中,可以使用组件参数在它们之间共享信息。在子组件上定义这些参数,然后在父组件中设置其值。

例如,在Counter组件中,定义了一个IncrementAmount的组件参数:

@page "/counter"<PageTitle>Counter</PageTitle><h1>Counter</h1><p role="status">Current count: @currentCount</p><button class="btn btn-primary" @onclick="IncrementCount">Click me</button>@code {private int currentCount = 0;[Parameter]public int IncrementAmount { get; set; } = 1;private void IncrementCount(){currentCount += IncrementAmount;}
}

在调用端只需要下面这样既可,由于Counter组件中还设置了默认值为1,因此,如果调用端不传递,则默认为1。

<Counter IncrementAmount="10" />

此外,还可以使用自定义类用作组件参数,例如:

@using EDT.BlazorServer.App.Models<p>New Topping: @Topping.Name</p>
<p>Ingredients: @Topping.Ingredients</p>@code {[Parameter]public PizzaTopping Topping { get; set; }
}

PizzaTopping的定义如下:

public class PizzaTopping
{public string Name { get; set; }public string Ingredients { get; set; }
}

调用方的定义如下:

@page "/pizzas-toppings"<h1>Our Latest Pizzas and Topping</h1><PizzaTopping Topping="@(new PizzaTopping() { Name = "Chilli Sauce", Ingredients = "Three kinds of chilli." })" />

使用级联参数共享

当具有包含子组件的子组件的较深层次结构时,事情便会变得难以应付。组件参数不会从上级组件或沿着层次结构向下自动传递到下级组件。为了完美处理此问题,Blazor 包含了级联参数。在组件中设置级联参数的值时,其值将自动提供给所有子组件。

在父组件中,使用  标记指定将级联到所有子组件的信息。此标记作为内置的 Blazor 组件实现。在该标记内呈现的任何组件都将能够访问该值。

例如,我们有三个组件,其中,CascComp2组件被嵌套在CascComp1组件中,而CascComp1组件又被嵌套在CascCompSamle组件中。他们的调用关系如下:

d64f735f532d5ffc20b96a891663180c.png

使用CascadingParameter级联传递参数NickName:

(1)CascCompSample.razor

<!--this is CascCompSample.razor-->@page "/cascparamsample"<h3>This is the sample page</h3><CascadingValue Value="NickName"><CascComp1></CascComp1>
</CascadingValue>@code
{private string NickName = "Edison Zhou";
}

(2)CascComp1.razor

<!--this is CascComp1.razor--><h3>Comp1: @NickName</h3><CascComp2></CascComp2>@code {[CascadingParameter]public string NickName { get; set; }
}

(3)CascComp2.razor

<!--this is CascComp2.razor--><h3>Comp2: @NickName</h3>@code {[CascadingParameter]public string NickName { get; set; }
}

要点:

(1)首先在CascCompSample.razor页面,我们通过把CascComp1嵌套到CascadingValue里面来传递参数。

(2)其次在CascComp1和 CascComp2,不再需要显式传递参数,只需要声明CascadingParameter即可拿到值。

效果:

820ac22f94489d9a05edf8a4f7b90a2a.png

如果需要级联传递多个参数,可以使用CascadingValue的嵌套,这里我们修改一下CascCompSample.razor组件,让它可以共享两个参数:

<!--this is CascCompSample.razor-->@page "/cascparamsample"<h3>This is the sample page</h3><CascadingValue Value="currentNickName" Name="NickName"><CascadingValue Value="currentAge" Name="Age"><CascComp1></CascComp1></CascadingValue>
</CascadingValue>@code
{private string currentNickName = "Edison Zhou";private int currentAge = 34;
}

修改CascComp1.razor,增加一个CascadingParameter属性Age:

<!--this is CascComp1.razor--><h3>Comp1: @NickName - @Age</h3><CascComp2></CascComp2>@code {[CascadingParameter(Name="NickName")]public string NickName { get; set; }[CascadingParameter(Name="Age")]public int Age { get; set; }
}

CascComp2.razor修改同上,不再赘述。

这里需要注意的是:级联值由父级中的 Name 属性标识,与 [CascadingParameter] 属性中的 Name 值匹配。对于只有一个该类型的参数而言,在子组件中CascadingParameter特性中无需指定Name。但对于如果有多个相同类型的级联参数而言,最好加上Name名称进行指定,以避免找不到。因此,这里也推荐在CascadingValue中指定Name,然后再CascadingParameter特性中指定Name。

最终效果:

86a71954ed3d3c2621d66087242d71f8.png

使用AppState模式共享

在不同组件之间共享信息的另一种方法是使用 AppState 模式。

即创建一个定义要存储的属性的类,并将其注册为作用域服务。在要设置或使用 AppState 值的任何组件中,注入该服务,然后可以访问其属性。不同于组件参数和级联参数,AppState 中的值可用于应用程序中的所有组件,即使这些组件不是存储该值的组件的子组件也是如此。

例如,创建一个包含销售状态的类:

public class PizzaSalesState
{public int PizzasSoldToday { get; set; }
}

然后,将该类注入到DI容器中:

builder.Services.AddScoped<PizzaSalesState>();

最后,在任意组件中通过依赖注入来访问该属性:

@page "/"
@using EDT.BlazorServer.App.Models
@inject PizzaSalesState salesState;<PageTitle>Index</PageTitle><h1>Hello, world!</h1>Welcome to your new app.<SurveyPrompt Title="Your Pizza Shop" />@*<Counter IncrementAmount="10" />*@
<p>Today, we've sold this many pizzas: @salesState.PizzasSoldToday</p>
<button @onclick="IncrementSales">Buy a Pizza</button>@code {private void IncrementSales(){salesState.PizzasSoldToday++;}
}

在本例中,由于我们已将计数器的值存储在 AppState 范围内服务中,因此计数会在页面加载期间一直存在,并且对其他用户可见。

最终效果:

fcd4164efa2a75d08ff83fb248df7d1c.gif

小结

本篇,我们了解了数据如何在Blazor中共享。

下一篇,我们学习一下在Blazor中数据绑定的各种花样。

参考资料

Microsoft Docs,《在Blazor应用程序中共享数据》

65号腕,《Blazor中的参数和级联参数》

9da0c6edf2047a997ea0ad846a2fb286.gif

年终总结:Edison的2021年终总结

数字化转型:我在传统企业做数字化转型

C#刷题:C#刷剑指Offer算法题系列文章目录

.NET面试:.NET开发面试知识体系

.NET大会:2020年中国.NET开发者大会PDF资料

d2ad04132510e200e4f43ce166c27383.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

# 20172307 2018-2019-1 《程序设计与数据结构》第5周学习总结

20172307 2018-2019-1 《程序设计与数据结构》第5周学习总结 教材学习内容总结 查找 1.线性查找&#xff1a;从该列表头开始依次比较每一个值&#xff0c;直至找到该目标元素。2.二分查找法&#xff1a;二分查找是从排序列表的中间开始查找&#xff0c;如果没有在那个中间元素则…

IBM 的大型机 z Systems 引入 Go 语言

据 cbronline 报道&#xff0c;IBM 正把 Go 语言运用到旗下的大型机上。 IBM 将开源的 Go 语言引入到 z Systems 大型机后&#xff0c;可以给用户多一个的选择&#xff0c;即在大型机上使用 Linux 或基于 Go 的应用&#xff0c;同时也使大型机更加灵活。Go 语言在高并发的网络应…

WPF-10 逻辑树和可视化树

我们在WPF-03 资源之Resources结尾中介绍逻辑树和可视化树的基本概念&#xff0c;我们这节来介绍这两棵树逻辑树&#xff08;Logical Tree&#xff09;逻辑树是由每个控件的节点组成&#xff0c;本质上就是XAML文件中的UI元素&#xff0c;我们可以通过LogicalTreeHelper类提供的…

国产车崛起粉碎德日工业神话

由于二战战败&#xff0c;德国一大批顶尖人才被美苏瓜分&#xff0c;战败国地位和人才断层导致德国工业基本是第二次工业革命的产物&#xff0c;专精于机械、化工等传统行业&#xff0c;并有巴斯夫、拜尔、大众、戴姆勒、宝马等一批世界级企业。不过&#xff0c;德国世界级的IT…

java hibernate 分页查询_4 Hibernate HQL查询,分页查询

/*** HQL查询的一个例子*/public static void hql(){Session s null;try{s HibernateUtil.getSeesion();//final String hql "from User as u where u.name?";final String hql "from User as u where u.name:name";final Query query s.createQuery…

Linux -sed

sed &#xff0c;查找sed -n /root/p passwd #列出passwd中有root的行 sed -nr /ot/p passwd #sed -r grep -E 都是进行脱意 sed -nr /0{2}/p passwd #匹配两次o的 sed -nr /root|bus/p passwd #匹配root 或者bus的 sed -n 2p passwd # 查找指定的行sed -n 2,5p passwd # 查找…

node安装问题

1.最好安装到默认路径&#xff0c;手贱安到了D盘&#xff0c;升级npm各种出错。 明明升级成功&#xff0c;查看版本时&#xff0c;确显示依然是老的版本。 原因&#xff1a;升级的是C盘的node_modules中的npm&#xff0c;执行时确是D盘node自带的npm&#xff0c;不知道为啥。。…

通过url来设置log4j的记录级别

2019独角兽企业重金招聘Python工程师标准>>> 直接看代码。 import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotati…

通过用户模型,对数据库进行增删改查操作

增加&#xff1a;user db.session.add(user)db.session.commit() #增加 user User(username JACKSON,password0328 ) db.session.add(user) db.session.commit() 查询&#xff1a;User.query.filter(User.username mis1114).first() #查询 userUser.query.filter(User.usern…

Android OpenGL ES(七)----理解纹理与纹理过滤

1.理解纹理 OpenGL中的纹理能够用来表示图像。照片&#xff0c;甚至由一个数学算法生成的分形数据。每一个二维的纹理都由很多小的纹理元素组成。它们是小块的数据&#xff0c;类似于我们前面讨论过的片段和像素。要使用纹理&#xff0c;最经常使用的方式是直接从一个图像文件载…

WPF 基础控件之托盘

WPF 基础控件之托盘控件名&#xff1a;NotifyIcon作者&#xff1a; WPFDevelopersOrg - 吴锋|驚鏵原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。新建NotifyIcon自定义…

java 匿名 异常_JAVA类(内部类、匿名内部类、异常、自定义异常)

内部类package AA;public class类 {int de123;StringBuffer deenewStringBuffer();public class成员内部类{public voidff() {System.out.println("这是成员内部类方法");}}/*1.可以访问外部类所有的成员&#xff0c;包括被声明为私有(private)的&#xff1b;2.可以使…

ASP.NET 多环境下配置文件web.config的灵活配置---转

注意&#xff1a;本功能在.Net Core中已经不可用&#xff0c;暂时需手动修改web.config中的信息&#xff0c;或者将其设置在appsettings.XXX.json中&#xff0c;然后再使用web.config中的环境变量来制定使用的具体appsettings文件。 转自&#xff1a;https://www.cnblogs.com/h…

Uranium UI Kit

Uranium UI Kit控件名&#xff1a;Uranium UI Ki作者&#xff1a;enisn原文链接&#xff1a; https://github.com/enisn/UraniumUI项目使用 Apache-2.0 开源许可协议。Uranium 是用于 .NET MAUI 的免费和开源 UI 工具包。它提供了一组控件和实用程序来构建现代应用程序。它建…

《Java多线程编程核心技术》读后感(十五)

线程的状态 线程对象在不同的运行时期有不同的状态&#xff0c;状态信息就存在与State枚举类中。 验证New,Runnable&#xff0c;Terminated new:线程实例化后还从未执行start()方法时的状态 runnable&#xff1a;线程进入运行的状态 terminated&#xff1a;线程被销毁时的状态 …

队列(queue)

队列(queue)和栈一样支持push和pop两个操作。但与栈不同的是,pop两个操作。但与栈的不同的是&#xff0c;pop完成的不是取出最顶端的元素&#xff0c;而是最底端的元素。也就是说最初放入的元素能够最先被取出&#xff08;这种行为被叫做FIFO:First In First Out&#xff0c;即…

一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]

ASP.NET Core应用本质上就是一个由中间件构成的管道&#xff0c;承载系统将应用承载于一个托管进程中运行起来&#xff0c;其核心任务就是将这个管道构建起来。在ASP.NET Core的发展历史上先后出现了三种应用承载的编程方式&#xff0c;而且后一种编程模式都提供了针对之前编程…

WPF 简单模仿 VSCode 界面布局

WPF 简单模仿 VSCode 界面布局本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。WPF 简单模仿 VSCode 界面布局作者&#xff1a;弈虎-吕女士会翻墙原文链接&#xff1a; https://github.com/Chen-Lin-Zhao-Wei/WPFLikeVSCode分享一篇群友这几天自己写的 WPF 简…

compare()方法+使用compare方法

compare()方法 compare(lob1,lob2,amount,offset_1,offset_2) 1用于比较2个lob存储的数据&#xff0c;比较的方式是从指定偏移量开始&#xff0c;对指定数量的字符或者字节进行比较。 2如果比较内容相同&#xff0c;返回0&#xff0c;否则返回-1或1. 3如果参数设置有误或不合…

linux 下 mysql默认表_linux环境下mysql默认是区分表名大小写的

在linux环境下&#xff0c;mysql默认表明是区分大小写的&#xff0c;我们可以查看全局变量发现:mysql> show variables like lower%;-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_cas…