webassmbly blazor实现多页签效果

Posted henreash

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webassmbly blazor实现多页签效果相关的知识,希望对你有一定的参考价值。

最终效果如上图。

多页签使用BlazorStrap中的BSTabGroup、BSTabList组件,内嵌绑定的BSTab:

<div>
    <NavMenu OnShowLog="ShowLog" OnShowModel="ShowModel" />
</div>
<div class="container">
    <BSTabGroup ShownEvent="@Shown" @ref="tabGroup">
        <BSTabList>
            @foreach (var tabInfo in tabInfoList)
            
                <BSTab InitialSelection="@IsTabSelected(tabInfo.Item3.FullName)" Selected="@IsTabSelected(tabInfo.Item3.FullName)" id="@tabInfo.Item3.FullName">
                    <BSTabLabel>
                        @tabInfo.Item1
                        @if (!tabInfo.Item1.Equals("首页"))
                        
                        <span>&nbsp;</span><span class="text-danger" @onclick="@(()=>CloseTab(tabInfo.Item3.FullName))">x</span>
                        
                    </BSTabLabel>
                    <BSTabContent>
                        @tabInfo.Item2
                    </BSTabContent>
                </BSTab>
            
        </BSTabList>
        <BSTabSelectedContent />
    </BSTabGroup>
</div>

上面第一个div创建主菜单;第二个div声明了多页签。多页签自动遍历tabInfoList中的数据,绘制界面。BSTab没有实现可关闭的效果,因此使用span定义了一个关闭小按钮,点击页签名称后的x,关闭页签。对于首页页签,不提供关闭功能,用@if做了判断。BSTabGroup封装的还是不够到位,控制过程有绑定,有也设置属性的方式。Blazor资料也比较少,开发过程中需要查看代码找解决方法。

private List<Tuple<string, RenderFragment, Type>> tabInfoList = new List<Tuple<string, RenderFragment, Type>>();

//初始化的时候,添加首页页签
protected override void OnInitialized()
    
        Storage.SetItem("environment_uri", String.Empty);
        Storage.SetItem("environment_uri", UriHelper.BaseUri + "api");
        tabInfoList.Add(new Tuple<string, RenderFragment, Type>("首页", CreateDynamicComponent(typeof(BlazorCrud.Client.Pages.Index)),typeof(BlazorCrud.Client.Pages.Index)));
    

void ShowModel(Tuple<string, Type> modelInfo)
    
        var tabInfo = tabInfoList.FirstOrDefault(t => t.Item3 == modelInfo.Item2);
        if(tabInfo != null)
        
            //找到一打开页签,则激活即可
            ShowLog($"打开已存在页签  selectedModel");
            tabGroup.Selected = tabGroup.Tabs[tabInfoList.IndexOf(tabInfo)];
            StateHasChanged();
            return;
        
        tabInfoList.Add(new Tuple<string, RenderFragment, Type>(modelInfo.Item1, CreateDynamicComponent(modelInfo.Item2), modelInfo.Item2));
        selectedModel = modelInfo.Item2.FullName;
        StateHasChanged();
    
//基于Blazor的渲染原理,动态创建组件的时候,传递组件的Type,绘制时自动创建组件实例,输出组件的html和css
RenderFragment CreateDynamicComponent(Type type) => builder =>
    
        var seq = 0;
        builder.OpenComponent(seq, type);
        builder.CloseComponent();
    ;
    //关闭页签,这里直接从tabInfoList中删除对应的元素即可,界面会自动刷新
    void CloseTab(string id)
    
        var tab = tabInfoList.FirstOrDefault(t=>t.Item3.FullName.Equals(id));
        if(tab != null)
        
            tabInfoList.Remove(tab);
            if(tabInfoList.Count > 0)
            
                ShowModel(new Tuple<string, Type>(tabInfoList.Last().Item1, tabInfoList.Last().Item3));
            
        
    

blazor中组件间通信机制:子组件定义事件,父组件绑定响应方法。父组件引用子组件时用@ref定义子组件的名字,在代码中声明同名成员,即可得到子组件实例,直接调用子组件中的公共方法。

开发完毕发布到服务器上,需要源码中wwwroot目录、编译后的_framework目录(两者同级),请求后报错,还有一个_content目录,需要在vs调试环境下,启动程序页面,将页面另存为,获取到所有依赖文件,在根据运行错误提示,将依赖文件按要求放入_content的子目录中。即可在非iis服务器上发布成功。如浏览器提示错误,在根据错误提示,调整wwwroot、_framework、_content中文件的位置即可。

查看调试程序运行信息:右下角找到IIS Express小图标,右键,显示应用程序所在位置及url:

vs提供的发布功能:blazor客户端项目,右键,发布,发布到文件夹,即可获取到完整的目录。

 

 

以上是关于webassmbly blazor实现多页签效果的主要内容,如果未能解决你的问题,请参考以下文章

基于微前端qiankun的多页签缓存方案实践

layui 手把手教你实现多页签打开页面

记一次基于vue的spa多页签实践经验

vue-multi-tab--一个让你在SPA里使用多页签的框架页

vue-multi-tab--一个让你在SPA里使用多页签的框架页

vue3.0+ts+element-plus多页签应用模板:侧边导航菜单(下)