资讯动态

MateChat Angular 版 mc-list 列表组件:参数、事件与懒加载、快捷键的完整实现解析

发布时间:2026/10/13 15:57:55 来源:尧图企业网站定制
前端UI组件AI 应用【免费下载链接】MateChat前端智能化场景解决方案UI库轻松构建你的AI应用我们将持续完善更新欢迎你的使用与建议。 官网地址https://matechat.gitcode.com项目地址https://gitcode.com/DevCloudFE/MateChat点击查看免费下载本篇基于 MateChat 的 Angular 组件库matechat/ng中的 List 列表组件编写系统梳理mc-list的全部输入参数、事件、插槽与类型定义并结合仓库源码还原其选中高亮、懒加载触发阈值与键盘快捷键的实现细节帮助你在历史对话列表、下拉选择、标签展示等 AI 聊天界面场景中直接落地该组件。组件定位与引入方式List 组件选择器mc-list用于展示一组内容或选项适用于历史对话列表呈现、下拉选项、标签展示等场景。它由两部分组成组件层ListComponentstandalone 组件负责输入绑定、事件派发、键盘监听与模板渲染公共层components-common/List下的 Foundation、类型与样式负责类名计算与视觉呈现。从 list.component.ts 可以看到组件声明为selector: mc-list而 list.module.ts 将其包装为ListModule对外导出。引入方式按当前仓库文档的说明import { ListModule } from matechat/ng;类型定义ListItemData、ListDirection、ListVariant通过 index.ts 一并导出最终经由 public-api.ts 暴露给包使用者。根据 package.json当前库版本为 20.1.0peer 依赖要求angular/core/angular/common^20.3.0。输入参数Inputs以下为文档给出的完整参数表见 api.md参数名类型默认值说明dataListItemData[][]需要显示的数据directionListDirectionvertical选项排列方式垂直或者水平autoWrapbooleantrue是否自动换行仅在水平排列时生效variantListVarianttransparent选项的形态默认无背景色悬浮和选中高亮selectablebooleantrue是否可选中可选中时点击后选项高亮enableLazyLoadbooleanfalse是否支持懒加载enableShortKeybooleanfalse是否支持快捷键选择inputElHTMLElement--当支持快捷键选择时监听键盘事件的元素默认为document在 list.component.ts#L37-L45 中上述Input()声明与文档默认值完全一致。此外源码中还声明了一个文档参数表未列出的输入preSelectIndex默认值为this.enableShortKey ? 0 : -1用于记录键盘预选中的下标它是快捷键机制的内部状态入口开启enableShortKey后默认预选第一项。关于direction与autoWrap的生效关系foundation.ts 的getListClasses()给出了精确结论direction horizontal时容器追加mc-list-horizontal类水平排列且autoWrap false时再追加mc-list-nowrap类。也就是说垂直排列时autoWrap完全不起作用与文档“仅在水平排列时生效”的说明互相印证。事件Outputs事件名类型说明select(e: ListItemData) void点击选项时触发的事件参数为用户传入的选项数据loadMore(e: Event) void滚动到底时触发的事件仅在启用懒加载且排列方式为垂直时触发select 事件发出的是选项的副本。查看 list.component.ts#L132-L142 的onItemClick实现组件在派发事件时执行的是this.select.emit({ ...clickedItem })即对选项做了浅拷贝。这意味着你在业务代码中修改事件参数不会反向污染data里的原始对象同时该方法在clickedItem.disabled为true时直接return禁用项点击不会触发任何事件。loadMore 事件50px 阈值与方向限制。滚动监听在 list.component.html 的容器div上通过(scroll)onListScroll($event)绑定处理逻辑位于 list.component.ts#L119-L131onListScroll(e: Event): void { if (!this.enableLazyLoad || this.direction ! ListDirection.Vertical) { return; } const targetEl e.target as HTMLElement; const scrollHeight targetEl.scrollHeight; const clientHeight targetEl.clientHeight; const scrollTop targetEl.scrollTop; if (scrollHeight - clientHeight - scrollTop LazyLoadThreshold) { this.loadMore.emit(e); } }其中LazyLoadThreshold定义在 list-const.ts#L1取值为50——即距底部不足 50px 时触发。注意该判断对每次 scroll 事件都会执行源码层没有“正在加载”节流业务侧应自行用 loading 标志位或数据总量守卫后文懒加载示例即展示了这种写法。插槽自定义选项内容插槽名返回值说明itemTemplate{ item: ListItemData }自定义选项内容在 Angular 模板中的实际用法是通过ng-template内容投影引用名需为item组件内部以ContentChild(item)捕获见 list.component.ts#L51mc-list [data]options ng-template #item let-item i [class]item.icon stylemargin-right:4px;/i{{ item.label }} /ng-template /mc-list从 list.component.html 的渲染分支可以看到插槽与variant的两种配合方式variant none时选项不再包裹mc-list-item容器模板内容原样输出悬浮高亮、圆角等样式全部由使用者自控适合完全自定义场景其他 variant 下模板内容被渲染进mc-list-item的div中若未提供插槽则回退为默认展示{{ item[label] }}。这一分支逻辑与官方 democustom-demo.component.html中“部分自定义”和“完全自定义”两个示例一一对应。类型定义ListItemDatainterface ListItemData { label: string; // 显示的内容 value: string | number; // 对应的值 disabled?: boolean; // 是否禁用 active?: boolean; // 是否选中 [key: string]: any; // 其他自定义字段 }源码中的定义见 list-types.ts#L11-L17与文档一致。label是默认模板展示的内容value是选中高亮的匹配依据后文会说明匹配规则disabled/active为可选状态位索引签名则允许携带icon等任意业务字段。ListDirectionenum ListDirection { Horizontal horizontal, Vertical vertical, }ListVariantenum ListVariant { Transparent transparent, // 无背景色悬浮和选中高亮 Filled filled, // 带背景色 Bordered bordered, // 带边框 None none, //无任何样式完全由用户自定义 }四种形态的视觉差异由 list.scss 控制filled使用$devui-gray-form-control-bg背景bordered使用$devui-dividing-line边框而悬浮/预选态统一使用$devui-list-item-hover-*变量、激活态使用$devui-list-item-active-*变量禁用态使用$devui-disabled-*变量——因此组件外观会跟随 DevUI 主题变量自动变化。源码级实现解析选中高亮的匹配规则selectable为true时onItemClick会遍历data将value与点击项value相等的项标记为active true其余置为false。这说明高亮匹配基于value而非索引或label当你用同一份value复用于多个选项时会出现多高亮这是使用上的隐含约束。同时该过程会直接改写传入的data数组元素配合select事件的浅拷贝派发形成“状态写回 data、事件发出副本”的模式。快捷键选择监听目标元素的确定逻辑开启enableShortKey后组件在ngOnInit中调用initListenDom()决定键盘事件的挂载点list.component.ts#L92-L104未传inputEl监听document传入的inputEl标签名在[TEXTAREA, INPUT]InputTagNames常量中直接监听该元素其他情况在该元素内部querySelector(textarea) || querySelector(input)找不到则回退到document。即inputEl既可以是输入框本身也可以是包含输入框的容器元素。按键处理逻辑在onKeyDownlist.component.ts#L143-L161ArrowUppreSelectIndex减 1为 0 时环绕到末项ArrowDownpreSelectIndex加 1为末项时环绕到 0Enter仅当selectable为true时对data[preSelectIndex]执行与点击完全一致的onItemClick从而同样派发select事件。模板中index preSelectIndex的选项会带mc-list-item-pre-selection类视觉上与悬浮态一致形成“键盘移动 → 高亮跟随 → 回车确认”的连贯操作流这正是文档 demo 中所述“下拉列表场景的连贯性操作”。需要注意生命周期细节ngOnDestroy中会调用removeListener()解绑 keydown但由于源码中addEventListener与removeEventListener分别调用了this.onKeyDown.bind(this)两次 bind 产生不同函数引用从源码结构看该解绑可能不会真正生效如果你的应用存在大量 List 实例频繁销毁重建从源码结构看值得留意监听器在document上累积的可能性。懒加载与默认高度容器样式.mc-list默认width: 100%; max-height: 300px; overflow: autolist.scss#L3-L7这是文档 demo 中“组件默认设置列表最大高度为 300px可通过style或class覆盖”说法的来源。水平排列时容器为display: flex; flex-wrap: wrap; gap: 12pxmc-list-nowrap下改为flex-wrap: nowrap且项不参与伸缩。实战示例来自 demo 应用以下示例取自仓库内的演示工程 demo-app均可直接改写进你的业务组件。基本用法选中类场景选项通过disabled设置禁用、active设置选中默认悬浮高亮、点击选中高亮basic-demo.component.html、basic-demo.component.tsdiv classdemo-container mc-list [data]options (select)onSelect($event)/mc-list /divget options() { return new Array(6).fill(0).map((_item, i) ({ label: Option ${i 1}, value: i 1, disabled: i 3, // 第 4 项禁用 active: i 1, // 第 2 项初始选中 })); } onSelect(option: any) { console.log(list selected, option); }水平排列展示类场景direction设置排列方式variant设置形态autoWrap控制水平换行selectablefalse禁用点击选中display-demo.component.htmlmc-list [data]options [selectable]false [autoWrap]autoWrap [direction]direction [variant]selectedVariant /mc-list快捷键与输入框联动先获取目标输入框元素再传给inputElshortcut-demo.component.html、shortcut-demo.component.tsinput typetext idlist-shortcut-demo-input [(ngModel)]inputValue mc-list [data]options [enableShortKey]true [inputEl]inputEl (select)handleSelect($event)/mc-listngOnInit() { this.inputEl document.getElementById(list-shortcut-demo-input) as HTMLInputElement; } handleSelect(evt: any) { this.inputValue evt.label; // 键盘确认后回显 }懒加载滚动加载分页数据启用enableLazyLoad并在loadMore中做加载守卫lazyload-demo.component.html、lazyload-demo.component.ts。注意这里通过styleheight:400px覆盖了默认 300px 最大高度并用dLoading包裹展示加载态div dLoading [showLoading]loading mc-list [data]options [enableLazyLoad]true (loadMore)onLoadMore($event) styleheight:400px/mc-list /divloading false; total 30; onLoadMore(_option: any) { if (this.loading || this.options.length this.total) { return; } this.loading true; setTimeout(() { const newData new Array(10).fill(0).map((_item, i) ({ label: Option ${this.options.length i 1}, value: this.options.length i 1, })); this.options.push(...newData); this.loading false; }, 1500); }该示例同时印证了前文两点loadMore依赖垂直排列水平排列时onListScroll直接返回以及组件自身不做加载节流loading与总量守卫必须由业务侧提供。关键文件索引内容路径参数/事件/插槽/类型文档docs/components-ng/list/api.md场景 demo 说明docs/components-ng/list/demo.md组件实现packages/components-ng/projects/components-ng/src/List/list.component.ts模板渲染packages/components-ng/projects/components-ng/src/List/list.component.html模块与导出packages/components-ng/projects/components-ng/src/List/index.ts类型与常量packages/components-ng/projects/components-ng/src/components-common/List/common/list-types.ts、list-const.ts样式packages/components-ng/projects/components-ng/src/components-common/List/common/list.scss赞分享前端UI组件AI 应用【免费下载链接】MateChat前端智能化场景解决方案UI库轻松构建你的AI应用我们将持续完善更新欢迎你的使用与建议。 官网地址https://matechat.gitcode.com项目地址https://gitcode.com/DevCloudFE/MateChat点击查看免费下载相关推荐MateChat Angular 版 Input 组件详解mc-input 参数、事件与格式化录入实现原理MateChat Angular 版 Input 组件详解mc input 参数、事件与格式化录入实现原理 MateChat 是面向前端智能化场景的 UI 组前端UI组件AI 应用MateChat matechat/ng Introduction 介绍组件详解mc-introduction 参数、插槽与源码实现MateChat matechat/ng Introduction 介绍组件详解mc introduction 参数、插槽与源码实现 MateChat 的前端UI组件AI 应用MateChat Introduction 组件实战Angular 版 matechat/ng 中 AI 应用介绍页的完整配置与实现剖析MateChat Introduction 组件实战Angular 版 matechat/ng 中 AI 应用介绍页的完整配置与实现剖析 本篇技术指南以 M前端UI组件AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