《进击吧!Blazor!》系列入门教程 第一章 7.图表

作者备注

《进击吧!Blazor!》是本人与张善友老师合作的Blazor零基础入门系列视频,此系列能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力。
视频地址:https://space.bilibili.com/483888821/channel/detail?cid=151273

Blazor WebAssembly 是单页应用 (SPA) 框架,用于使用 .NET 生成交互式客户端 Web 应用,采用 C# 代替 JavaScript 来编写前端代码

本系列文章因篇幅有限,省略了部分代码,完整示例代码:

https://github.com/TimChen44/Blazor-ToDo

第一章

6.安全

图表的作用我就不扯了,想要让系统高大上就少不了它,作为一个加分项,我们自然也要给我们ToDo引用来一波。

目录

Chart控件选择

改造ToDo

1.引用组件

2.统计页

3.迷你图

次回预告

Chart控件选择

目前还没有比较优秀的Blazor原生Chart控件,这也是我们将来需要提升Blazor生态的重要任务之一。

但是无需失望,Blazor支持C#调用JS,反之亦可,所以社区中有不少通过此技术对现有JS版本的Chart控件二次分装的Blazor组件可用。

这里我就推荐本人封装G2Plot后的Blazor组件ant-design-charts-blazor。

文档地址:https://ant-design-blazor.gitee.io/zh-CN/charts/introduce

源码地址:https://github.com/ant-design-blazor/ant-design-charts-blazor

技术实现方式介绍:https://zhuanlan.zhihu.com/p/163808856

改造ToDo

1.引用组件

通过命令或可视化界面为ToDo.Client添加AntDesign.Charts组件

$ dotnet add package AntDesign.Charts

在 wwwroot/index.html(WebAssembly) 或 Pages/_Host.razor(Server) 中引入静态文件:

<script src="https://unpkg.com/@antv/g2plot@latest/dist/g2plot.js"></script>
<script src="_content/AntDesign.Charts/ant-design-charts-blazor.js"></script>

在 _Imports.razor 中加入命名空间

@using AntDesign.Charts

将Charts命名空间加入全局引用,拥有使用时省略完整命名路径的好处,但是请注意当Chart中的组件与其他组件重名时,不论Chart组件还是其他组件都需要补上完整命名路径,考虑到Chart使用的页面并不多,所以本人的习惯不会将他加入 _Imports.razor中。

2.统计页

我们用柱状图做一个每日代办事项数量统计图

ChartAmountDto.cs

在ToDo.Shared项目中创建用于显示数据的实体。

public class ChartAmountDto
{public string Day { get; set; }public string Type { get; set; }public int Value { get; set; }
}

Day字段存储日期文本。

Type存储重要度信息,包含“普通”,“重要”两个值,图表中也是用这个进行分组显示。

Value存储具体的数值。

ChartController.cs

在ToDo.Server项目新建ChartController控制器,用于提供图表所需的数据。

[ApiController]
[Route("api/[controller]/[action]")]
public class ChartController
{TodoContext Context;public ChartController(TodoContext context){Context = context;}//每日待办数量public List<ChartAmountDto> GetAmountDto(){return Context.Task.GroupBy(x => new { x.PlanTime, x.IsImportant }).Select(x => new ChartAmountDto(){Day = x.Key.PlanTime.ToString("yy-MM-dd"),Type = x.Key.IsImportant ? "普通" : "重要",Value = x.Count(),}).ToList();}
}

通过对计划日期和重要度进行分组,然后对分组结果进行计数,接口返回的部分数据结构如下

[{"day":"20-09-25","value":2,"type":"重要"},{"day":"20-10-10","value":9,"type":"重要"},{"day":"20-10-11","value":6,"type":"重要"},{"day":"20-10-14","value":2,"type":"重要"},{"day":"20-10-17","value":6,"type":"重要"},{"day":"21-01-28","value":1,"type":"重要"}
]

Statistics.razor

在ToDo.Client项目添加Statistics.razor并填入以下代码

@page "/statistics"<Spin Spinning="isLoading"><AntDesign.Charts.StackedColumn @ref="@amountChart" Config="amountConfig" TItem="ChartAmountDto" />
</Spin>

