ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ng-zorro-antd Cascader 自定义已选项渲染:用 `nzLabelRender` 打造带链接、图标的级联选择结果

ng-zorro-antd Cascader 自定义已选项渲染:用 `nzLabelRender` 打造带链接、图标的级联选择结果 UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载导读nz-cascader是 ng-zorro-antd 提供的级联选择组件见 cascader 组件文档适合省市区、公司层级、事物分类等多级数据的选取。但在实际业务中默认的已选项展示「label / label / label」往往不够用——你可能希望在选中的最后一级后面追加一个邮编链接、图标、徽标或其他交互元素。本文以仓库中的 自定义已选项 Demo 为主线系统讲解nzLabelRender模板的用法、模板上下文labels/selectedOptions的含义、底层渲染管道的实现并给出可直接复制的完整代码帮助你掌握级联选择结果的自定义渲染能力。应用场景为什么需要自定义已选项渲染级联选择器的默认展示是把各级选中项的label用斜杠拼接。仓库源码 cascader-display-render.pipe.ts 中的默认实现为export const defaultDisplayRender (labels: string[]): string labels.join( / );也就是说选中「浙江 / 杭州 / 西湖」时输入框内默认显示Zhejiang / Hangzhou / West Lake。这种纯文本展示无法满足以下需求在最后一项后面追加外部链接如邮政编号code对应的查询链接把某些层级渲染成图标、徽章或自定义字体样式对中间层级使用与末级不同的视觉表现。为此ng-zorro-antd 提供了[nzLabelRender]输入属性允许用任意TemplateRef完全接管已选项的展示内容这正是 custom-render demo 要解决的问题给最后一项加上邮编链接。核心 APInzLabelRender根据 cascader 组件 API 文档nzLabelRender的定义为参数说明类型默认值[nzLabelRender]选择后展示的渲染模板TemplateRef{ labels: string[], selectedOptions: NzCascaderOption[] }-labels: string[]当前选中项从根到叶的各级label数组与默认展示所用的labels.join( / )数据同源selectedOptions: NzCascaderOption[]与labels一一对应的原始选项对象数组通过它可以访问每个层级选项上的任意自定义字段。这两者的对应关系可以在源码 cascader-display-render.pipe.ts 的NzDisplayRenderContextPipe中看到组件内部通过cascaderTreeService.getAncestorNodeList(node)拿到从根到叶的节点链再映射为selectedOptions和labels后组装成渲染上下文transform(node: NzTreeNode): NzDisplayRenderContext { const ancestors this.cascaderTreeService.getAncestorNodeList(node); const selectedOptions this.cascaderTreeService.toOptions(ancestors); const labels selectedOptions.map(o this.cascaderService.getOptionLabel(o)); return { labels, selectedOptions }; }而在组件模板中cascader.component.ts当检测到nzLabelRender存在时isLabelRenderTemplate返回true见 cascader.component.ts会把选中的节点连同该模板一起交给nz-select-item渲染nz-select-item [label]selectedNodes[0] | nzDisplayRender [contentTemplateOutlet]isLabelRenderTemplate ? nzLabelRender : null [contentTemplateOutletContext]selectedNodes[0] | nzDisplayRenderContext /即模板上下文labels/selectedOptions由nzDisplayRenderContext管道实时生成你无需关心内部计算直接在模板中声明let-labelslabels、let-selectedOptionsselectedOptions即可消费。完整示例给末级选项追加邮编链接下面直接给出仓库 democustom-render.ts的完整可运行版本。它声明了一个带有自定义字段code的省市区数据源并在选中后用nzLabelRender模板渲染非末级显示「label /」末级显示「label (邮编链接)」。import { Component } from angular/core; import { FormsModule } from angular/forms; import { NzCascaderModule, NzCascaderOption } from ng-zorro-antd/cascader; const options: NzCascaderOption[] [ { value: zhejiang, label: Zhejiang, children: [ { value: hangzhou, label: Hangzhou, children: [ { value: xihu, label: West Lake, code: 752100, isLeaf: true } ] }, { value: ningbo, label: Ningbo, code: 315000, isLeaf: true } ] }, { value: jiangsu, label: Jiangsu, children: [ { value: nanjing, label: Nanjing, children: [ { value: zhonghuamen, label: Zhong Hua Men, code: 453400, isLeaf: true } ] } ] } ]; Component({ selector: nz-demo-cascader-custom-render, imports: [FormsModule, NzCascaderModule], template: nz-cascader stylewidth: 100%; [nzLabelRender]renderTpl [nzOptions]nzOptions [(ngModel)]values (ngModelChange)onChanges($event) / ng-template #renderTpl let-labelslabels let-selectedOptionsselectedOptions for (label of labels; track label) { if (!$last) { span{{ label }} //span } else { span {{ label }} ( a hrefjavascript:; (click)handleAreaClick($event, label, selectedOptions[$index]) {{ selectedOptions[$index].code }} /a ) /span } } /ng-template }) export class NzDemoCascaderCustomRenderComponent { readonly nzOptions: NzCascaderOption[] options; values: string[] | null null; onChanges(values: string[]): void { console.log(values, this.values); } handleAreaClick(e: Event, label: string, option: NzCascaderOption): void { e.preventDefault(); e.stopPropagation(); console.log(clicked , label, , option); } }关键写法拆解模板上下文声明ng-template #renderTpl let-labelslabels let-selectedOptionsselectedOptions把管道生成的labels与selectedOptions解构到模板局部变量中。利用$last区分层级for循环遍历labelsif (!$last)对非末级渲染「label /」分隔符else分支只处理最后一项从而把链接/交互元素精确放在选中路径的末尾。通过$index取原始选项selectedOptions[$index]与当前label对应进而访问selectedOptions[$index].code。这里code是NzCascaderOption接口允许的自定义字段——该接口在 typings.ts 中除了value、label、title、disabled、loading、isLeaf、children、disableCheckbox之外还带有[key: string]: NzSafeAny索引签名因此可以放心附加任意业务字段。阻止事件冒泡handleAreaClick中先e.preventDefault()再e.stopPropagation()。由于链接位于nz-select-item内部必须阻断冒泡避免点击链接时意外触发组件的选择/浮层行为同时preventDefault防止默认跳转。运行与验证组件依赖需要引入FormsModule提供ngModel双向绑定与NzCascaderModule可从ng-zorro-antd/cascader导入见 cascader 模块导出。交互验证选择「Zhejiang / Hangzhou / West Lake」后输入框内应显示West Lake (752100)其中邮编为可点击链接点击后控制台输出clicked West Lake及完整选项对象。底层原理从选中节点到渲染上下文的链路理解了「数据从哪来」才能更好地设计自己的模板。整个流程可以归纳为用户完成选择后组件内部维护selectedNodes: NzTreeNode[]见 cascader.component.ts数组中首项即当前选中路径的叶子节点模板中的[label]selectedNodes[0] | nzDisplayRender调用NzDisplayRenderPipe它通过cascaderTreeService.getAncestorNodeList(node)回溯祖先节点并拼接出默认文本用于无自定义模板时的兜底展示[contentTemplateOutletContext]selectedNodes[0] | nzDisplayRenderContext调用NzDisplayRenderContextPipe把祖先链分别转成labels: string[]与selectedOptions: NzCascaderOption[]注入nzLabelRender模板只有当showLabelRender成立无搜索输入且存在选中项见 cascader.component.ts时自定义模板才会真正被渲染到选择框内。值得注意labels与selectedOptions始终是同长度、同下标的两个数组selectedOptions[i]必然对应labels[i]所来自的那个层级选项因此$index可以安全地在两个数组间穿梭取数。与相关渲染 API 的边界nzLabelRendervsnzOptionRendervsnzPopupRender在级联选择器中有三个「渲染」入口容易混淆这里结合 API 文档 厘清职责输入属性作用位置上下文类型nzLabelRender选择框内的已选项展示本文主题{ labels: string[], selectedOptions: NzCascaderOption[] }nzOptionRender下拉面板中每个选项的展示{ $implicit: NzCascaderOption, index: number }nzPopupRender整个下拉浮层的包裹内容{ $implicit: TemplateRefvoid }若你想改变下拉列表里每一条目的文案或加序号应使用nzOptionRender可参考 custom-template demo它用{{ index 1 }}. {{ option.label }}给选项加序号若你想在浮层顶部/底部追加说明文字或操作按钮则用nzPopupRender只有「选中之后输入框里显示什么」属于nzLabelRender的管辖范围。多选模式与搜索模式下的行为说明多选nzMultiple启用多选后每个已选项会以标签tag形式展示组件模板同样会把nzLabelRender作为每个标签的contentTemplateOutlet使用见 cascader.component.ts因此本文的模板逻辑在多选场景下同样生效但要注意$last的含义会变成「当前标签路径的最后一级」与单选时一致。搜索nzShowSearch当输入框处于搜索状态存在inputValue时showLabelRender为falsecascader.component.ts已选项模板会被隐藏、优先展示搜索输入这是组件的有意设计避免自定义渲染干扰搜索体验。小结通过nzLabelRender级联选择器的已选项展示从「固定斜杠拼接文本」升级为完全可控的模板渲染labels提供层级路径文本、selectedOptions提供携带任意自定义字段的原始选项对象配合$last/$index可以精准地把链接、徽标或交互元素锚定在末级选项上。本文示例邮编链接可直接迁移到快递单号查询、城市编码展示、SKU 属性标注等真实业务中若要进一步自定义下拉面板内的选项外观可结合nzOptionRender与nzPopupRender组合使用。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐ng-zorro-antd Cascader 指定选择用 nzChangeOn 函数精确控制级联选项的可选性ng zorro antd Cascader 指定选择用 nzChangeOn 函数精确控制级联选项的可选性 导读 级联选择器Cascader在默认行为下UI组件前端Ant Design Cascader 自定义已选项渲染用 displayRender 为选中值添加链接与富内容Ant Design Cascader 自定义已选项渲染用 displayRender 为选中值添加链接与富内容 导读 在 Ant Design 的级联选择组前端UI组件设计系统ng-zorro-antd 实战在 Modal 模态窗口内嵌入 Cascader 级联选择控件ng zorro antd 实战在 Modal 模态窗口内嵌入 Cascader 级联选择控件 导读 本文讲解如何在 ng zorro antd 的 nz mUI组件前端上一篇Sigma File Manager 自定义主页横幅打造个性化界面的终极指南 下一篇UnityExplorer完整指南掌握游戏实时调试与修改的终极免费方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表