Blazor University (25)路由 —— 通过 HTML 导航

原文链接:https://blazor-university.com/routing/navigating-our-app-via-html/

通过 HTML 导航

源代码[1]

链接到 Blazor 组件中的路由的最简单方法是使用 HTML 超链接。

<a href="/Counter">This works just fine</a>

Blazor 组件中的超链接会被自动拦截。当用户单击超链接时,浏览器不会向服务器发送请求,而是 Blazor 将更新浏览器中的 URL 并呈现与新地址关联的任何页面。

使用 NavLink 组件

Blazor 还包括一个用于呈现超链接的组件,并额外支持在地址与 URL 匹配时更改 HTML 元素的 CSS 类。

如果我们查看默认 Blazor 应用程序中的 /Shared/NavMenu.razor 组件,我们将标记如下所示:

<NavLink class="nav-link" href="counter"><span class="oi oi-home" aria-hidden="true"></span> Counter
</NavLink>

NavLink 组件使用 HTML 超链接装饰其子内容。所有属性,如 classhref 等,都通过属性展开[2]直接呈现给 <a> 元素。NavLink 组件有两个参数可以提供额外的行为。

ActiveClass 参数指定当浏览器的 URL 与 href 属性的 URL 匹配时,将哪个 CSS 类应用于呈现的 <a> 元素。如果未指定,Blazor 将应用名为“active”的 CSS 类。

2d20990635d6fc61eb125d6ff6487a36.gif

URL 匹配

Match 参数标识浏览器的 URL 应如何与 href 进行比较,以确定是否应将 ActiveClass 添加到元素的类属性中。

在新的 Blazor 应用中编辑 /Pages/Counter.razor 文件,以便可以从三个 URL 访问它。

@page "/counter"
@page "/counter/1"
@page "/counter/2"

然后编辑 /Shared/NavMenu.razor 组件,使 Counter 菜单项有两个子菜单链接。

<li class="nav-item px-3"><NavLink class="nav-link" href="counter" Match=@NavLinkMatch.All><span class="oi oi-plus" aria-hidden="true"></span>Counter</NavLink><ul class="nav flex-column"><li class="nav-item px-3"><NavLink class="nav-link" href="counter/1" Match=@NavLinkMatch.All><span class="oi oi-plus" aria-hidden="true"></span>Counter/1</NavLink></li><li class="nav-item px-3"><NavLink class="nav-link" href="counter/2" Match=@NavLinkMatch.All><span class="oi oi-plus" aria-hidden="true"></span>Counter/2</NavLink></li></ul>
</li>

同时编辑 /wwwroot/site.css 并添加以下内容,以便我们轻松查看哪些 NavLink 元素被认为是“活动的”。

.nav-item a.active::after
{content: " *";margin-left: 1em;
}

三个 NavLink 组件导航到 /counter/counter/1/counter/2,如果我们运行应用程序并单击各种链接,我们将看到以下内容。

a129d761ce48cf641486567d0ff0810d.gif

NavLinkMatch

NavLink 组件的 Match 参数接受 NavLinkMatch 类型的值。这告诉 NavLink 组件您希望浏览器的 URL 与它呈现的 <a> 元素的 href 属性如何比较以确定它们是否相同。

在前面的示例中,我们为每个 NavLink 组件的 Match 参数指定了 NavLinkMatch.All。这意味着我们希望 Blazor 仅在其 href 与浏览器的 URL 完全匹配时才认为每个 NavLink 都是活动的。如果我们现在更改链接到 /counter 的 NavLink,使其匹配参数为 NavLinkMatch.Prefix,我们将看到只要 URL 以 /counter 开头,它就会被视为匹配,因此它也会匹配 /counter/1/counter/2.

为了说明区别,请在 /Shared/NavMenu.razor 的代码部分中声明一个字段

NavLinkMatch MatchMode = NavLinkMatch.All;

找到 <div class="@NavMenuCssClass"... 元素,并在 <ul> 元素之前添加以下标记以将 <select> 绑定到新字段。

<select @bind=MatchMode class="form-control"><option value=@NavLinkMatch.All>All</option><option value=@NavLinkMatch.Prefix>Prefix</option>
</select>

最后,找到其 href 链接到 /counter 的 NavLink,并将其 Match 参数更改为@MatchMode。您的标记现在应该看起来像这样。

<div class="top-row pl-4 navbar navbar-dark"><a class="navbar-brand" href="">NavigationViaHtml</a><button class="navbar-toggler" @onclick=ToggleNavMenu><span class="navbar-toggler-icon"></span></button>
</div><div class="@NavMenuCssClass" @onclick=ToggleNavMenu><select @bind=MatchMode class="form-control"><option value=@NavLinkMatch.All>All</option><option value=@NavLinkMatch.Prefix>Prefix</option></select><ul class="nav flex-column"><li class="nav-item px-3"><NavLink class="nav-link" href="" Match=@NavLinkMatch.All><span class="oi oi-home" aria-hidden="true"></span> Home</NavLink></li><li class="nav-item px-3"><NavLink class="nav-link" href="counter" Match=@MatchMode><span class="oi oi-plus" aria-hidden="true"></span>Counter</NavLink><ul class="nav flex-column"><li class="nav-item px-3"><NavLink class="nav-link" href="counter/1" Match=@NavLinkMatch.All><span class="oi oi-plus" aria-hidden="true"></span>Counter/1</NavLink></li><li class="nav-item px-3"><NavLink class="nav-link" href="counter/2" Match=@NavLinkMatch.All><span class="oi oi-plus" aria-hidden="true"></span>Counter/2</NavLink></li></ul></li></ul>
</div>@code {NavLinkMatch MatchMode = NavLinkMatch.All;bool collapseNavMenu = true;string NavMenuCssClass => collapseNavMenu ? "collapse" : null;void ToggleNavMenu(){collapseNavMenu = !collapseNavMenu;}
}

选择 Counter/1Counter/2 链接后,切换 <select> 的值。

1b5e5f2e07ccfcc1c7b2cfbd045c9dec.gif

尽管浏览器 URL 保持不变,但我们可以看到第一个 Counter NavLink 根据其 Match 参数的设置在活动/非活动之间切换。

参考资料

[1]

源代码: https://github.com/mrpmorris/blazor-university/tree/master/src/Routing/NavigatingViaHtml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenReports中文支持方案

此文章在《OpenReports中文支持完全解决方案.doc》的基础上做优化&#xff0c;并贴出代码。已测试通过。 一、主要解决的问题 1 页面显示支持中文 2 与服务器或数据库的交互支持中文 3 查询结果支持中文 4 导出文件名及内容支持中文 二、解决方案及方法 1 …

七、功能性组件与事件逻辑(IVX 快速开发教程)

七、功能性组件与事件逻辑 由于 iVX 极度易用的特性&#xff0c;在 iVX 中开发微信小程序、WebApp、小游戏应用的开发流程大致相同。介绍完基础可视化组件后通过后台的服务、数据库与事件结合即可完成一个应用的开发&#xff1b;此篇将会介绍 iVX 功能性组件与事件&#xff0c…

WPF 基础控件之 ToggleButton 样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButtonToggleButton 实现下面的效果1&#xff09;ToggleButton来实现动画&#xff1b;Border嵌套 Ellipse并设置T…

反射调用 java bean的set和get方法

