选择成员后可继续输入。删掉完整名称时,提及记录会同步移除。
目录查询会稍作等待。可模拟失败,再在面板中重试。
<div class="demo-col" style="width:100%"><label class="demo-label" for="mentions-text">参与讨论的成员</label><div class="icen-mentions" id="demo-mentions"><textarea id="mentions-text" class="icen-input" rows="3" placeholder="输入 @ 选择成员,也可以用姓名或拼音查找"></textarea></div><p class="demo-label" id="mentions-log" role="status"><bdi>选择成员后可继续输入。删掉完整名称时,提及记录会同步移除。</bdi></p><label class="demo-label" for="mentions-async-text">从团队目录查找</label><div class="icen-mentions" id="demo-mentions-async"><textarea id="mentions-async-text" class="icen-input" rows="2" placeholder="输入 @林 或 @ali,体验异步查找"></textarea></div><div class="demo-row"><button class="icen-btn icen-btn-sm" type="button" id="mentions-fail">模拟一次查询失败</button></div><p class="demo-label" id="mentions-async-log" role="status"><bdi>目录查询会稍作等待。可模拟失败,再在面板中重试。</bdi></p></div>
行为与接口说明
行首或空白后的 @query 打开成员建议。方向键跳过不可选成员,Enter 插入名称,Escape 关闭当前建议;组合输入不被打断。新查询、关闭和卸载会取消旧结果,错误与无匹配独立呈现,候选可自定义渲染。
安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):
import '@icen.ai/ui/kit/mentions';
也可以用脚手架直接打印引入行:
bunx --bun @icen.ai/ui add mentions
Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/mentions.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。
用法
import {createMentions} from '@icen.ai/ui/kit/mentions';const handle = createMentions(textarea, { source: async (query, {signal}) => { const response = await fetch('/api/members?q=' + encodeURIComponent(query), {signal}); if(!response.ok) throw new Error('Member lookup failed'); return response.json(); // { id, label, keywords?, disabled? }[] }, trigger:'@', minChars:0, debounceMs:160, max:8, loadingLabel:'正在查找成员…', errorLabel:'暂时无法查询成员,请重试。', noResultsLabel:'没有匹配的成员', // renderItem: (item, query) => Node | string, // 安全的展示槽位 onSelect: (item) => console.log(item.id, item.label),});// 支持 textarea 原生 input,以及 icen:mention-select {id,label,query}。// getMentions() 按当前文本校验完整名称,不将 @alice2 当成 @alice。handle.getMentions();handle.close(); // 取消查询并关闭面板,不改正文handle.destroy(); // 卸载;恢复原 ARIA,回收面板、镜像与监听