• Blazor Webassembly多标签页实现非iframe的实现


    前面用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; }
    

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

  • 相关阅读:
    第04组(64) 团队展示
    结对编程作业
    第一次个人编程作业
    寒假第二份大礼包
    热身礼包初体验,欢欢喜喜过大年
    第08组 Beta冲刺 (1/5)
    第08组 Alpha冲刺 总结
    第五次作业
    第08组 Alpha冲刺 (6/6)
    第08组 Alpha冲刺 (5/6)
  • 原文地址:https://www.cnblogs.com/liningit/p/15716595.html
Copyright © 2020-2023  润新知