Skip to content

Sender 消息输入框 ​

概览 ​

Sender 是面向聊天场景的可组合输入组件,负责文本编辑、提交和取消交互,并可通过扩展、插槽和独立操作按钮接入联想、提及、模板、语音与附件能力。

适用场景 ​

  • 聊天或 AI 应用需要可控的文本输入与提交入口
  • 输入区需要组合模板、提及、联想、语音或附件能力
  • 应用需要接收结构化输入或额外提交内容,并自行管理发送流程

Sender 不负责消息列表、文件上传请求或 AI 响应状态本身。应用需要处理 submit、cancel 等事件,并把外部状态通过 Props 同步回来。

用法示例 ​

绑定输入内容并监听 submit。示例会在页面中展示已提交文本,并由父组件清空受控值。

loading

输入与状态 ​

输入模式 ​

Sender 支持单行和多行两种输入模式,通过 mode 属性控制。

单行模式自动切换

在单行模式下,当输入内容超出宽度时,会自动切换为多行模式。

当 submitType="enter" 时,按 Ctrl+Enter 或 Shift+Enter 也会自动切换为多行模式并换行。

loading

加载、禁用与取消 ​

通过 loading 和 disabled 属性控制组件状态。加载状态下可点击停止按钮触发 cancel 事件;应用需要终止外部任务,并把新的 loading 状态同步回组件。

loading

字数限制 ​

通过 maxLength 和 showWordLimit 属性实现字数限制和统计。

超出限制行为

超出字数限制时,不会自动截断内容,但会以红色标示真实字数,且无法提交。

loading

扩展输入能力 ​

Sender 采用可插拔的扩展架构,通过 extensions prop 灵活添加功能。所有扩展都支持响应式数据自动同步。

扩展配置 ​

提供两种集成方式:

typescript
import { TrSender } from '@opentiny/tiny-robot'

// 便捷函数(推荐)
TrSender.mention(mentions, '@')
TrSender.suggestion(suggestions) // 不过滤
TrSender.suggestion(suggestions, { filterFn: customFilter }) // 自定义过滤
TrSender.template(templates)
TrSender.template(templates, { appendTo: '.chat-window' })

// 标准配置(用于复杂场景)
TrSender.Mention.configure({ items: mentions, char: '@', allowSpaces: false })
TrSender.Suggestion.configure({ items: suggestions, filterFn: customFilter })

模板编辑 ​

使用 Template 扩展实现模板填充功能,支持动态设置模板内容,光标自动聚焦到第一个可编辑字段。

响应式数据

通过 items 配置项传入响应式 ref,模板数据变化时会自动更新编辑器内容。

loading

配置详见:Template 配置

提及功能 ​

使用 Mention 扩展实现 @提及功能,输入触发字符(默认 @)触发提及选择,快速引用预设的助手或对象,支持键盘导航和搜索过滤。

自定义触发字符

支持自定义触发字符,例如使用 # 代替 @。配置 char: '#' 后,输入 # 即可触发提及列表,选中后显示为 #标签名 的格式。

删除提及

