Blazor_WASM之3:项目结构

简介: Blazor WebAssembly项目模板可选两种,Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty

Blazor_WASM之3:项目结构

Blazor WebAssembly项目模板可选两种,Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty

  • 如果使用Blazor WebAssemblyAPP模板,则应用将填充以下内容:
  • 一个 FetchData 组件的演示代码,该组件从静态资产 (weather.json) 加载数据,且用户与 Counter 组件交互。
  • Bootstrap前端工具包。
  • 如果使用 blazorwasm-empty 模板,则无需演示代码和 Bootstrap 即可创建应用。

项目结构

Pages目录

包含构成 Blazor 应用的可路由组件/页面 (.razor),每个页面的路由使用 @page指令指定,目录下的Index 组件 (Index.razor)为Home 页。

每个razor都会在后台编译成一个类,以自带的Counter.razor为例。

Counter.razor文件

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<prole="status">Current count: @currentCount</p>

<buttonclass="btn btn-primary"@onclick="IncrementCount">Click me</button>

@code {

   private int currentCount = 0;

   private void IncrementCount()

   {

       currentCount++;

   }

}

反编译后

[Route("/counter")]

publicclassCounter : ComponentBase

{

   privateintcurrentCount=0;

   protectedoverridevoidBuildRenderTree(RenderTreeBuilder__builder)

   {

       __builder.OpenComponent<PageTitle>(0);

       __builder.AddAttribute(1, "ChildContent", (RenderFragment)delegate(RenderTreeBuilder__builder2)

       {

           __builder2.AddContent(2, "Counter");

       });

       __builder.CloseComponent();

       __builder.AddMarkupContent(3, "\r\n\r\n");

       __builder.AddMarkupContent(4, "<h1>Counter</h1>\r\n\r\n");

       __builder.OpenElement(5, "p");

       __builder.AddAttribute(6, "role", "status");

       __builder.AddContent(7, "Current count: ");

       __builder.AddContent(8, currentCount);

       __builder.CloseElement();

       __builder.AddMarkupContent(9, "\r\n\r\n");

       __builder.OpenElement(10, "button");

       __builder.AddAttribute(11, "class", "btn btn-primary");

       __builder.AddAttribute(12, "onclick", EventCallback.Factory.Create<MouseEventArgs>((object)this, (Action)IncrementCount));

       __builder.AddContent(13, "Click me");

       __builder.CloseElement();

   }

   privatevoidIncrementCount()

   {

       currentCount++;

   }

}

通过对比,Razor组件会自动继承自ComponentBase,并且@code中的代码完全移入了编译后的类,而各种标签会在BuildRenderTree方法中用方法的形式进行输出。

PlaunchSettings.json

设置开发环境配置

Shared目录

  • MainLayout 组件 (MainLayout.razor):应用的布局组件。
  • MainLayout.razor.css:应用主布局的样式表。
  • NavMenu 组件 (NavMenu.razor):实现边栏导航。 包括 NavLink组件,该组件可向其他 Razor 组件呈现导航链接。
  • NavMenu.razor.css:应用导航菜单的样式表。
  • SurveyPrompt 组件 (SurveyPrompt.razor):Blazor 调查组件。

App.razor

应用的根组件,用于使用 Router 组件来设置客户端路由。app.razor中代码

<RouterAppAssembly="@typeof(App).Assembly">

   <FoundContext="routeData">

       <RouteViewRouteData="@routeData"DefaultLayout="@typeof(MainLayout)"/>

       <FocusOnNavigateRouteData="@routeData"Selector="h1"/>

   </Found>

   <NotFound>

       <PageTitle>Not found</PageTitle>

       <LayoutViewLayout="@typeof(MainLayout)">

           <prole="alert">Sorry, there's nothing at this address.</p>

       </LayoutView>

   </NotFound>

</Router>

如果发现有相应的组件则跳转过去,如果没有则会出现Sorry, there's nothing at this address.

wwwroot

应用的 Web 根目录文件夹,其中包含应用的公共静态资产,其中index.html 网页是实现为 HTML 页面的应用的根页面:

  • 最初请求的任何页面,都会呈现此页面。
  • 此页面指定 App 组件的呈现位置。 使用 appid (<div id="app">...</div>) 在 div DOM 元素的位置呈现组件。

