triggers
描述
可选。定义用于插入提及、标签及其他标记的下拉触发器
当用户输入已配置的字符(例如 @ 或 #)时,RichText 会打开一个包含预定义条目的下拉列表。当用户选择某个条目时,RichText 会将其作为不可编辑的标记(<a data-token="..." data-token-id="...">)插入文档中。
用法
triggers?: Array<{
trigger: string,
data: Array<{ id?: string | number; label?: string; url?: string }>
| ((query: string) =>
Array<{ id?: string | number; label?: string; url?: string }>
| Promise<Array<{ id?: string | number; label?: string; url?: string }>>),
showTrigger?: boolean,
action?: (item) => void
}>;
参数
triggers 数组中的每个条目接受以下字段:
trigger—(必填)打开建议下拉列表的字符(例如"@"、"#"、"/"、"$")data—(必填)下拉列表的数据源;可以是数组、同步函数或异步函数。参见数据源形式showTrigger—(可选)当值为true(默认值)时,RichText 在插入的标记中保留触发字符(例如@Alice);当值为false时,RichText 仅插入label(例如Alice)action—(可选)当用户选择条目时调用的自定义 callback。设置后,RichText 会删除已输入的触发文本(触发字符加查询字符串),并调用action(item),而不是插入标记。该 callback 接收选中的条目,可以插入任意内容来替代所选内容。action参数优先于showTrigger,设置action后showTrigger无效。参见自定义 action
数据源形式
- 静态数组 — RichText 通过将查询字符串与
label进行匹配(不区分大小写,使用startsWith)自动过滤数组:
new richtext.Richtext("#root", {
triggers: [{
trigger: "@",
data: [
{ id: "alice", label: "Alice" },
{ id: "bob", label: "Bob" }
]
}]
});
- 同步函数 — RichText 以当前
query字符串为参数调用您的函数;由您执行过滤并返回匹配的数组:
new richtext.Richtext("#root", {
triggers: [{
trigger: "#",
data: query => tags.filter(t =>
t.label.toLowerCase().startsWith(query.toLowerCase())
)
}]
});
- 异步函数 — RichText 以当前
query字符串为参数调用您的函数;返回一个解析为匹配数组的Promise。适用于服务端搜索:
new richtext.Richtext("#root", {
triggers: [{
trigger: "+",
data: async query => {
const res = await fetch(`/api/users?q=${encodeURIComponent(query)}`);
const users = await res.json();
return users.map(u => ({ id: String(u.id), label: u.name, url: u.website }));
}
}]
});
建议条目字段
data 中的每个条目(或函数返回的每个条目)具有以下字段:
id—(可选)保存在插入标记上的唯一标识符。如果省略,RichText 会自动生成一个 IDlabel—(可选)在下拉列表中显示并插入文档的文本。仅在使用默认渲染时为必填项;使用自定义triggerTemplate时,您可以从其他字段渲染条目(例如template(({ data }) => data.id)),并省略labelurl—(可选)与条目关联的 URL。RichText 将该 URL 存储为插入标记的href属性。Ctrl+Click标记可打开链接
条目还可以包含 id、label 和 url 之外的任意数量的自定义字段(例如,用于 emoji 的 code,或用于头像的 image 和 name)。这些额外字段会传递给 triggerTemplate callback 和 action callback。