多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

ng-zorro-antd Comment 评论组件实战:配合 nz-list 构建可扩展的评论列表

ng-zorro-antd Comment 评论组件实战:配合 nz-list 构建可扩展的评论列表 UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载本指南基于 ng-zorro-antd 官方演示 配合列表组件Usage with list系统讲解如何将nz-comment评论组件与nz-list列表组件组合以数据驱动的方式渲染评论列表。读完本文你将掌握nz-list的nzDataSource/nzRenderItem渲染机制、nz-comment的完整 API 用法以及如何在评论列表上叠加操作项、嵌套回复等实战能力。一、为什么用列表组件承载评论在真实产品中评论区几乎不会只有单条评论而是一页评论的集合。ng-zorro-antd 的官方演示正是采用nz-list作为容器列表负责数据的批量渲染与布局管理nz-comment负责单条评论的内容结构头像、作者、时间、正文、操作项两者各司其职、组合即用。从源码看nz-comment本身并不关心数据的来源与数量它只负责渲染一条评论的 DOM 结构见 comment.component.ts而nz-list提供的是如何遍历数据并渲染每一项的通用能力见 list.component.ts。把数据迭代交给列表、把单条展示交给评论是这套组合最核心的协作模型。二、完整示例数据驱动的评论列表官方演示 list.ts 展示了最小可用的组合代码下面完整给出并逐步拆解import { Component, signal } from angular/core; import { addDays, formatDistance } from date-fns; import { NzAvatarModule } from ng-zorro-antd/avatar; import { NzCommentModule } from ng-zorro-antd/comment; import { NzListModule } from ng-zorro-antd/list; Component({ selector: nz-demo-comment-list, imports: [NzAvatarModule, NzCommentModule, NzListModule], template: nz-list [nzDataSource]data() [nzRenderItem]item nzItemLayouthorizontal ng-template #item let-item nz-comment [nzAuthor]item.author [nzDatetime]item.datetime nz-avatar nz-comment-avatar nzIconuser [nzSrc]item.avatar / nz-comment-content p{{ item.content }}/p /nz-comment-content nz-comment-actionReply to/nz-comment-action /nz-comment /ng-template /nz-list }) export class NzDemoCommentListComponent { readonly data signal([ { author: Han Solo, avatar: https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png, content: We supply a series of design principles, practical patterns and high quality design resources (Sketch and Axure), to help people create their product prototypes beautifully and efficiently., datetime: formatDistance(new Date(), addDays(new Date(), 1)) }, { author: Han Solo, avatar: https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png, content: We supply a series of design principles, practical patterns and high quality design resources (Sketch and Axure), to help people create their product prototypes beautifully and efficiently., datetime: formatDistance(new Date(), addDays(new Date(), 2)) } ]); }运行前提组件通过imports引入NzAvatarModule、NzCommentModule、NzListModule三个模块时间格式化使用了date-fns的formatDistance/addDays请在项目中安装date-fns依赖。三、nz-list 侧的渲染机制nz-list是本例的数据发动机需要理解三个关键输入均可在 list.component.ts 中找到定义nzDataSource数据源数组类型为NzSafeAny[]这里由data()signal 提供。nzRenderItem一个TemplateRef模板上下文为{ $implicit: item, index: $index }即模板中let-item拿到的就是数组里的当前元素。nzItemLayout布局方向取值horizontal默认或vertical评论列表通常使用horizontal。从源码实现看nz-list在模板内部通过for (item of nzDataSource; track item)遍历数据并把每一项交给nzRenderItem对应的ng-template渲染list.component.ts。这意味着列表项完全由你控制的模板决定nz-comment可以无缝嵌入其中数据源更新signal 或普通数组变更会触发列表自动重渲染非常适合接入服务端分页加载评论的场景当nzDataSource为空且未加载时列表会自动渲染内置的空状态nz-list-empty无需额外处理空数组分支。四、nz-comment 侧的 API 与结构nz-comment的完整 API 定义在 doc/index.en-US.md核心参数如下Property说明类型默认值[nzAuthor]显示评论的作者string \| TemplateRefvoid-[nzDatetime]展示时间描述string \| TemplateRefvoid-除了这两个输入属性评论组件还通过内容子指令来组织内部结构nz-comment-avatar必须作用在nz-avatar元素上选择器为nz-avatar[nz-comment-avatar]用于渲染头像区nz-comment-content评论正文内容区nz-comment-action评论内容下方呈现的操作项如 Reply to、点赞/点踩支持多个。结构源码印证在 comment.component.ts 的模板中nz-comment的 DOM 骨架为div classant-comment-inner div classant-comment-avatar…头像…/div div classant-comment-content div classant-comment-content-author span classant-comment-content-author-name…nzAuthor…/span span classant-comment-content-author-time…nzDatetime…/span /div ng-content selectnz-comment-content / ul classant-comment-actions…nz-comment-action 列表…/ul /div /div div classant-comment-nested…嵌套内容…/div几个值得注意的源码细节nzAuthor与nzDatetime都通过*nzStringTemplateOutlet渲染所以既可以直接传字符串也可以传TemplateRefvoid做富文本定制。操作项通过ContentChildren(CommentAction)收集只有存在nz-comment-action时才渲染ant-comment-actions列表。ant-comment-nested区块用于承载嵌套回复这正是回复树实现的基础。操作项的实现原理在 comment-cells.ts 中NzCommentActionComponent将自身内容包进ng-template再封装为TemplatePortal组件模板里通过nzCommentActionHost指令继承自 CDK 的CdkPortalOutlet将 Portal 挂载到li中。因此nz-comment-action内可以放任意内容——图标、按钮、点击事件都支持且不影响外层布局。五、在列表场景中的进阶能力掌握了nz-listnz-comment的组合模式后可以进一步扩展出更完整的功能5.1 交互式操作项参考 basic.ts在nz-comment-action中放入带点击事件的图标即可实现点赞/点踩nz-comment-action nz-icon nz-tooltip nzTooltipTitleLike nzTypelike [nzTheme]likes() 0 ? twotone : outline (click)like() / span classcount like{{ likes() }}/span /nz-comment-action通过 signal 状态如likes()/dislikes()控制主题色与计数完全由业务层决定交互逻辑组件本身不做任何假定。5.2 嵌套回复树参考 nested.ts利用ant-comment-nested插槽递归渲染子评论定义一个#commentTemplateRef模板在nz-comment内部用ng-template递归渲染comment.children即可生成多级回复结构。这套写法同样可以套用在nz-list的nzRenderItem中实现评论 回复树的一体化列表。5.3 评论编辑框仓库还提供了编辑器演示 editor.ts展示了头像 文本域 提交按钮的评论输入区可作为列表上方发表评论入口的参考实现。六、小结nz-list与nz-comment的组合是 ng-zorro-antd 评论区场景的标准解法容器层nz-list用nzDataSourcenzRenderItem完成数据遍历与项模板注入天然支持 loading、空态、分页、加载更多nzLoadMore、nzPagination等列表能力内容层nz-comment用nzAuthor、nzDatetime及三个内容指令avatar/content/action完成单条评论的语义化渲染并保留ant-comment-nested用于嵌套回复协作点nz-comment的输入属性既可绑定为字符串也可绑定为TemplateRef与列表项上下文let-item配合时非常灵活。需要进一步查阅的仓库资料评论组件 API 见 doc/index.zh-CN.md组件模板与宿主样式见 comment.component.ts列表渲染源码见 list.component.ts全部演示代码位于 components/comment/demo 目录。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐NG-ZORRO Comment 评论组件实战nz-comment 结构、API 与嵌套评论实现解析NG ZORRO Comment 评论组件实战nz comment 结构、API 与嵌套评论实现解析 Comment评论组件是 NG ZORROAnguUI组件前端NG-ZORRO nz-comment 评论组件全解在 Angular 中构建评论讨论区的结构与 API 详解NG ZORRO nz comment 评论组件全解在 Angular 中构建评论讨论区的结构与 API 详解 在 NG ZORROAngular UI CUI组件前端使用 ng-zorro-antd 的 nz-comment 构建自定义评论编辑器Reply Editor使用 ng zorro antd 的 nz comment 构建自定义评论编辑器Reply Editor 评论编辑器是评论功能中最常遇到的交互形态用户在输UI组件前端上一篇quip-coordinator 深度解析QuIP v0.3 挖矿网络的链上协调器、任务喂给与矿工监督架构下一篇Barba.js 性能优化实战Cache 模块如何提升页面加载速度300%创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表