Ant Design Blazor 组件库的路由复用多标签页介绍

前言

Blazor 是 .NET 最新的前端框架,可以基于 WebAssembly 或 SignalR (WebSocket)构建前端应用程序,基于 WebAssembly 托管模型的 Blazor 甚至可以离线运行。再加上可以共用 .NET 类库,能使代码量比以往的基于 JS 的前后端分离模型少 1/3。而且现在 .NET 开发者也可以使用自己熟悉的技术和经验来开发前端应用了,不同技术栈的开发人员之间的沟通成本也大大减少,从而再一次解放了生产力。

所以,Blazor 是 .NET 开发者的又一生产力技术!

通过使用 Blazor 社区生态开源的 UI 组件库,常用的组件都被封装了起来,用户再也不需要写 JS 和 CSS 了,使得 .NET 开发人员在社区里连连称赞。目前,已经有大量的基于 Blazor 构建的企业级应用程序被部署上线,逐渐被企业认可。

正文

什么是路由复用多标签页

Ant Design Blazor 组件库中的多标签页(点击原文查看动图)

本文标题中的路由复用,是 Angular 的 RouteReuseStrategy 中的概念,在中文社区也常被称作“多标签页”,主要的功能是当切换页面时,保持页面的状态,并且可以通过任意切换页面,当前展示的页面状态能够恢复。通常是被用在比较复杂的后台管理系统,用户可以在筛选了表格后,进入记录的详情页,再回到列表页后,仍然能保持原来的搜索条件、翻页数等等;也或者是填写表单时,需要去别的页面查看正确的信息,在回到表单时,表达上已填过的内容不会丢失。

而由于天然的能复用 C# 代码的优势, Blazor 通常被用于构建后台管理系统,所以使用标签页就成为了普遍的需求。然鹅,Blazor 官方团队并没有给我们直接提供这样的组件,所以就需要社区的小伙伴来实现了。

但是纵观社区中的几个开源组件库,都只是实现了通用的 Tabs 标签页组件,只能当作切换面板来使用。要用来实现“多标签页”的功能,要么不支持,要么还得要直接或间接地依赖自己菜单组件和布局组件,再要依赖页面文件路径,拼接出页面组件的类型,最后用反射来创建页面组件……

虽然说它们确实实现了多标签页的功能,但是实现方式不甚优雅。耦合度非常高,只能在组件库自己的框架布局中使用,而不能单独拎出来使用。另外,反射的性能也不好,还要把页面按照约定放置,对用户种种制约。

当然,社区中还流传一个比较认可的方案,就是 BlazorDemoMultiPagesTab 项目。它提供了一个原型,通过结合 Blazor 内置的路由组件实现了路由多标签页。但问题是它只是一个 demo,只实现了原理,代码比较凌乱,作者也没有再做整理,也没有封装成组件,如果想在自己项目中使用起来,肯定会薅秃自己的头发的。

Ant Design Blazor 中的 ReuseTabs 组件

最近,在 Ant Design Blazor 组件库中实现多标签页组件的呼声日益高涨。于是,我利用周末时间,基于 BlazorDemoMultiPagesTab 中提供的思路,结合 Blazor 内置路由组件实现了基于 Tabs 组件的 ReuseTabs 组件。

ReuseTabs 组件只包含两个子组件,ReuseTabsRouteViewReuseTabs,其中 ReuseTabsRouteView 继承自内置的 RouteView 组件,负责接管页面组件的生命周期,使页面组件能够保持状态或被销毁;ReuseTabs 负责标签的展示和交互。除此之外,没有再依赖菜单、布局之类的其他组件,因此可以直接用于任何 Blazor 应用程序,也可以很好地与其他组件库一起使用。

主要的特点

  • 只需修改两处代码即可应用

  • 支持静态或动态地设置标签名

  • 与路由同步,支持 <a> 标签、NavigationManger 等各种方式的跳转

下面介绍一下基础的使用方法,以 dotnet new 模板项目为例。

使用方法

  1. 首先,按照 Ant Design Blazor 文档中介绍的方式安装 AntDesign 包和服务注册。

  2. 然后,修改项目中的 App.razor 文件,把 RouteView 替换成 ReuseTabsRouteView

    <Router AppAssembly="@typeof(Program).Assembly"><Found Context="routeData">
    -       <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" / >
    +       <ReuseTabsRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /></Found>...
    </Router>
    
  3. 修改项目中的 MainLayout.razor 文件,

    @inherits LayoutComponentBase<div class="page"><div class="sidebar"><NavMenu /></div><div class="main">
    -       <div class="top-row px-4">
    -           <a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a>
    -       </div>
    -       <div class="content px-4">
    -           @Body
    -       </div>
    +       <ReuseTabs Class="top-row px-4" TabPaneClass="content px-4" / ></div>
    </div>
    
  4. 两种方式自定义标签名

    @page "/counter"
    + @attribute [ReuseTabsPageTitle("Counter")]
    
    @page "/"
    + @implements IReuseTabsPage<h1>Hello, world!</h1>@code{
    +   public RenderFragment GetPageTitle() =>
    +       @<div>
    +           <Icon Type="home"/> Home
    +       </div>
    +   ;
    }
    
  • 如果需要使用模板来获取动态的标签名,比如添加另一个组件,或者从页面内容中获取标题,需要实现 IReuseTabsPage 接口:

  • 如果是纯文本,可以在页面组件使用 ReuseTabsPageTitle 特性。