index.html

<body>

   <divid="app">

       <!--等待进度框图片-->

       <svgclass="loading-progress">

           <circler="40%"cx="50%"cy="50%"/>

           <circler="40%"cx="50%"cy="50%"/>

       </svg>

       <divclass="loading-progress-text"></div>

   </div>

   <!--如果出现错误则会出现-->

   <divid="blazor-error-ui">

       An unhandled error has occurred.

       <ahref=""class="reload">Reload</a>

       <aclass="dismiss">🗙</a>

   </div>

   <scriptsrc="_framework/blazor.webassembly.js"></script>

</body>

_Imports.razor

包括要包含在应用组件 (.razor) 中的常见 Razor 指令,如 @using指令

Program.cs

应用入口点,.net 7使用了顶级语法

usingMicrosoft.AspNetCore.Components.Web;

usingMicrosoft.AspNetCore.Components.WebAssembly.Hosting;

varbuilder=WebAssemblyHostBuilder.CreateDefault(args);

builder.RootComponents.Add<App>("#app"); //将APP替换了index.html中id="app"的内容

builder.RootComponents.Add<HeadOutlet>("head::after");

//添加并配置了服务

builder.Services.AddScoped(sp=>newHttpClient { BaseAddress=newUri(builder.HostEnvironment.BaseAddress) });

awaitbuilder.Build().RunAsync();


相关文章
|
Java Spring
聊一下Spring Boot配置的加载顺序
聊一下Spring Boot配置的加载顺序
161 0
|
存储 Java 应用服务中间件
IntelliJ IDEA - 远程 remote debug 教程实战和要点总结
IntelliJ IDEA - 远程 remote debug 教程实战和要点总结
4256 0
IntelliJ IDEA - 远程 remote debug 教程实战和要点总结
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之在执行语句时遇到语法错误,是由什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
242 1
|
7月前
|
开发框架 前端开发 JavaScript
一文彻底搞清楚HarmonyOS中的ArkUI
本文介绍了华为推出的跨平台UI框架ArkUI,旨在简化多平台应用开发。ArkUI支持声明式和类Web两种开发范式,其中声明式开发范式因其高效简洁、性能优越和未来发展潜力而被推荐。ArkUI提供了丰富的组件、布局、动画和交互事件等功能,帮助开发者构建美观流畅的应用界面。其架构体系包括声明式UI前端、语言运行时、后端引擎、渲染引擎和平台适配层,确保高效开发和跨平台兼容性。
474 0
一文彻底搞清楚HarmonyOS中的ArkUI
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
656 4
|
8月前
|
安全 Serverless API
多模态数据信息提取解决方案评测
该方案展示了如何利用阿里云的多模态大模型服务进行文本、图片和文档的信息提取。通过函数计算(FC)调用百炼模型服务API,实现信息提取功能。具体步骤包括: 1. **开通百炼模型服务**:获取API Key,确保可以调用大模型。 2. **部署应用**:使用函数计算部署应用模板,配置参数并创建环境。 3. **访问示例应用**:通过提供的域名访问示例网站,测试信息提取功能。 4. **清理资源**:删除函数计算和OSS Bucket等资源,避免产生额外费用。 此方案具备多模态推理、易于扩展、灵活调用模式和便捷安全的云产品接入等优点,适用于多种业务需求。
332 28
|
9月前
|
API
鸿蒙开发:实现popup弹窗
目前提供了两种方式实现popup弹窗,主推系统实现的方式,几乎能满足我们常见的所有场景,当然了,文章毕竟有限,尽量还是以官网为主。
246 2
鸿蒙开发:实现popup弹窗
|
11月前
|
消息中间件 网络协议 API
微服务之间是如何独立通讯的?
微服务之间独立通讯主要依靠定义清晰的API协议、使用轻量级交互机制、以及通过服务发现机制维持服务间连接。微服务体系结构中,每个服务都设计为独立部署的单元,它们通过网络调用彼此的API以实现互操作。
321 0
|
11月前
|
传感器 算法 机器人
基于Arduino的3D打印六足机器人
基于Arduino的3D打印六足机器人
211 0
|
编译器 C++
【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
📚 C++ 知识点概览:探索类的`static`成员、友元及应用🔍。