资讯详情

资讯详情

Ant Design Blazor 的 Anchor 组件自定义锚点高亮:GetCurrentAnchor 完整使用指南

前端UI组件设计系统【免费下载链接】ant-design-blazor基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力实现更大价值。项目地址https://gitcode.com/ant-design-blazor/ant-design-blazor点击查看免费下载Anchor锚点组件用于在单页内展示可跳转的锚点链接并支持快速在锚点之间跳转。默认情况下锚点组件会通过监听滚动事件根据当前视口位置自动高亮当前正在阅读的锚点但在某些业务场景下例如根据 URL 参数、路由状态或业务数据来决定高亮项自动判定往往不符合预期。本文将围绕官方 Demo CustomizeHighlight.razor 及其说明文档 customizeHighlight.md系统讲解如何通过GetCurrentAnchor参数接管锚点高亮逻辑并深入到 Anchor.razor.cs 源码揭示其底层实现原理。读完本文你将掌握自定义锚点高亮的完整写法、参数约束与源码级工作机制并能在实际页面中按自己的业务规则控制高亮状态。一、官方 Demo 中的自定义高亮用法组件文档中关于自定义锚点高亮的官方 Demo 十分精简核心思路是为Anchor设置GetCurrentAnchor回调由回调返回值决定哪个链接被高亮。完整的示例代码位于 CustomizeHighlight.razor其实现如下Anchor Affixfalse GetCurrentAnchorGetHref AnchorLink Href/en-US/components/anchor#components-anchor-demo-basic Title(Basic demo) / AnchorLink Href/en-US/components/anchor#components-anchor-demo-onClick Title(OnClick demo) / AnchorLink Href/en-US/components/anchor#components-anchor-demo-targetOffset Title(TargetOffset demo) / /Anchor code{ public string GetHref() { return /en-US/components/anchor#components-anchor-demo-OnClick; } }这段代码有三个值得注意的细节GetCurrentAnchorGetHrefGetHref()是一个无参、返回string的方法它返回的字符串是期望被高亮的链接地址。此处固定返回/en-US/components/anchor#components-anchor-demo-OnClick即页面加载后无论视口如何滚动OnClick demo这一项都会保持高亮。Affixfalse关闭固定模式。从 Anchor.razor 与 Anchor.razor.cs 可以看到ant-anchor-ink-ball跟随高亮项移动的小圆点只在Affix为true且存在激活链接时才显示。本示例关闭 Affix因此重点展示的是链接文字本身的高亮效果即ant-anchor-link-active类样式。返回值必须与某个AnchorLink.Href精确匹配GetHref()返回的字符串会与各AnchorLink的Href逐一比对只有完全相等的项才会被激活详见下文源码剖析。二、GetCurrentAnchor 参数规格在 index.zh-CN.md 的 Anchor API 表格中GetCurrentAnchor的定义如下成员说明类型默认值GetCurrentAnchor自定义高亮的锚点() string-对应到 Anchor.razor.cs 中的参数声明/// summary /// Customize the anchor highlight /// /summary [Parameter] public Funcstring GetCurrentAnchor { get; set; }参数约束总结类型为Funcstring即一个无参数、返回string的委托通常用普通方法或 Lambda 表达式绑定即可Blazor 支持GetCurrentAnchorGetHref或GetCurrentAnchor(() myHref)两种写法返回值为目标锚点链接的Href需要与该组件内某个AnchorLink的Href属性完全一致包括#之前的部分否则匹配失败无法触发高亮不设置时为null此时组件走默认的滚动监听高亮逻辑。三、源码剖析GetCurrentAnchor 的高亮实现原理要理解自定义高亮需要结合 Anchor.razor.cs 的两段关键逻辑。3.1 设置 GetCurrentAnchor 后不再监听滚动在OnAfterRenderAsync的首次渲染阶段源码做了分流Anchor.razor.csif (firstRender) { if (GetCurrentAnchor is null) { DomEventListener.AddSharedJsonElement(window, scroll, OnScroll); } }也就是说一旦设置了GetCurrentAnchor组件就不再向window注册滚动监听事件默认的按视口位置自动高亮机制被整体接管高亮状态完全由GetCurrentAnchor的返回值驱动。这一点是自定义高亮与默认高亮在实现上的根本区别。3.2 首次渲染时激活匹配链接紧接着的初始化代码Anchor.razor.cs完成具体的高亮动作if (GetCurrentAnchor ! null) { AnchorLink link _flatLinks.SingleOrDefault(l l.Href GetCurrentAnchor()); if (link ! null) { try { DomRect hrefDom await link.GetHrefDom(true); if (hrefDom ! null) { _activatedByClick false; await ActivateAsync(link, true); // the offset does not matter, since the dictionarys value will not change any more in case user set up GetCurrentAnchor _linkTops[link.Href] hrefDom.Top; StateHasChanged(); } } catch (Exception ex) { } } }这段代码揭示了完整的匹配链条_flatLinks是通过 IAnchor.FlatChildren() 收集到的所有AnchorLink扁平列表AnchorLink 支持嵌套扁平化后统一处理使用SingleOrDefault按l.Href GetCurrentAnchor()精确匹配目标链接匹配不到则不会激活任何链接匹配成功后调用link.GetHrefDom(true)见 AnchorLink.razor.cs通过GetBoundingClientRect强制获取目标锚点 DOM 的位置若目标 DOM 存在则执行ActivateAsync(link, true)注释明确写道the offset does not matter, since the dictionarys value will not change any more即设置GetCurrentAnchor后滚动偏移量计算不再有意义_linkTops中记录的位置仅作占位。3.3 高亮的最终落点AnchorLink 的 Active 状态ActivateAsyncAnchor.razor.cs最终调用的是AnchorLink.Activate(bool)internal void Activate(bool active) { Active active; }而Active状态在 AnchorLink.razor.cs 的OnInitialized中通过ClassMapper映射为样式类ClassMapper.Clear() .Add(${PrefixCls}) // ant-anchor-link .If(${PrefixCls}-active, () Active); // ant-anchor-link-active _titleClass.Clear() .Add(${PrefixCls}-title) .If(${PrefixCls}-title-active, () Active); // ant-anchor-link-title-active同时在 AnchorLink.razor 中链接标题的a标签使用_titleClass.Class渲染。因此自定义高亮的最终效果是匹配到的链接外层div获得ant-anchor-link-active、标题获得ant-anchor-link-title-active类对应 CSS 的高亮样式随之生效。另外ActivateAsync在激活链接且链接发生变化时还会触发OnChange回调Anchor.razor.cs因此自定义高亮模式下OnChange依然可用可用于感知当前高亮项切换这一事件。四、自定义高亮与默认滚动高亮的差异对比维度默认高亮GetCurrentAnchor 自定义高亮触发方式监听window的scroll事件动态计算各锚点位置与偏移量初始化时一次性匹配返回的 Href 命中即高亮是否注册滚动监听是Anchor.razor.cs否Anchor.razor.cs高亮判定依据_linkTops中hrefDom.Top offset 0的最后一个链接GetCurrentAnchor()的返回值与AnchorLink.Href精确相等高亮结果是否随滚动变化会持续变化不会返回值不变则高亮不变小圆点ink-ballAffixtrue时随激活链接移动若Affixtrue会定位到被激活链接处但滚动不再触发重算这里需要特别说明默认滚动高亮逻辑位于OnScrollAnchor.razor.cs它遍历所有_flatLinks的GetHrefDom()结果结合OffsetBottom/OffsetTop计算当前视口内最后一个越过顶部的锚点并激活之。而自定义高亮模式完全绕开了这条路径因此适合由外部状态驱动的场景例如高亮项由 URL 查询参数、路由状态决定高亮项跟随当前业务数据如当前选中的列表项联动页面结构特殊如锚点目标初始不可见、懒加载无法依赖滚动位置推断。五、实战建议与其他参数的组合使用在 index.zh-CN.md 的 API 中Anchor 组件还提供以下与高亮体验相关的参数可与GetCurrentAnchor组合使用Affix默认true是否固定模式。自定义高亮时若保留true小圆点会定位到被激活的链接处Demo 中刻意设为false仅展示文字高亮。OffsetTop/OffsetBottom默认高亮计算中用于距离窗口顶部/底部达到指定偏移量后触发自定义高亮模式下因不依赖滚动计算影响较小。OnChange(currentActiveLink: string) void当高亮链接改变时回调自定义模式下同样有效可用于联动更新外部状态。TargetOffset锚点目标滚动后的停靠偏移量默认与OffsetTop相同与滚动跳转行为相关详见 targetOffset.md。GetContainer默认() window指定滚动容器若锚点位于自定义滚动容器内需要显式配置。Key当Key改变时组件会清空并重建链接列表Anchor.razor.cs适合链接集合动态变化后强制刷新高亮匹配的场景。一个典型的由外部状态驱动高亮的扩展写法在官方 Demo 基础上的合理演化非仓库既有代码Anchor Affixfalse GetCurrentAnchorGetHref AnchorLink Href/page#section-a Title(A 区块) / AnchorLink Href/page#section-b Title(B 区块) / /Anchor code { [Parameter] public string ActiveSection { get; set; } // 由路由或业务逻辑注入 private string GetHref() $/page#{ActiveSection}; }只要GetHref()返回的字符串与某个AnchorLink.Href完全一致该链接即会被高亮。六、注意事项与常见问题返回值必须精确匹配 Href匹配使用SingleOrDefault(l l.Href GetCurrentAnchor())Anchor.razor.cs字符串需完全相等注意大小写与#分隔符的位置。匹配不到时不会高亮任何项SingleOrDefault返回null时不会执行激活逻辑页面将没有任何链接处于高亮状态。目标 DOM 不存在时同样不会激活GetHrefDom(true)在目标锚点元素尚未渲染时可能返回null异常也会被捕获忽略因此自定义高亮最好在锚点目标已渲染完成后生效必要时可配合Key变化或组件重渲染重新触发匹配。高亮是一次性判定初始化时按返回值激活后只要返回值与链接列表不变高亮状态不会随滚动变化。如果需要动态改变高亮项应让GetCurrentAnchor的返回值随状态变化如结合Key强制刷新链接列表或重新触发组件渲染。Affix 模式下的小圆点若保留Affixtrue激活链接存在时小圆点会定位到该链接处Anchor.razor.cs但其位置基于激活时记录的状态不会像默认模式那样随滚动实时更新。七、小结Ant Design Blazor 的 Anchor 组件通过GetCurrentAnchor提供了一条自定义高亮的官方扩展路径设置该参数后组件关闭默认的滚动监听机制改为在初始化时按回调返回值精确匹配并激活对应AnchorLink最终通过ant-anchor-link-active等样式类呈现高亮效果。这一机制非常适合由路由、业务数据等外部状态驱动高亮的场景。相关源码与文档均可在仓库中直接查阅Anchor.razor.cs、AnchorLink.razor.cs、index.zh-CN.md 以及示例 CustomizeHighlight.razor。赞分享前端UI组件设计系统【免费下载链接】ant-design-blazor基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力实现更大价值。项目地址https://gitcode.com/ant-design-blazor/ant-design-blazor点击查看免费下载相关推荐NocoBase 移动端插件 plugin-mobile-client 详解/mobile 路由的实现原理与废弃迁移说明NocoBase 移动端插件 plugin mobile client 详解/mobile 路由的实现原理与废弃迁移说明 NocoBase 的 nocoba前端UI组件设计系统open-pencil SDK 的 GradientEditorRoot无头渐变编辑器根原语的状态契约与实现剖析open pencil SDK 的 GradientEditorRoot无头渐变编辑器根原语的状态契约与实现剖析 GradientEditorRoot 是 o前端UI组件设计系统Semi Design 锚点组件(Anchor)使用指南Semi Design 锚点组件 Anchor 使用指南 什么是锚点组件 锚点组件 Anchor 是一种常见的页面导航辅助工具它能够快速定位到页面特定位置。在前端UI组件设计系统上一篇智慧树自动刷课神器Autovisor完整使用指南下一篇Trellis Forum 频道实战指南在 EcoPaste 多智能体工作流中用主题式线程沉淀协作历史创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →