前面用iframe实现了多标签页,这次是不用iframe实现的多标签页.参考了一下Ant Design Blazor.

基本功能已经都实现了不论是标签滚动、激活、左移、右移、关闭其他,还是在内容页跳转、新增、关闭标签都有实现。

已经可以用来做实际项目

源码地址: https://github.com/liningit/BlazorWebassemblyMultiPagesTabNoIframe

实现原理是新建一个类继承RouteView,在此类里面的Render方法中可以通过RouteData获取当前路由对应的对象.然后生成RenderFragment.

然后将其保存到List中,然后循环显示出来.对于未激活的通过display:none隐藏就可以了,这样哪怕切换标签状态也是保存的并不会刷新

    public class ReuseTabsRouteView : RouteView
{
[Inject]
public TabSetTool TabSetTool { get; set; } [Inject]
public NavigationManager Navmgr { get; set; } protected override void Render(RenderTreeBuilder builder)
{
var layoutType = RouteData.PageType.GetCustomAttribute<LayoutAttribute>()?.LayoutType ?? DefaultLayout; var body = CreateBody(RouteData, Navmgr.Uri); builder.OpenComponent<CascadingValue<ReuseTabsRouteView>>(0);
builder.AddAttribute(1, "Name", "RouteView");
builder.AddAttribute(2, "Value", this); builder.AddAttribute(3, "ChildContent", (RenderFragment)(b =>
{
b.OpenComponent(20, layoutType);
b.AddAttribute(21, "Body", body);
b.CloseComponent();
})); builder.CloseComponent();
var url = "/" + Navmgr.ToBaseRelativePath(Navmgr.Uri);
if (url != "/#")
{
var selTab = TabSetTool.Pages.FirstOrDefault(m => m.Url == url && (m.Title == TabSetTool.Title || string.IsNullOrEmpty(m.Title)));
if (selTab == null)
{
TabSetTool.Pages.Add(new Tab
{
Body = body,
Url = url,
Title = TabSetTool.Title,
IsActive = true,
});
}
else
{
selTab.Title = TabSetTool.Title;
selTab.Body = body;
selTab.IsActive = true;
}
}
} private RenderFragment CreateBody(RouteData routeData, string url)
{
return builder =>
{
builder.OpenComponent(0, routeData.PageType);
foreach (var routeValue in routeData.RouteValues)
{
builder.AddAttribute(1, routeValue.Key, routeValue.Value);
}
builder.CloseComponent();
};
} }

App.razor中将RouteView改成ReuseTabsRouteView.

另外要注意TabSet中一定要有

[CascadingParameter(Name = "RouteView")]
public ReuseTabsRouteView RouteView { get; set; }

这两句,要不然页面会不更新

最新文章

  1. Kooboo CMS 之TextContent详解
  2. laravel redis
  3. 建工财务搬家NC变更|rman各种测试|
  4. Java Hour 12 Generic
  5. 《Code Complete》ch.23 调试
  6. Android(java)学习笔记106-1:深入分析Java ClassLoader原理
  7. [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
  8. Ubuntu下安装Qt4.5(包括X86和ARM版本)
  9. gdb小结
  10. 如何用PowerPoint制作闪烁的星星
  11. 自己写的Ext树,Ext3.4,静态全部加载
  12. Bootstrap验证控件的使用
  13. 【代码笔记】Web-CSS-CSS Padding(填充)
  14. Windows将自己的代码发布到Github上
  15. maven自动部署项目以及常见问题解决
  16. nodejs 如何操作字节在内存中的位置问题 BE LE
  17. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)
  18. [leetcode]Validate Binary Search Tree @ Python
  19. cnblogs反对按钮点击测试
  20. python笔记01:基础知识

热门文章

  1. Redis | 第一部分:数据结构与对象 下篇《Redis设计与实现》
  2. 谱文混排之lilypond-book
  3. WinRAR下载
  4. 洛谷 P3580 - [POI2014]ZAL-Freight(单调队列优化 dp)
  5. 模仿UP主,用Python实现一个弹幕控制的直播间!
  6. python版的MCScan绘图
  7. SSH客户端工具连接Linux(有的也可以连接Windows、mac、iOS等多系统平台)
  8. Linux之vi和vim编辑器
  9. Excel-转换单元格格式的函数或“方法”汇总
  10. 48-Merge Sorted Array