草庐IT

Blazor Server 从头开始:02 创建组件

Just be a Coder! 2023-03-28 原文

? 系列导航

? 阅读说明

此部分内容旨在说明各种Blazor的基本概念与使用方法,并没有提供实际的教程式代码,所以读者没必要把代码敲一遍。没得意义。

? Razor 组件 

Razor组件是Blazor应用的基本单元,每一个页面或页面上的元素都可以是一个组件,或者说,可以将组件看成是一个页面或引用到一个页面的一部分。

Razor组件分成三个部分组成,

1)声明:@page  "路由名称" ,用于表示当前页面的路由;@layout 模板名称,表示当前组件使用哪个布局模板;@inherits LayoutComponentBase,表示当前组件是一个布局组件等。

2)页面:使用HTML语言进行描述,中间穿插一些Razor的模板语法,用来表示组件应该长什么样,都有什么元素。

3)逻辑:@code { ... } ,描述组件的交互逻辑,比如某个按钮的单击事件、页面数据的延迟加载、组件参数/属性等。

示例代码:

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

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

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

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
View Code

?️ Blazor 基础路由

Blazor 通过路由组件<Router>将来自用户的请求路由到 Razor 组件。 <Router>组件在Blazor应用中的App组件内使用,默认会使用<Found>来描述可以找到路由信息时,如何进行处理,使用<NotFound>来描述找不到路由信息时,如何处理。

Blazor 路由用来将创建好的Razor组件与具体的URL绑定在一起。(这里与其他框架不同,路由的定义不是在一个单独的文件里面,而是在每个组件的声明部分,使用 @page "路由名称" 表示。

编译带有 @page 指令的 Razor 组件 (.razor) 时,将为生成的组件类提供一个 RouteAttribute 来指定组件的路由模板。

当应用启动时,将扫描指定为 路由器的 AppAssembly 的程序集,来收集具有 RouteAttribute 的应用组件的路由信息。

—— 《ASP.NET Core Blazor 路由和导航》

默认的 App 组件

 1 <Router AppAssembly="@typeof(App).Assembly">
 2     <Found Context="routeData">
 3         <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
 4         <FocusOnNavigate RouteData="@routeData" Selector="h1" />
 5     </Found>
 6     <NotFound>
 7         <PageTitle>Not found</PageTitle>
 8         <LayoutView Layout="@typeof(MainLayout)">
 9             <p role="alert">Sorry, there's nothing at this address.</p>
10         </LayoutView>
11     </NotFound>
12 </Router>
View Code

 

? Blazor 基础布局

与其他框架类似,Blazor可以将页面中的通用部分抽象成模板,然后放入到布局组件中。

在布局组件的声明部分,使用 @inherits LayoutComponentBase 表示当前组件是一个布局组件,然后就可以在其他的组件中使用  @layout 组件名称 来进行引用。

在布局组件的元素部分,可以编写使用此布局的组件的通用描述,比如左侧导航、底部说明等内容。然后使用 @body 表示引用此布局组件的页面组件的内容。

默认的 MainLayout.razor 组件

 1 @inherits LayoutComponentBase
 2 
 3 <div class="page">
 4     <div class="sidebar">
 5         <NavMenu />
 6     </div>
 7 
 8     <main>
 9         <div class="top-row px-4">
10             <a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a>
11         </div>
12 
13         <div class="content px-4">
14             @Body
15         </div>
16     </main>
17 </div>
View Code

 

带有导航组件引用的 MainLayout.razor 组件

 1 @inherits LayoutComponentBase
 2 
 3 <PageTitle>BlazorServerSample</PageTitle>
 4 
 5 <div class="page">
 6     <div class="sidebar">
 7         <NavMenu />
 8     </div>
 9 
10     <main>
11         <div class="top-row px-4">
12             <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
13         </div>
14 
15         <article class="content px-4">
16             @Body
17         </article>
18     </main>
19 </div>
View Code

 

导航组件

 1 <div class="top-row ps-3 navbar navbar-dark">
 2     <div class="container-fluid">
 3         <a class="navbar-brand" href="">BlazorServerSample</a>
 4         <button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
 5             <span class="navbar-toggler-icon"></span>
 6         </button>
 7     </div>
 8 </div>
 9 
10 <div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
11     <nav class="flex-column">
12         <div class="nav-item px-3">
13             <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
14                 <span class="oi oi-home" aria-hidden="true"></span> Home
15             </NavLink>
16         </div>
17         <div class="nav-item px-3">
18             <NavLink class="nav-link" href="counter">
19                 <span class="oi oi-plus" aria-hidden="true"></span> Counter
20             </NavLink>
21         </div>
22         <div class="nav-item px-3">
23             <NavLink class="nav-link" href="fetchdata">
24                 <span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
25             </NavLink>
26         </div>
27     </nav>
28 </div>
29 
30 @code {
31     private bool collapseNavMenu = true;
32 
33     private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
34 
35     private void ToggleNavMenu()
36     {
37         collapseNavMenu = !collapseNavMenu;
38     }
39 }
View Code

 

布局组件可以嵌套多层使用,还可以通过在文件夹内创建 _Imports.razor 组件来描述(@layout 组件名称)当前文件夹中所有的组件的默认布局文件。

 

 

 

如果想要更改MainLayout.razor的位置(比如将其移动到我们自定义的专门用于放各种通用布局和模板文件的Shared文件夹中),需要更改项目根目录下的 _Imports.razor 文件,在其中加上对新建文件夹的应用。

 

 

 

? 总结思考

 

BlazorServerspancolorstyle.NET技术

有关Blazor Server 从头开始:02 创建组件的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  5. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  6. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  7. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  8. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  9. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  10. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

随机推荐