注意:当前 ReuseTabs 组件在 0.9.0 版本的每日构建包中,在正式发布之前,需要参考文档中介绍的方式[1]来安装。

后续功能

目前该组件只实现了基本的功能,还有一些功能在后续的计划当中:

  • 右键菜单

  • 代码方式关闭

  • 缓存策略

  • 路由守卫与权限控制

后记

Blazor 社区中对多标签页的呼声有一年多了,这几天终于实现了,国内外的社区都一片欢腾,也是颇有成就感的。

对于实现的细节,感兴趣的同学可以到 Ant Design Blazor 的源码中查看,也只是几个文件。当然,如果感兴趣的同学比较多,我也可以写一篇详细的文章来介绍。

其实我是比较希望社区中能有更多的爱好者站出来,分享心得、贡献开源项目,这样才能让社区健康发展起来。Ant Design Blazor 发展至今已有一年有多,但是说实话相对于其他组件库项目的作者,我自己的投入的时间和贡献并没有很多。其中除了贡献代码,一大部分精力都花在了社区的运营。为项目作宣传,把路人变成用户,再把用户变成贡献者,让更多人各自花少量精力,达到众人拾柴的效果,才是开源项目得以长期活跃的长久之计。

最后还是非常感激支持我们的用户和贡献者!他们的每个 issue、案例和 PR 都是对我们的肯定,也是让我们坚持的动力!

参考链接

  • https://github.com/BlazorPlus/BlazorDemoMultiPagesTab

  • https://github.com/ant-design-blazor/demo-reuse-tabs

  • https://antblazor.com/docs/nightly-build

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

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

相关文章

c语言程序设计稀土,稀土掺杂Tarkall-C合金多尺度设计及计算

摘要&#xff1a;为研制应用于船用低速机缸套的新型铸铁材料,提出多尺度设计稀土掺杂Tarkall-C合金,使其符合设计使用要求。本文主要使用多尺度模拟方法,从第一性原理计算及有限元模拟两个方面,对稀土掺杂Tarkall-C合金进行了研究。从第一性原理的角度,从量子尺度研究了稀土掺杂…

WOL远程开机

最近在一直都在研究PC机硬件和软件相结合的软件&#xff0c;硬件信息都是通过C与驱动结合获取。对于一个好久都没有接触C的人来说看这些东西太费劲了&#xff0c;必须的重新捡一下C的基础知识&#xff0c;必然也少不了C知识&#xff0c;底层都是通过C与C结合&#xff0c;提供接…

代码收藏——js+asp 的屏幕滚动脚本

最近刚刚到公司&#xff0c;写得这个东西&#xff0c;放在这里收藏一下&#xff0c;方便以后用。 效果演示&#xff1a;http://www.9600100.com/ <script type"text/javascript" language"javascript"> <%divID%>marqueesHeightone300; <%d…

AI 竟然通过了初中生考试!?这意味着什么?

全世界只有3.14 % 的人关注了青少年数学之旅2016 年 AlphaGo 战胜世界棋王李世石&#xff0c;被认为是人工智能一个重要的里程碑。此后 AlphaGo 又击败了世界排名第一的围棋选手柯洁&#xff0c;AI 也在德州扑克、Dota 2 等游戏上战胜了专业的人类玩家&#xff0c;越来越聪明的…

基于Yarp实现内网http穿透

Yarp介绍YARP是微软开源的用来代理服务器的反向代理组件&#xff0c;可实现的功能类似于nginx。基于YARP&#xff0c;开发者可以非常快速的开发一个性能不错的小nginx&#xff0c;用于代理http(s)请求到上游的http(s)服务。http穿透原理同网现象在http反向代理里&#xff0c;代…

怎么把c语言转换汇编程序,如何把汇编语言转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼程序:ORG 0000HLJMP MAINORG 000BHLJMP TIMEORG 1000HHOUR1 EQU 10hHOUR2 EQU 12hMIN1 EQU 14hMIN2 EQU 16hSEC1 EQU 18HCOUNT EQU 20HNUM1 EQU 22HNUM2 EQU 24HLL4 EQU 26Hs1 bit P1.0s2 bit P1.1s3 bit P1.2s4 bit P1.3A1 EQU 36…

Linux命令——chmod

chmod----改变一个或多个文件的存取模式(mode)chmod [options] mode files只能文件属主或特权用户才能使用该功能来改变文件存取模式。mode可以是数字形式或以who opcode permission形式表示。who是可选的&#xff0c;默认是a(所有用户)。只能选择一个opcode(操作码)。可指定多…