AntDesign.Charts.StackedColumn 通过完整的路径添加图表控件。

@ref="@amountChart" 提供了一种引用组件实例的方法,随后可以申明一个变量存放组件的引用。

Config="amountConfig" 配置图表显示配置。

TItem="ChartAmountDto" 定义图表数据类型。

添加Statistics.razor.cs文件。

public partial class Statistics
{[Inject] public HttpClient Http { get; set; }bool isLoading = false;IChartComponent amountChart;readonly StackedColumnConfig amountConfig = new StackedColumnConfig{Title = new Title{Visible = true,Text = "每日代办数量统计"},ForceFit = true,Padding = "auto",XField = "day",YField = "value",YAxis = new ValueAxis{Min = 0,},Meta = new{day = new{Alias = "日期"},},Color = new[] { "#ae331b", "#1a6179" },StackField = "type"};protected async override Task OnInitializedAsync(){isLoading = true;var amountData = await Http.GetFromJsonAsync<List<ChartAmountDto>>($"api/Chart/GetAmountDto");await amountChart.ChangeData(amountData);await base.OnInitializedAsync();isLoading = false;}
}

IChartComponent amountChart;变量用来存放组件实例引用,之后我们就可能使用这个对象对Chart组件进行各类操作。

StackedColumnConfig amountConfig定义了堆积柱状图的配置

  • Text = "每日代办数量统计" 定义了标题文本

  • XField = "day" X轴绑定的字段名

  • YField = "value" Y轴绑定的字段名

注意:此处绑定字段名是区分大小写的,通常c#的dto类字段名会采用大驼峰,然而将dto转json默认模式下会将字段名改成小驼峰格式,所以注意此处字段名的差异。

  • Meta = new { day = new { Alias = "日期" } } 定义day字段所在州轴显示的文本

  • Color = new[] { "#ae331b", "#1a6179" } 柱状图的颜色,如果不指定,组件会使用默认颜色

  • StackField = "type"定义了堆砌的字段

更多的属性配置可以详见G2Plot组件的文档:

https://antv-g2plot.gitee.io/zh/examples/gallery

MainLayout.razor

添加统计菜单项

<MenuItem RouterLink="/statistics" RouterMatch="NavLinkMatch.Prefix">统计
</MenuItem>

运行效果

3.迷你图

图表,图表,有图有表,所以我们需要将我们的图表与我们的代办列表集合。

我们的代办记录中有计划日期和截至日期,所以我们可以结合当前日期就能做出一个剩余时间进度迷你图。

TaskItem

TaskItem.razor中添加以下代码

<div class="chart">@{double progress = 0;if (Item.IsFinish == false && Item.Deadline.HasValue)progress = (double)Item.Deadline.Value.Subtract(DateTime.Now).TotalHours / (double)Item.Deadline.Value.Subtract(Item.PlanTime).TotalHours;}<AntDesign.Charts.RingProgress Data="progress" Config="progressConfig"></AntDesign.Charts.RingProgress>
</div>

我们先计算剩余时间,结果数值区间在0~1之间,然后使用RingProgress组件显示,如果已经完成的任务默认值为0。

AntDesign.Charts.RingProgress 圆形进度迷你图。

Data="progress" 图表数值

Config="progressConfig" 图表配置

最后添加一些样式,位置上美化一下

.task-card-item .chart {margin-left: 8px;
}

在TaskItem.razor.cs中添加迷你图配置

readonly RingProgressConfig progressConfig = new RingProgressConfig
{Width = 30,Height = 30,
};

运行效果

随着时间流逝,剩余时间减少,圆形精度蓝色部分会越来越少

次回预告

第一章 8.站点部署

下次将迎来Todo应用的最终回,我们通过一些虚拟场景来演示如何部署Blazor应用。

学习资料

更多关于Blazor学习资料:https://aka.ms/LearnBlazor

MSReactor

扫码|关注我们

Bilibili|微软Reactor_SH

新浪微博|MSReactorShanghai

知乎|微软 Reactor

球分享

球点赞

球在看

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

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