按 Backspace 删除提及项时会保留触发字符(如 @ 或 #),可继续选择其他项。

loading

配置详见:Mention 配置

结构化数据:submit 事件 - 结构化数据说明

智能联想 ​

使用 Suggestion 扩展实现智能联想功能,支持键盘导航(↑↓ 选择,Enter 确认)和自动补全提示。

自动补全提示

选中建议项时,输入框会以灰色文本显示剩余部分,并显示 "TAB" 提示,按 Tab 键快速应用补全。

基础用法

不传 filterFn 时,直接显示所有建议项,不做任何过滤。

loading

自定义过滤

通过 filterFn 自定义过滤逻辑,实现模糊匹配、前缀匹配等。

loading

高亮模式

支持三种高亮模式,满足不同的使用场景:

  1. 自动匹配:不设置 highlights,自动高亮与输入内容匹配的部分
  2. 精确指定:通过 highlights 数组精确指定需要高亮的文本片段
  3. 自定义函数:通过 highlights 函数完全控制高亮逻辑,实现复杂的高亮规则
loading

配置详见:Suggestion 配置

语音输入与服务集成 ​

通过 VoiceButton 组件实现语音输入功能,支持浏览器内置语音识别和第三方语音识别服务。

组件化设计

语音输入功能通过独立的 VoiceButton 组件实现,可按需添加到 footer 插槽中,无需额外配置。

基础语音交互 ​

auto-insert 默认为 true,会把最终识别结果插入编辑器;关闭后,应用可以只通过 speech-final 接收结果并自行决定后续处理。

loading

浏览器内置处理器是 VoiceButton 在未传 customHandler 时的默认实现。它会请求麦克风权限,且可用性取决于浏览器;正式产品应处理不支持、拒绝授权和识别失败等情况。

第三方语音服务 ​

支持集成第三方语音识别服务(如阿里云、百度、Azure 等)。这是高级集成示例,需要应用提供服务端代理、鉴权信息和浏览器录音权限,不属于基础使用的运行前提。

loading

参考实现不是可直接部署的服务

speechHandlers.ts 展示阿里云一句话识别和实时识别所需的录音、API 调用与流式处理结构。示例中的代理地址和鉴权信息都是占位配置,应用必须在服务端保护凭据并实现对应代理。

自定义录音 UI ​

支持完全自定义语音录制界面,适用于移动端按住说话等场景。

loading

配置详见:VoiceButton 属性

操作按钮与外部内容 ​

默认按钮配置 ​

通过 defaultActions 属性统一配置默认按钮(Clear、Submit)的状态和提示。

loading

增强按钮 ​

通过插槽添加增强按钮(Upload、Voice 等),每个按钮都有独立的配置。

loading

配置详见:UploadButton 属性、VoiceButton 属性

上传内容 ​

附件、图片等内容通常由上传按钮或独立列表维护,不会写入 Sender 的编辑器文本。把 TrAttachments 放在 TrSender 内时会自动注册提交数据;提交时可从 extra.externalPayloads 中读取 source="attachments" 的 payload,其值为原样透传的 Attachment[],具体过滤或上传失败提示由应用处理。自定义外部内容组件也可以通过 useSenderContentRegistration 注册数据。

兼容说明

hasExternalContent 仍可用于控制外部内容场景的可提交状态,但不会生成 externalPayloads。

loading

交互与状态管理 ​

提交方式 ​

通过 submitType 属性控制提交快捷键,支持 enter、ctrlEnter、shiftEnter 三种方式。

loading

快捷键参考 ​

快捷键功能适用条件
Enter提交内容 / 换行submitType="enter"
Ctrl+Enter提交内容 / 换行submitType="ctrlEnter" / submitType="enter"
Shift+Enter提交内容 / 换行submitType="shiftEnter" / submitType="enter"
Tab应用自动补全文本联想开启且存在自动补全文本时
Esc关闭联想联想开启时
↑ / ↓导航联想项联想开启时

换行与提交行为说明

  • submitType="enter" 时:按 Enter 提交,按 Ctrl+Enter 或 Shift+Enter 换行
  • submitType="ctrlEnter" 时:按 Ctrl+Enter 提交,按 Enter 换行
  • submitType="shiftEnter" 时:按 Shift+Enter 提交,按 Enter 换行

在单行模式下使用换行快捷键时,会自动切换为多行模式。

自定义选中按键

通过 activeSuggestionKeys 可自定义选中联想项的按键,默认只有 Enter。Tab 专门用于应用灰色提示中的自动补全文本,不受 activeSuggestionKeys 控制。

自定义插槽 ​

Sender 提供了多个插槽位置,方便扩展功能:

  • header - 顶部区域,可添加标题、提示信息等
  • prefix - 输入框前缀区域,可添加图标、标签等(位于输入框内部)
  • input-prefix - 多行模式首行前置区域,支持自定义交互内容
  • footer - 底部左侧区域,可添加功能按钮
  • footer-right - 底部右侧区域,可添加操作按钮

当前插槽作用域

当前版本只有 content 插槽提供 editor。actions-inline、footer 和 footer-right 只负责放置内容,不提供作用域参数;需要操作输入内容时,请通过 Sender 实例公开的方法接入。

loading
loading

方法调用 ​

loading

组合、主题与尺寸 ​

主题继承 ​

主题继承

主题会根据父级 ThemeProvider 的配置自动继承,无需重复设置。

组件尺寸 ​

通过 size 属性控制组件尺寸,支持 normal(默认)和 small(紧凑)两种尺寸。

loading

API ​

公开导出 ​

导出用途与约束
TrSender / Sender消息输入主组件;静态提供 Template、Mention、Suggestion 及对应便捷工厂
TrActionButton / ActionButton可独立使用的基础图标按钮
TrUploadButton / UploadButton文件选择按钮;必须放在 Sender 组件树内以读取禁用状态
TrVoiceButton / VoiceButton语音输入按钮;必须放在 Sender 组件树内以访问编辑器和禁用状态
TrSubmitButton / SubmitButton默认提交 / 停止按钮;依赖 Sender Context
TrClearButton / ClearButton默认清空按钮;依赖 Sender Context
TrWordCounter / WordCounter字数统计;依赖 Sender Context
TrDefaultActionButtons / DefaultActionButtons组合默认清空与提交按钮;依赖 Sender Context
SENDER_CONTEXT_KEYSender 依赖注入键;主要供高级集成与定制子组件使用

Props ​

Sender ​

属性名说明类型默认值必填
model-value受控输入内容;父组件收到 update:model-value 后需要更新绑定值string—否
default-value非受控初始内容,只在初始化时读取;同时提供 model-value 时以受控值为准string''否
placeholder编辑器为空时显示的占位文本string'请输入内容...'否
mode输入布局;单行内容溢出或插入换行时可自动切换为多行InputMode'single'否
sizeSender 及其默认操作按钮的尺寸'normal' | 'small''normal'否
disabled禁用编辑和默认操作按钮booleanfalse否
loading显示停止操作;此时提交按钮触发 cancel 而不是 submitbooleanfalse否
autofocus编辑器创建后自动聚焦booleanfalse否
enterkeyhint设置移动端虚拟键盘的回车键提示EnterKeyHint'send'否
auto-size多行模式的自动高度范围;传 true 时使用 1~5 行AutoSize{ minRows: 1, maxRows: 5 }否
clearable有编辑器文本时显示清空按钮booleanfalse否
has-external-content(已弃用)兼容性地把空文本视为可提交;1.0 仍保留该属性但不推荐新代码使用;不会生成 externalPayloads,请改用 useSenderContentRegistrationbooleanfalse否
max-length最大字素数;超出后保留输入但禁止提交numberInfinity否
show-word-limit提供 max-length 时显示字数统计booleanfalse否
submit-type设置 Enter 组合键的提交方式SubmitTrigger'enter'否
stop-textloading 状态下停止操作旁的文字;省略或传空字符串时只显示图标string''(仅图标)否
default-actions配置默认提交和清空按钮的禁用状态与 Tooltip;提交按钮禁用会参与 canSubmit 计算DefaultActions—否
extensionsTiptap 扩展列表,例如 Template、Mention 和 SuggestionExtension[][]否

扩展系统

使用 extensions 属性配置功能扩展,提供灵活的配置和完整的类型支持。

Template 配置 ​

模板填充功能扩展,支持动态设置模板内容。

typescript
// 便捷函数
TrSender.template(templates)
TrSender.template(templates, { appendTo: '.chat-window' })

// 标准配置
TrSender.Template.configure({ items: templates, appendTo: '.chat-window' })
配置项说明类型默认值必填
items模板数据列表;传入 Ref 时会响应后续变化TemplateItem[] | Ref<TemplateItem[]>—否
HTMLAttributes合并到模板块节点的 HTML 属性Record<string, unknown>—否
appendToTemplate Select 下拉菜单的挂载目标string | HTMLElementdocument.body否

Mention 配置 ​

@提及功能扩展,支持快速引用预设的助手或对象,支持自定义触发字符。

typescript
// 便捷函数(使用默认 '@' 触发)
TrSender.mention(mentions)

// 便捷函数(自定义触发字符)
TrSender.mention(mentions, '#') // 使用 '#' 触发

// 标准配置
TrSender.Mention.configure({ items: mentions, char: '@', allowSpaces: false })
配置项说明类型默认值必填
items提及项列表;传入 Ref 时会响应后续变化MentionItem[] | Ref<MentionItem[]>[]否
char触发字符,例如 '@'、'#' 或 '!'string'@'否
allowSpaces是否允许触发字符后的查询文本包含空格booleanfalse否
HTMLAttributes合并到 Mention 节点的 HTML 属性Record<string, unknown>—否

Suggestion 配置 ​

智能联想功能扩展,支持自动过滤、自定义过滤和多种高亮方式。

typescript
// 便捷函数
TrSender.suggestion(suggestions) // 不过滤,显示所有项
TrSender.suggestion(suggestions, { filterFn: customFilter }) // 自定义过滤

// 标准配置
TrSender.Suggestion.configure({
  items: suggestions,
  filterFn: (items, query) => items.filter((item) => item.content.includes(query)),
  showAutoComplete: true,
})
配置项说明类型默认值必填
items建议项列表;传入 Ref 时会响应后续变化SenderSuggestionItem[] | Ref<SenderSuggestionItem[]>[]否
filterFn过滤建议;不提供时直接显示全部条目(items: SenderSuggestionItem[], query: string) => SenderSuggestionItem[]—否
showAutoComplete是否展示当前建议项的自动补全文本与 Tab 提示booleantrue否
activeSuggestionKeys确认当前建议项的按键;Tab 的自动补全行为不受此配置控制string[]['Enter']否
popupWidth建议弹层宽度;数字按像素处理,也可使用百分比或 CSS 长度number | string400否
onSelect选中回调;返回 false 时阻止默认回填(item: SenderSuggestionItem) => void | false—否

popupWidth 格式

支持数字(如 500)、百分比(如 '100%')、CSS 单位(如 '20rem')

高亮方式:

typescript
{ content: 'ECS-云服务器' }  // 自动匹配
{ content: 'RDS-数据库', highlights: ['RDS', '数据库'] }  // 精确指定
{ content: 'OSS-存储', highlights: (text, query) => [...] }  // 自定义函数

onSelect 回调:

选中建议项时触发,返回 false 可阻止默认回填行为:

typescript
// 默认行为:自动回填
onSelect: (item) => {
  console.log('Selected:', item)
  // 不返回 false,内容会自动回填到编辑器
}

// 阻止默认回填并自定义
onSelect: (item) => {
  editor.commands.setContent(`前缀-${item.content}-后缀`)
  return false // 阻止默认回填
}

// 条件性阻止
onSelect: (item) => {
  if (item.data?.needsValidation) {
    validateAndFill(item)
    return false
  }
  // 否则使用默认回填
}

回调参数

item 包含完整的 SenderSuggestionItem 信息(content、label、data、highlights),可用于应用逻辑处理。

UploadButton ​

文件上传按钮组件,支持文件类型过滤、大小限制和数量限制。

属性名说明类型默认值必填
disabled禁用文件选择;同时会与 Sender 的禁用状态合并booleanfalse否
accept传给文件选择器的 MIME 类型或扩展名过滤条件string'*'否
multiple是否允许一次选择多个文件booleantrue否
reset选择后是否重置原生文件输入,使同一文件可以再次选择booleantrue否
max-size单个文件的大小上限,单位 MB;超限时触发 errornumber—否
max-count单次选择的文件数量上限;超限时触发 errornumber—否
tooltip按钮的 Tooltip 内容TooltipContent—否
tooltip-placementTooltip 位置TooltipPlacement'top'否
icon未提供图标插槽时使用的图标组件ComponentIconImageUpload否
size按钮尺寸;数字按像素处理,也可使用 CSS 长度number | string32px(CSS 默认)否

ActionButton ​

Sender Actions 的基础图标按钮,也可以独立用于自定义操作区。

属性名说明类型默认值必填
icon未提供 icon 插槽时渲染的图标VNode | Component—是
disabled禁用原生按钮booleanfalse否
active显示激活样式booleanfalse否
tooltipTooltip 内容TooltipContent—否
tooltip-placementTooltip 位置TooltipPlacement'top'否
sizesmall、normal、像素数字或其他 CSS 长度string | number32px(CSS 默认)否

VoiceButton ​

语音输入按钮组件,支持浏览器内置语音识别和第三方语音识别服务。

属性名说明类型默认值必填
icon未录音时的图标VNode | ComponentIconVoice否
recording-icon录音中的图标VNode | ComponentIconRecordingWave否
disabled禁用录音按钮;同时会与 Sender 的禁用状态合并booleanfalse否
size按钮尺寸'small' | 'normal'normal(32px)否
tooltip按钮的 Tooltip 内容TooltipContent—否
tooltip-placementTooltip 位置TooltipPlacement'top'否
speech-config浏览器或自定义语音处理器配置SpeechConfig—否
auto-insert收到最终识别结果时是否插入编辑器booleantrue否
on-button-click点击拦截器;调用 preventDefault() 后由应用接管录音开始/停止(isRecording: boolean, preventDefault: () => void) => void | Promise<void>—否

Slots ​

Sender Slots ​

插槽名用途作用域参数
header在输入区域上方添加内容—
prefix在编辑器左侧添加内容—
input-prefix多行模式首行前置插槽-
content完全替换默认编辑器内容{ editor: unknown }
actions-inline在单行模式的默认操作按钮前添加内容—
footer在多行模式底部左侧添加内容—
footer-right在多行模式底部默认操作按钮前添加内容—

ActionButton Slots ​

插槽名用途作用域参数
icon替换 icon 属性提供的图标—

VoiceButton Slots ​

插槽名用途作用域参数
icon替换按钮图标;未提供时使用 icon / recording-icon{ isRecording: boolean }
recording-overlay在按钮外渲染自定义录音界面{ isRecording: boolean; stop: () => void }

Events ​

Sender Events ​

事件名触发时机回调参数
update:model-value编辑器文本变化时触发;受控模式下父组件需要据此更新 model-value(value: string) => void
input编辑器文本变化时同步通知(value: string) => void
submit用户使用当前提交快捷键或调用 submit(),且内容可提交时触发;组件不会自动清空内容(text: string, data?: StructuredData, extra?: SenderSubmitExtra) => void
clear用户点击清空按钮或调用 clear(),并且编辑器内容已被清空后触发() => void
focus编辑器获得焦点时触发(event: FocusEvent) => void
blur编辑器失去焦点时触发(event: FocusEvent) => void
cancelloading 状态下点击停止操作或调用 cancel() 时触发;应用负责终止外部异步任务并更新 loading() => void

submit 事件参数说明

  • text:纯文本内容,适用于简单场景(如直接发送给 AI)
  • data:结构化数据数组,仅在使用 Template 或 Mention 扩展时返回,包含文本和特殊节点的完整信息
  • extra:仅当存在外部 payload 时返回,当前包含 externalPayloads

根据提交数据的复杂度选择使用:

  • 简单场景:只使用 text 参数
  • 复杂场景:使用 data 参数提取特殊节点信息或自定义拼接格式
  • 附件等外部内容:使用 extra.externalPayloads 读取。Sender 只透传外部内容的 source 和 payload,不内置解析特定来源,也不按状态过滤

详见:结构化数据

UploadButton Events ​

事件名触发时机回调参数
select通过数量和大小校验后完成文件选择(files: File[]) => void
error文件数量超限或存在超过大小上限的文件时(error: Error, files?: File[]) => void

VoiceButton Events ​

事件名触发时机回调参数
speech-start语音处理器开始识别时() => void
speech-interim语音处理器返回中间识别结果时(transcript: string) => void
speech-final语音处理器返回最终结果时(transcript: string) => void
speech-end语音处理器结束时(transcript?: string) => void
speech-error语音处理器报告错误时(error: Error) => void

Methods / Expose ​

Sender Methods / Expose ​

公开成员说明签名
focus将焦点移入编辑器() => void
blur使编辑器失去焦点() => void
clear清空编辑器内容并触发 clear() => void
submit内容满足提交条件时触发 submit;不会自动清空内容() => void
setContent通过 Tiptap 替换编辑器全部内容;字符串可包含纯文本或 HTML(content: string) => void
getContent读取编辑器的纯文本内容() => string
cancel触发 cancel;应用仍需终止外部任务并同步 loading() => void
editor当前 Tiptap 编辑器引用;挂载完成前可能为 undefinedRef<Editor | undefined>

UploadButton Methods ​

公开成员说明签名
open打开文件选择器() => Promise<void>

VoiceButton Methods ​

公开成员说明签名或类型
start请求语音处理器开始识别() => void
stop停止识别并释放处理器() => void
speechState当前录音、支持性与错误状态SpeechState

Composables ​

函数用途签名与行为
useSenderContext在 Sender 内部的自定义子组件中读取编辑器、状态和操作() => SenderContext;必须在 TrSender 组件树内调用,否则抛出错误
useSenderContentRegistration为 Sender 注册附件等不写入编辑器的外部提交内容() => SenderContentRegister | undefined;不在 TrSender 内时返回 undefined

useSenderContentRegistration() 返回的注册函数接收稳定的 source 和普通值、Ref 或 Getter 形式的 payload,并返回注销函数。Sender 会持续读取响应式 payload;提交时复制当前注册项,作为 extra.externalPayloads 传给 submit。注册组件卸载时必须调用注销函数;TrAttachments 已在内部完成注册与清理。

结构化提交数据 ​

当使用 Template 或 Mention 扩展时,submit 事件的第二个参数 data 返回结构化数据数组。

使用建议:

  • 简单场景:使用 text 参数(纯文本)
  • 复杂场景:使用 data 参数提取特殊节点或自定义格式

Mention 扩展 ​

typescript
function handleSubmit(text: string, data?: StructuredData) {
  // text: "帮我分析 @张三 的周报"
  // data: [
  //   { type: 'text', content: '帮我分析 ' },
  //   { type: 'mention', content: '张三', value: '用户ID' },
  //   { type: 'text', content: ' 的周报' }
  // ]

  // 提取提及项
  const mentions = data?.filter((item) => item.type === 'mention') || []

  // 自定义格式(如 Slack 风格)
  const customText = data?.map((item) => (item.type === 'mention' ? `<@${item.value}>` : item.content)).join('')
}

Template 扩展 ​

typescript
function handleSubmit(text: string, data?: StructuredData) {
  // text: "帮我分析 张三 的周报"
  // data: [
  //   { type: 'text', content: '帮我分析 ' },
  //   { type: 'block', content: '张三' },
  //   { type: 'text', content: ' 的周报' }
  // ]

  // 提取模板块
  const blocks = data?.filter((item) => item.type === 'block') || []

  // 自定义格式(如 Mustache 风格)
  const customText = data?.map((item) => (item.type === 'block' ? `{{${item.content}}}` : item.content)).join('')
}

类型定义:详见 Types - StructuredData

Types ​

以下类型均从 @opentiny/tiny-robot 导出。索引按用途和支持级别分组:推荐公共类型可直接用于应用集成;高级类型服务于公开组合式函数。

推荐公共类型 ​

类型名类别类型或签名说明
SenderProps组件 PropsinterfaceSender 属性
SenderEmits组件 EventsinterfaceSender 事件
SenderSlots组件 SlotsinterfaceSender 插槽
SenderExternalPayload提交数据interface单个外部提交内容
SenderSubmitExtra提交数据interfacesubmit 的额外提交数据
InputModeProp 类型'single' | 'multiple'输入布局模式
SubmitTriggerProp 类型'enter' | 'ctrlEnter' | 'shiftEnter'提交快捷键模式
EnterKeyHintProp 类型HTML enterkeyhint 联合类型移动端虚拟键盘提示
AutoSizeProp 类型boolean | { minRows: number; maxRows: number }多行编辑器高度范围
DefaultActions配置对象interface默认提交和清空按钮配置
StructuredData结构化数据TemplateItem[] | MentionStructuredItem[]Template 或 Mention 的结构化提交数据
SelectOptionTemplate 数据interfaceTemplate 选择项
TemplateItemTemplate 数据type文本、可编辑块或选择器模板项
MentionItemMention 数据interfaceMention 输入项
SenderSuggestionItemSuggestion 数据interfaceSuggestion 输入项
SuggestionOptions扩展配置interfaceSuggestion 扩展配置
SuggestionState扩展状态interfaceSuggestion 插件状态
SuggestionTextPart高亮数据interface建议文本的高亮片段
HighlightFunction扩展回调(suggestionText: string, inputText: string) => SuggestionTextPart[]自定义建议高亮函数
ActionButtonProps组件 PropsinterfaceSender Action 基础按钮属性
UploadButtonProps组件 Propsinterface上传按钮属性
UploadButtonEmits组件 Eventsinterface上传按钮事件
VoiceButtonProps组件 Propsinterface语音按钮属性
VoiceButtonEmits组件 Eventsinterface语音按钮事件
TooltipContentProp 类型string | (() => string | VNode)Sender Action 的 Tooltip 内容
TooltipPlacementProp 类型typeTooltip 方位联合类型
SpeechCallbacks语音回调interface语音处理过程回调
SpeechHandler服务接口interface可替换的语音处理器
SpeechConfig配置对象interface语音识别配置
SpeechState状态对象interface语音识别状态

高级组合式 API 类型 ​

类型名对应入口类型或签名说明
SenderContext / UseSenderContextReturnuseSenderContextinterface / SenderContextSender 上下文及其返回类型别名
SenderContentRegisteruseSenderContentRegistration(source: string, payload: MaybeRefOrGetter<unknown>) => () => void注册外部内容并返回注销函数

常用字段 ​

SenderSuggestionItem:

字段说明类型必填
content用于匹配和默认回填的建议内容string是
label可选元数据;当前列表展示和默认回填仍使用 contentstring否
highlights精确片段或自定义高亮函数string[] | HighlightFunction否
data应用附加数据Record<string, unknown>否

MentionItem:

字段说明类型必填
id提及项标识;未提供时由组件生成string否
label列表和编辑器中显示的名称string是
value提交到结构化数据中的关联值string是
icon列表中显示的图标地址string否

SelectOption:

字段说明类型必填
label显示文本string是
value选择后的值string是
data应用附加字符串string否

SenderSubmitExtra 只在存在已注册外部内容时传给 submit:

字段说明类型必填
externalPayloads当前外部内容的快照SenderExternalPayload[]是

SenderExternalPayload:

字段说明类型必填
source注册来源的稳定标识string是
payload由对应来源定义的原始数据unknown是

DefaultActions:

字段说明类型必填
submit.disabled禁用默认提交按钮,并参与 Sender 的 canSubmit 计算boolean否
submit.tooltip提交按钮 TooltipTooltipContent否
submit.tooltipPlacement提交按钮 Tooltip 位置TooltipPlacement否
clear.disabled禁用默认清空按钮boolean否
clear.tooltip清空按钮 TooltipTooltipContent否
clear.tooltipPlacement清空按钮 Tooltip 位置TooltipPlacement否

SpeechConfig:

字段说明类型默认值
customHandler替换浏览器内置识别器;处理器负责支持性检查、启动、停止和资源清理SpeechHandler浏览器 Web Speech 处理器
lang浏览器内置识别器使用的语言stringnavigator.language
continuous浏览器内置识别器是否持续识别booleanfalse
interimResults浏览器内置识别器是否返回中间结果booleantrue
autoReplace公开类型中的兼容字段;当前 VoiceButton 和内置处理器不会读取该值boolean—
onVoiceButtonClick公开类型中的兼容字段;当前点击拦截应使用 VoiceButton 的 on-button-click Prop(isRecording: boolean, preventDefault: () => void) => void | Promise<void>—

SpeechHandler 的完整接口如下。start 应通过回调报告识别过程;stop 必须停止录音、网络连接和计时器等外部资源。

ts
interface SpeechHandler {
  start: (callbacks: SpeechCallbacks) => Promise<void> | void
  stop: () => Promise<void> | void
  isSupported: () => boolean
}

SenderContext 是 useSenderContext() 的完整返回类型。常用字段按职责分组如下;所有状态字段都是响应式 Ref。

分组字段
编辑器editor、editorRef
输入与布局状态mode、isAutoSwitching、disabled、loading、size
提交派生状态hasContent、hasEditorContent、canSubmit、isOverLimit、characterCount
配置状态maxLength、showWordLimit、clearable、defaultActions、submitType、stopText
动作submit、clear、cancel、focus、blur、setContent、getContent

Context 动作与同名 Expose 方法具有相同行为;它们会修改编辑器内部状态或触发对应事件,但不会替应用结束外部请求,也不会在提交后自动清空受控值。

CSS Variables ​

以下变量由公共主题样式声明。颜色标为“主题值”时,会随 ThemeProvider 的明暗主题切换;其余值可在 Sender 的样式作用域中覆盖。Tooltip 弹层通常挂载到全局层级,因此 --tr-sender-tooltip-gap 应设置在 :root 或全局主题作用域。

容器、文本与状态

变量名说明默认值
--tr-sender-bg-colorSender 背景色var(--tr-container-bg-default)
--tr-sender-bg-color-disabled禁用时的背景色主题值
--tr-sender-text-color编辑器文字颜色var(--tr-text-primary)
--tr-sender-text-color-disabled禁用时的文字颜色主题值
--tr-sender-placeholder-color占位文字颜色var(--tr-text-tertiary)
--tr-sender-placeholder-color-disabled禁用时的占位文字颜色主题值
--tr-sender-box-shadowSender 阴影主题值
--tr-sender-header-border-bottomHeader 分隔线主题值
--tr-sender-button-hover-bg操作按钮悬停背景var(--tr-container-bg-hover)
--tr-sender-button-active-bg操作按钮激活背景主题值
--tr-sender-word-limit-color字数统计文字颜色主题值
--tr-sender-word-limit-error-color超出字数限制时的颜色主题值
--tr-sender-transition-duration容器状态过渡时长0.2s

尺寸与布局

变量名说明默认值
--tr-sender-font-size编辑器字号16px
--tr-sender-line-height编辑器行高26px
--tr-sender-border-radiusSender 圆角26px
--tr-sender-padding单行模式主区域内边距15px 20px
--tr-sender-gap同一区域内的元素间距8px
--tr-sender-footer-gapFooter 左右区域间距12px
--tr-sender-header-paddingHeader 内边距12px 20px
--tr-sender-header-divider-insetHeader 分隔线左右缩进20px
--tr-sender-multi-main-padding多行模式主输入区内边距16px 20px 12px
--tr-sender-footer-paddingFooter 内边距0 10px 10px
--tr-sender-prefix-padding-rightPrefix 右内边距4px
--tr-sender-actions-padding-right单行操作区右内边距10px
--tr-sender-button-size普通操作按钮尺寸32px
--tr-sender-button-size-submit提交按钮尺寸36px
--tr-sender-action-button-sizeActionButton 在 Sender 内的尺寸var(--tr-sender-button-size, 32px)
--tr-sender-action-button-paddingActionButton 内边距4px
--tr-sender-action-gap相邻普通操作按钮间距4px
--tr-sender-action-submit-gap普通操作区与提交按钮间距12px
--tr-sender-tooltip-gapTooltip 与触发按钮的间距8px

当 size="small" 时,组件把下列基础变量映射到对应的 -small 变量。未列出 -small 版本的颜色和布局变量继续继承普通值。

变量名默认值
--tr-sender-font-size-small14px
--tr-sender-line-height-small24px
--tr-sender-border-radius-small24px
--tr-sender-padding-small12px 16px
--tr-sender-footer-gap-small8px
--tr-sender-header-padding-small12px 16px
--tr-sender-multi-main-padding-small14px 16px 10px
--tr-sender-footer-padding-small0 10px 10px
--tr-sender-button-size-small28px
--tr-sender-button-size-submit-small32px
--tr-sender-prefix-padding-right-small4px
--tr-sender-actions-padding-right-small8px

Suggestion

变量名说明默认值
--tr-suggestion-bg-color建议弹层背景主题值
--tr-suggestion-box-shadow-color建议弹层阴影颜色主题值
--tr-suggestion-text-color建议文字颜色主题值
--tr-suggestion-hover-bg-color建议项悬停背景主题值
--tr-suggestion-scrollbar-thumb-color滚动条滑块颜色主题值
--tr-suggestion-scrollbar-thumb-hover-color滚动条滑块悬停颜色主题值
--tr-suggestion-item-font-size建议项字号14px
--tr-suggestion-item-icon-size建议项图标尺寸16px
--tr-suggestion-autocomplete-color自动补全文字颜色主题值
--tr-suggestion-tab-hint-borderTab 提示边框主题值
--tr-suggestion-tab-hint-colorTab 提示文字颜色主题值
--tr-suggestion-tab-hint-bgTab 提示背景主题值

Mention

变量名说明默认值
--tr-sender-mention-colorMention 节点文字颜色主题值
--tr-sender-mention-bgMention 节点背景主题值
--tr-sender-mention-hover-bgMention 节点悬停背景主题值
--tr-sender-mention-list-bgMention 列表背景主题值
--tr-sender-mention-list-shadowMention 列表阴影主题值
--tr-sender-mention-text-primaryMention 列表主要文字颜色主题值
--tr-sender-mention-text-secondaryMention 列表次要文字颜色主题值
--tr-sender-mention-text-tertiaryMention 列表辅助文字颜色主题值
--tr-sender-mention-item-hover-bgMention 条目悬停背景主题值
--tr-sender-mention-item-selected-bgMention 条目选中背景主题值
--tr-sender-mention-scrollbar-thumbMention 滚动条滑块颜色主题值
--tr-sender-mention-scrollbar-thumb-hoverMention 滚动条滑块悬停颜色主题值
--tr-sender-mention-trigger-bg触发字符背景主题值

Template

变量名说明默认值
--tr-sender-template-color可编辑模板块文字颜色主题值
--tr-sender-template-bg可编辑模板块背景主题值
--tr-sender-template-border-radius可编辑模板块圆角6px
--tr-sender-template-padding可编辑模板块内边距2px 4px
--tr-sender-template-margin可编辑模板块外边距0 4px
--tr-sender-template-min-width可编辑模板块最小宽度32px
--tr-sender-template-select-color模板选择器文字颜色主题值
--tr-sender-template-select-placeholder-color模板选择器占位文字颜色主题值
--tr-sender-template-select-bg模板选择器背景主题值
--tr-sender-template-select-bg-hover模板选择器悬停背景主题值
--tr-sender-template-select-bg-active模板选择器激活背景主题值
--tr-sender-template-select-dropdown-bg模板下拉菜单背景主题值
--tr-sender-template-select-dropdown-shadow模板下拉菜单阴影主题值
--tr-sender-template-select-text-primary模板下拉菜单主要文字颜色主题值
--tr-sender-template-select-text-secondary模板下拉菜单次要文字颜色主题值
--tr-sender-template-select-option-hover-bg模板选项悬停背景主题值
--tr-sender-template-select-option-selected-bg模板选项选中背景主题值
--tr-sender-template-select-scrollbar-thumb模板下拉菜单滚动条颜色主题值
--tr-sender-template-select-scrollbar-thumb-hover模板下拉菜单滚动条悬停颜色主题值

迁移与弃用 ​

从 v0.3.x 升级时,请查看 v0.4 Sender 迁移指南。指南分别说明通过 SenderCompat 快速过渡,以及直接迁移到当前 Sender API 的做法。

has-external-content 在 v1.0 中仍保留兼容,但不推荐新代码继续使用。它只能让空文本进入可提交状态,不会生成 externalPayloads;请改用 useSenderContentRegistration,或将 TrAttachments 放在 TrSender 内自动注册附件内容。