学习STL map, STL set之数据结构基础

STL map和set的使用虽不复杂&#xff0c;但也有一些不易理解的地方&#xff0c;如&#xff1a; 或许有得人能回答出来大概原因&#xff0c;但要彻底明白&#xff0c;还需要了解STL的底层数据结构。 C STL 之所以得到广泛的赞誉&#xff0c;也被很多人使用&#xff0c;不只是提供…

男科医生到底有多不正经… | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源真是个鬼才&#xff09;赶紧转给了身边有这种经历的朋友↓ ↓ ↓

5张图带你了解Pulsar的存储引擎BookKeeper

Apache BookKeeper是一款企业级存储系统&#xff0c;最初由雅虎研究院研发&#xff0c;在2011年作为Apache ZooKeeper的子项目进行孵化&#xff0c;在2015年1月成为 Apache顶级项目。起初&#xff0c;BookKeeper是一个预写日志(WAL)系统&#xff0c;经过几年的发展&#xff0c;…

筛选装置用c语言编程,一种空壳瓜子筛选装置的制作方法

本实用新型涉及食品机械领域&#xff0c;特别是一种空壳瓜子筛选装置。背景技术&#xff1a;食品机械是指把食品原料加工成食品(或半成品)过程中所应用的机械设备和装置。食品工业是我国国民经济的支柱产业&#xff0c;食品机械是为食品工业提供装备的行业。随着人民生活水平的…

SO_REUSEADDR

转载&#xff1a; http://www.cppblog.com/aa19870406/archive/2012/07/12/183018.html http://www.cnblogs.com/mydomain/archive/2011/08/23/2150567.html 编写 TCP/SOCK_STREAM 服务程序时&#xff0c;SO_REUSEADDR到底什么意思&#xff1f;这个套接字选项通知内核&#xff…

唱响春天

春天&#xff0c;对就是在这个春天我在博客园里注册了这个ID。一直以来都没有在这里写点什么东西&#xff0c;我想在有空的时候是应该写点东西了。昨天看了江苏卫视的一个叫“绝对唱响”的节目&#xff0c;觉得很有意思&#xff0c;有些许感人的场面&#xff0c;有些触动&#…

不止 Windows 10!Windows 7/8 也能免费升级到 Windows 11

起初&#xff0c;微软宣布为 Windows 7、Windows 8 和 Windows 8.1 用户提供的 Windows 10 免费升级于 2016 年结束。Windows 11 免费升级近日&#xff0c;微软表示将继续支持从 Windows 7、Windows 8 和 Windows 8.1 用户免费升级到 Windows 10 或 Windows 11 &#xff0c;只要…

c语言求平衡因子,平衡二叉树(AVL树)的基本操作

0x00、平衡二叉树的定义平衡二叉树(AVL树)是一种特殊的二叉搜索树&#xff0c;只是在二叉搜索树上增加了对"平衡"的需求。假如一棵二叉搜索树&#xff0c;按照“1,2,3,4,5”的顺序插入数据&#xff0c;会发现二叉树甚至变成了一个线性的链表状结构&#xff0c;这样查…

学校老师绝对不会教的方法,让你的孩子拥有一个开挂般的人生!

比勤奋更重要的&#xff0c;是孩子的思维能力。从上幼儿园开始&#xff0c;很多父母很喜欢给孩子报各种兴趣班&#xff0c;比如钢琴班、英语班、乐高班、报各种各样的课程&#xff0c;就是希望孩子具有18般武艺&#xff0c;赢在起跑线上。其实除了外在的能力&#xff0c;不显山…

通过openpctv简单学习opkg安装与生成包的一些过程

http://linuxtoy.org/archives/openpctv-adding-full-tv-functionality-to-htpc.htmlOpenPCTV - 让你的HTPC拥有更全面的电视功能通过linuxtoy了解到openPCTV是使用opkg打包的获得源代码&#xff1a;git clone git://git.code.sf.net/p/openpctv/code openpctv-code下载完后发现…

保证一个用户已选取的记录不被其他用户选取

问题描述&#xff1a;  用ADO访问数据库&#xff0c;从一个表中取一定的记录&#xff08;比如20行&#xff09;&#xff0c;取出后在程序中使用&#xff0c;使用完后删除掉记录&#xff08;不用更新或删除记录&#xff09;。在多用户操作下(每个用户采用相同的操作)&#xff…

解答网友提问:如何构建动态表达式实现高级查询服务

上次我们介绍了"一秒创建高级查询服务"。前天&#xff0c;有网友在公众号后台问我&#xff0c;怎么使用动态表达式&#xff1a;我想应该是客户提出了更高的要求&#xff0c;查询的条件不仅限于大于、小于&#xff0c;更加多样化&#xff0c;需要动态组合成条件&#…

π!到底蕴藏了多少不为人知的秘密?|今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;赶紧检查一下π里面有没有你的秘密↓ ↓ ↓