ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ant Design Breadcrumb 路由参数(params)详解:让面包屑正确渲染动态路由

Ant Design Breadcrumb 路由参数(params)详解:让面包屑正确渲染动态路由 Ant Design Breadcrumb 路由参数params详解让面包屑正确渲染动态路由【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design本篇技术指南以 Ant Design当前仓库 components/breadcrumbBreadcrumb 组件的params路由参数能力为核心讲解如何在面包屑中展示/users/1这类携带动态参数的路径并深入源码剖析params的替换机制、href与path的取舍、与itemRender的协作方式。读完本文你将掌握用items params正确渲染带参路由面包屑的完整方案并理解其底层实现原理。引言什么是带参路由的面包屑在真实业务中路由往往带有动态参数例如用户详情页的地址是/users/1、/users/1/orders/42其中1和42是运行时才知道的具体值。如果面包屑直接把路由模板中的:id显示出来用户看到的是毫无意义的Users / :id只有把:id替换成真实值面包屑才能准确表达“你当前在哪里”。Ant Design 从 5.3.0 起推荐使用items数据驱动写法见 components/breadcrumb/index.en-US.md其中params属性正是为解决“路由参数替换”而设计。仓库中对应演示文档 components/breadcrumb/demo/withParams.md 及其配套示例 components/breadcrumb/demo/withParams.tsx 提供了最直接的最小可运行示例。最小示例带路由参数的面包屑关联文档 withParams 的中文描述只有一句话“带有路由参数的”但其配套的 TSX 示例揭示了完整用法核心代码如下import React from react; import { Breadcrumb } from antd; const App: React.FC () ( Breadcrumb items{[ { title: Users, }, { title: :id, href: , }, ]} params{{ id: 1 }} / ); export default App;运行效果面包屑渲染为Users / 1——第一项是静态标题Users第二项的标题:id被params{{ id: 1 }}中的id: 1替换为1。关键点拆解items是面包屑的路由栈信息每个对象描述一级面包屑需要动态替换的标题使用:参数名占位符本例为:idparams接收一个普通对象{ id: 1 }对象中的键会去匹配并替换标题里的:键名占位符href: 表示该项是可点击链接源码renderItem中只要href ! undefined就渲染为a见 components/breadcrumb/useItemRender.tsx。如果去掉href: 该项同样会被渲染但会以span呈现而非超链接。这是href与path两种链接声明方式的核心区别之一。参数替换的源码原理params之所以能替换标题中的:id并非魔法其底层逻辑写在两处源码中。1. 标题占位符替换getBreadcrumbName在 components/breadcrumb/useItemRender.tsx 中默认渲染逻辑会调用getBreadcrumbNamefunction getBreadcrumbName(route: InternalRouteType, params: any) { if (route.title undefined || route.title null) { return null; } const paramsKeys Object.keys(params).join(|); return typeof route.title object ? route.title : String(route.title).replace( new RegExp(:(${paramsKeys}), g), (replacement, key) params[key] || replacement, ); }其行为可以概括为title 为空返回null该项渲染为空renderItem中children null || children undefined时返回null见 components/breadcrumb/useItemRender.tsxtitle 是 React 节点对象原样返回不做字符串替换——也就是说title传入a、图标等 JSX 时不会被替换只有字符串形式的:xxx才会被替换title 是字符串用new RegExp(:( paramsKeys.join(|) ), g)构造全局正则把:id、:name等占位符逐一替换为params中对应键的值若params中没有该键则保留原占位符。注意正则带了g标志且键名通过|拼接因此同一标题中多个不同参数如:id/:name可以一次性全部替换。2. 路径拼接与参数替换getPath在 components/breadcrumb/Breadcrumb.tsx 中getPath负责处理path上的参数const getPath T extends AnyObject AnyObject(params: T, path?: string) { if (path undefined) { return path; } let mergedPath (path || ).replace(/^\//, ); Object.keys(params).forEach((key) { mergedPath mergedPath.replace(:${key}, params[key]!); }); return mergedPath; };它先把path开头的/去掉再遍历params的键把path中的:键名替换成真实值。随后在渲染主流程中components/breadcrumb/Breadcrumb.tsxconst mergedPath getPath(params, path); if (mergedPath ! undefined) { paths.push(mergedPath); // 累积所有已替换参数的路径片段 } // ... if (paths.length mergedPath ! undefined) { href #/${paths.join(/)}; // 自动生成 hash 链接 }也就是说当你给某一级配置了path时组件会基于该path替换参数并累积生成href。例如path: :id配合params: { id: 1 }会得到#/1若前一级还有path: users则最终href为#/users/1。3. 两条替换路径的分工替换对象函数位置作用title字符串中的:参数名getBreadcrumbNameuseItemRender.tsx控制显示文案path字符串中的:参数名getPathBreadcrumb.tsx控制链接地址两者独立工作即使只写title: :id而不写path标题依然会被替换显示反之path: :id也会被替换进链接。实际项目中通常二者搭配使用。href与path的取舍params 生效的前提从 API 文档components/breadcrumb/index.zh-CN.md可知items中每一项支持href与path两者互斥属性说明与 params 的关系href链接的目的地直接指定目标地址自身不会被params替换但会原样进入a hrefpath拼接路径每一层都会拼接前一个path信息会被params替换并参与paths累积最终拼出#/xxx/yyy用href时标题中的:id仍会被params替换走getBreadcrumbName但链接地址就是href本身例如演示示例中href: 只是为了把该项渲染成可点击的a用path时组件自动为你生成层级化 hash 链接如#/users/1此时不必再手动写href。关于互斥源码 components/breadcrumb/Breadcrumb.tsx 中当paths.length mergedPath ! undefined时会覆盖item.href这也印证了“不能同时使用”的约束——后写的path生成逻辑优先。与 react-router 结合itemRender 接管链接默认生成的是#/开头的 hash 链接源码 components/breadcrumb/Breadcrumb.tsx 的href #/ paths.join(/)。如果你使用browserHistoryHTML5 History 模式可以像 API 文档中“和 browserHistory 配合”一节那样用itemRender自定义链接import { Link } from react-router; const items [ { path: /index, title: home }, { path: /first, title: first, children: [ { path: /general, title: General }, { path: /layout, title: Layout }, { path: /navigation, title: Navigation }, ], }, { path: /second, title: second }, ]; function itemRender(currentRoute, params, items, paths) { const isLast currentRoute?.path items[items.length - 1]?.path; return isLast ? ( span{currentRoute.title}/span ) : ( Link to{/${paths.join(/)}}{currentRoute.title}/Link ); } return Breadcrumb itemRender{itemRender} items{items} /;itemRender的函数签名为(route, params, routes, paths) ReactNode见 components/breadcrumb/Breadcrumb.tsx其中第二个参数就是你在Breadcrumb params{...}中传入的对象——它既被用于默认的占位符替换也会原样透传给自定义itemRender供你在渲染链接时读取。测试验证params 的实际行为仓库测试对params的两种写法均有覆盖可作为事实依据itemsparams写法测试 components/breadcrumb/tests/Breadcrumb.test.tsx 中Breadcrumb params type test直接向items传入含:参数名的标题并配合params断言渲染结果routesparams写法测试 components/breadcrumb/tests/router.test.tsx 渲染routes{[...]} params{{ id: 1 }}并做快照断言其中路由里既有breadcrumbName: Application:id标题含占位符又有path: :id路径含占位符验证了两条替换链路同时生效。如果你还在使用旧版routes属性params同样有效——useItems.ts 会把routes转换为items结构breadcrumbName映射为titlechildren映射为menu.items随后走完全相同的参数替换流程。但从 5.3.0 起官方推荐统一使用items。实战建议与边界说明推荐写法 5.3.0Breadcrumb items{[ { title: 首页, path: home }, { title: 用户, path: users }, { title: :id, path: :id }, ]} params{{ id: currentUserId }} /标题与路径都使用:id占位符params一次替换两处生成的链接自动为#/home/users/1hash 模式若需 History 模式用itemRender配合react-router的Link重写链接即可。边界与限制title为 JSX 时不替换源码getBreadcrumbName中typeof route.title object时原样返回因此请让占位符处于字符串中params缺少对应键时保留占位符params[key] || replacement的逻辑意味着替换失败时标题会保留原始的:id建议保证参数键与占位符严格一致href与path互斥二者不能同时使用否则path生成的累积链接会覆盖hrefgetPath会去掉路径开头的/源码replace(/^\//, )之后才做参数替换与累积用于避免拼接出双斜杠。延伸阅读组件总览与完整 APIcomponents/breadcrumb/index.zh-CN.md、components/breadcrumb/index.en-US.md最小示例本文主线components/breadcrumb/demo/withParams.tsx其余演示基本用法 components/breadcrumb/demo/basic.tsx、带图标 components/breadcrumb/demo/withIcon.tsx、分隔符 components/breadcrumb/demo/separator.tsx、下拉菜单 components/breadcrumb/demo/overlay.tsx核心实现components/breadcrumb/Breadcrumb.tsx、components/breadcrumb/useItemRender.tsx、components/breadcrumb/useItems.ts测试佐证components/breadcrumb/tests/Breadcrumb.test.tsx、components/breadcrumb/tests/router.test.tsx【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表