相关文章

一日一技:ASP.NET Core Api网关Ocelot初探

概述Ocelot面向使用.NET运行微型服务/面向服务的体系结构的人员&#xff0c;这些体系结构需要在系统中具有统一的入口点。特别是我想与IdentityServer参考和承载令牌轻松集成。Ocelot是按特定顺序排列的一堆中间件。Ocelot将HttpRequest对象操作到由其配置指定的状态&#xff0…

盘点那些让程序员目瞪口呆的Bug都有什么?

程序员一生与bug奋战&#xff0c;可谓是杀敌无数&#xff0c;见怪不怪了&#xff01;在某知识社交平台中&#xff0c;一个“有哪些让程序员目瞪口呆的bug”的话题引来了6700多万的阅读&#xff0c;可见程序员们对这个话题的敏感度有多高。1、麻省理工“只能发500英里的邮件”该…

这本 “写不完” 的黑科技笔记本,恐怕要颠覆整个行业!

这是一本可以“阅后即焚”的笔记本&#xff1f;别想太多这个“焚”不是那个“焚”哦~TA非常神奇&#xff01;风筒吹吹&#xff0c;笔记本上字迹都会自动消失。what&#xff1f;&#xff08;暂时保密&#xff0c;一会见证奇迹&#xff09;每个人在步入学生时代&#xff0c;到社会…

.NET 6 Preview 2 发布

前言在 2021 年 3 月 11 日&#xff0c; .NET 6 Preview 2 发布&#xff0c;这次的改进主要涉及到 MAUI、新的基础库和运行时、JIT 改进。.NET 6 正式版将会在 2021 年 11 月发布&#xff0c;支持 Windows、macOS、Linux、Android 和 iOS 等系统以及 x86、x86_64、ARM 和 ARM64…

[转]ArcGIS.Server.9.3和ArcGIS API for Flex实现Toolbar功能(四)

目的&#xff1a;1.ArcGIS API for Flex实现Toolbar功能&#xff0c;包括ZoomIn、ZoomOut、Pan、PrevExtent、NextExtent、FullExtent功能。准备工作&#xff1a;1.这次地图数据就用Esri提供的http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/Ma…

物理学家史蒂夫·霍金逝世,享年76岁(附图文回顾他的一生)

3月14日消息&#xff0c;据英国天空新闻等多家媒体报道&#xff0c;史蒂芬威廉霍金&#xff08;Stephen William Hawking&#xff09;去世&#xff0c;享年76岁&#xff08;1942年1月8日&#xff0d;2018年3月14日&#xff09;。这一消息已经得到霍金家人确认。霍金的三个孩子露…

mysql数据库熟悉表空间数据文件_Oracle表空间和数据文件

Oracle创建表空间 1.创建普通表空间create tablespace oracle_tablespacedatafileOracle创建表空间1.创建普通表空间create tablespace oracle_tablespacedatafile /home/oracle/oradata/orcl/oracle_tablespace.dbfsize 100mautoextend on next 10M maxsize 200Mextent manage…

2018年最值得关注的15大技术趋势,区块链将得到更广泛的应用

通常情况下&#xff0c;技术趋势是很难准确预测的&#xff0c;因为预测未来本身就极其困难。但是我们还是可以从过往的一些显著数据指标来推测新的一年里科技行业的发展趋势。2018&#xff0c;有哪些值得关注的技术趋势&#xff1f;01 区块链将得到更广泛的应用

Visual Studio项目引用出现感叹号怎么办?

原因可能有多种&#xff1a;第一种问题&#xff1a;解决方式1&#xff1a;今天换了台电脑&#xff0c;就把笔记本上的项目拷贝到了台式机上&#xff0c; 但是我没有拷贝解决方案整个文件夹&#xff0c;因为其中项目太多了&#xff0c;我就把其中一个项目的文件夹直接拷贝到电脑…

离职总结:大公司与小公司的个人体验

离职在即&#xff0c;在准备下一个工作环境的这段时间&#xff0c;忽然有一阵感慨&#xff0c;工作近五年&#xff0c;在这段时间中&#xff0c;体验了两种不同的工作环境&#xff1a;一个规模很大&#xff0c;各种开发体系完备的大公司&#xff0c;另一个&#xff08;也是目前…

java导入导出excel_Java导入导出Excel工具 easyexcel

Java导入导出Excel工具 easyexcel做Java开发的同学&#xff0c;尤其是做管理后台的同学绝大多数都会接触到报表系统&#xff0c;这时候就少不了Excel的导入和导出了。Java解析生成Excel比较有名的有Apache POI &#xff0c;但是POI存在缺陷就是所有的数据的解析都是在内存中进…

浅谈.Net Core后端单元测试

1. 前言单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题。具体是否应该落地单元测试&#xff0c;以及落地的程度, 每个项目都有自己的情况。本篇为个人认为"如何更好地写单元测试", 即更加偏向实践向中夹杂一些理论的…

图论的各种基本算法

本篇主要涉及到图论的基本算法&#xff0c;不包含有关最大流的内容。图论的大部分算法都是由性质或推论得出来的&#xff0c;想朴素想出来确实不容易。二分图(Is-Bipartite)一个图的所有顶点可以划分成两个子集&#xff0c;使所有的边的入度和出度顶点分别在这两个子集中。这个…

社区 正式发布了跨平台的 CoreWCF 0.1.0 GA

CoreWCF 项目在2021.2.19 正式发布了0.1.0 GA版本:https://github.com/CoreWCF/CoreWCF/releases/tag/v0.1.0 &#xff0c;这个版本号虽然是0.1&#xff0c;但是它是可以投入生产的版本&#xff0c;而且是跨平台的&#xff0c;支持LInux部署WCF&#xff0c;当前仅支持http 和 n…

Prim 算法及其高效实现

转自&#xff1a;ivy-endhttp://www.ivy-end.com/archives/943背景最小生成树&#xff08;Minimum Spanning Trees&#xff09;&#xff0c;简称MST。是图论中一个非常重要的概念。解决这个问题有两种算法&#xff0c;今天暂且先来讨论一下Prim Algorithm。不做特别说明&#x…

Silverlight实例教程 - Validation数据验证开篇

说起来Validation验证功能&#xff0c;相信大家都不陌生&#xff0c;在应用中&#xff0c;当需要用户交互输入时&#xff0c;开发人员都会加入一些验证代码&#xff0c;这样可以有效的避免应用异常出现&#xff0c;也可以使应用的错误提示信息清晰明了的显示在客户端&#xff0…

一日一技:微信扫码用户帐号绑定

概述最近在整一个微信扫码用户帐号绑定功能。为了满足用户帐号绑定场景的需要&#xff0c;通过生成用户自己的二维码&#xff0c;用户扫描后&#xff0c;公众号可以接收到事件推送。如下1、用户登录扫码2、绑定成功实现思路扫码绑定账户&#xff0c;其实就是扫描带有用户信息的…

计算机起源的数学思想

人类的历史可以看做一部关于解放的历史。也有这样的说法&#xff0c;懒惰是人类进步的动力。为了偷懒&#xff0c;人类不断的做着各种努力&#xff0c;发明了各种机器工具&#xff0c;将自己从繁重的劳动解放出来&#xff0c;另一方面&#xff0c;每一次大的进步&#xff0c;都…

Redis 通过 RDB 方式进行数据备份与还原

Redis 通过 RDB 方式进行数据备份与还原Intro有的时候我们需要对 Redis 的数据进行迁移&#xff0c;今天介绍一下通过 RDB&#xff08;快照&#xff09;文件进行 Redis 数据的备份和还原Redis 持久化Redis 的数据持久化有两种机制&#xff0c;一种是 RDB(Redis Database)&#…

java proguard 使用_一步步教你使用Proguard混淆Java源代码

ava代码很容易被反编译&#xff0c;以下使用proguard来保护我们的代码proguard选项很多&#xff0c;容易迷糊&#xff0c;现在就把我的配置写下来(实际使用中)&#xff0c;以供参考2.准备好你的jar包&#xff0c;我在这里举例叫做test.jar。3.解压proguard&#xff0c;执行 bin…