v一、使用java.beans.PropertyDescriptor import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class PropertyUtil {private static final String SET_PREFIX "…

八、后台与数据库(IVX 快速开发教程)

八、后台与数据库 在 iVX 中 数据库 作为数据存储仓库&#xff0c;通过 数据库 可以永久性存储存储数据&#xff0c;而 后台服务 起到数据传输作用&#xff0c;将 数据库 的数据传输到前台页面之中&#xff0c;页面再使用这些数据。 文章目录八、后台与数据库8.1.1 数据库添加…

Android Studio开发环境搭建准备

Android Studio 是一个Android开发环境&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 Android Studio开发环境搭建前&#xff0c;我们需要进行安装前的准备工作&#xff0c;本篇以在Windows 7平台…

九、二手信息站点后台完成 (IVX 快速开发教程)

九、二手信息站点后台完成 了解完后台实现后&#xff0c;我们开始为该二手商品站点完成完成后台制作。 文章目录九、二手信息站点后台完成9.1.1 完成二手信息站点注册功能9.1.2 完成二手信息站点登录功能9.1.3 完成商品发布功能9.1.4 首页信息获取9.1.5 详情页内容9.1.1 完成二…

爬虫是什么?起什么作用?

【爬虫】 如果把互联网比作一张大的蜘蛛网&#xff0c;数据便是放于蜘蛛网的各个节点&#xff0c;而爬虫就是一只小蜘蛛&#xff0c;沿着网络抓取自己得猎物&#xff08;数据&#xff09;。这种解释可能更容易理解&#xff0c;官网的&#xff0c;就是下面这个。 爬虫是一种自动…

oneproxy检测主从复制同步延迟

Q:为什么要实现读写分离延迟检测&#xff1f; A:就好比你在ATM机存钱&#xff0c;你老婆收到短信后乐呵呵的拿网银APP查看&#xff0c;结果钱没过来。其实钱已经到账了&#xff0c;只是查询的ATM机节点钱还没过来。所以我们dba要监控数据&#xff0c;一旦发现钱没有复制到另一A…

.NET 分表分库动态化处理

介绍本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案&#xff0c;具有零依赖、零学习成本、零业务代码入侵我不是efcore怎么办这边肯定有小伙伴要问有没有不是efcore的,我这边很确信的和你讲有并且适应所有的ADO.NET包括sqlhelperShardingCo…

addEventListener 的事件函数的传递【转载】

addEventListener 参数如下&#xff1a; addEventListener(type, listener[, useCapture]); type&#xff0c;事件名称listener&#xff0c;事件处理器useCapture&#xff0c;是否捕获一直把 listener 记成是响应函数&#xff0c;function 类型。相信很多人也是这么理解的。多数…

Android之elevation实现阴影效果

1 需求 需要控件实现阴影效果 2 实现 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"andr…

十、小程序实战 (IVX 快速开发教程)

十、小程序实战 使用小程序完成一个二手信息站点与 WebApp 实现流程类型&#xff0c;只是部分内容使用了微信小程序特有的组件&#xff0c;例如微信登录与 WebApp 略有差别&#xff0c;其它逻辑实现较为类似。我们先制作页面&#xff0c;之后再实现功能。 由于之前已经完成了…

源代码下载 第六章 注解式控制器详解

2019独角兽企业重金招聘Python工程师标准>>> 源代码请到附件中下载。 其他下载&#xff1a; 跟着开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 Controller接口控制器详解 源代码下载 源码下载——第四章 Controller接口控制器详解——跟着开…

WPF|快速添加新手引导功能(支持MVVM)

阅读导航前言案例一案例二案例三&#xff08;本文介绍的方式&#xff09;如何使用&#xff1f;控件如何开发的&#xff1f;总结1. 前言案例一站长分享过 眾尋 大佬的一篇 WPF 简易新手引导 一文&#xff0c;新手引导的效果挺不错的&#xff0c;如下图&#xff1a;该文给出的代码…

三、界面介绍(IVX快速手册)

三、集成开发环境界面介绍 通过本节你将了解 iVX 在线集成开发环境 界面&#xff0c;快速建立对 在线集成开发环境 的认识。 文章目录三、集成开发环境界面介绍3.1 界面区域3.2 舞台3.3 组件工具栏3.4 对象树/素材面板3.5 属性面板3.6 菜单面板3.7 逻辑工具面板3.8 辅助工具3.…

Android studio之提示Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46

1、错误提示如下 Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46 Show in Project Structure dialog Affected Modules: app2、解决办法 在project的build.gradle里面加入 maven { url https://jitpack.io }

【VB测绘程序设计】第二章 VB测绘程序基础

第一节 数据类型 VB中提供了以下11中基本的数据类型: 一、数值型 二、字符串 三、日期型 1.界面设计 2. 代码 <