Skip to content

Sender 输入框 💭

📌 注意

1.1.6 版本 新增

  • 变体 上下结构
  • 自定义底部 #footer 插槽
  • 自定义指令 弹框 和 触发指令的 回调事件

🐵 此温馨提示更新时间:2025-04-16

💔 危险

1.0.81 版本 ,以及更早版本。使用 v-model:value 绑定是有响应式问题的,请升级最新版本。

最新版本写法,直接使用 v-model 进行双向绑定。

此警告更新时间:2025-04-06

介绍

Sender 是用于聊天的输入框组件。具备丰富的交互功能和自定义特性。它支持语音输入、清空输入内容、多种提交方式,并且允许用户自定义头部、前缀和操作列表等内容。同时,组件提供了焦点控制、提交回调等功能,可满足多样化的输入场景需求。

代码演示

基础用法

这是一个Sender 输入框,最简答的使用例子,

提示语

可以通过 placeholder 设置输入框的提示语。

双向绑定(未绑定,值不会变)

可以通过 v-model 绑定组件的 value 属性。

📌 注意

  • 在提交时,需要有内容,才会进行提交。
  • 内容为空时,提交按钮会被禁用,且使用组件实例提交会失效。

💌 消息

  • 通过 v-model 属性,可以自动绑定输入框的值。不用赋值数据到 v-model 中。
  • 通过 @submit 事件,可以触发输入框的提交事件,回传一个 value 参数,你可以在此处理提交的数据。
  • 通过 @cancel 事件,可以触发 loading 按钮的点击事件。在这里你可以中止提交的操作。

你也可以通过组件 ref 实例对象进行调用

  • senderRef.value.submit() 触发提交
  • senderRef.value.cancel() 触发取消
  • senderRef.value.clear() 重置输入框的值

提交按钮禁用状态

可以通过 submit-btn-disabled 自定义 是否让发送按钮禁用。当禁用时,组件实例的 submit 方法将失效。

📌 注意

组件内置的 发送按钮,是更据 v-model 绑定的,所以,当 v-model 绑定的值为空时,发送按钮将处于禁用状态。

但是,有这么一个场景。用户通过上传了文件,但是没有输入内容,此时,发送按钮依然处于禁用状态。 所以,为了 禁用逻辑的解耦,组件提供了 submit-btn-disabled 属性,用于自主控制发送按钮的禁用状态。

自定义 #action-list 时,此属性对 submit 事件同样生效。

自定义最大行数和最小行数

可以通过 autosize 设置输入框的最小展示行数和最大展示行数。 autosize 是一个对象 默认值为 { minRows: 1, maxRows: 6 }。超出最大行数时,输入框会自动出现滚动条。

输入框组件各种状态

可以通过简单属性是,实现组件的状态

💌 消息

  • 通过 loading 属性,可以控制输入框是否加载中。
  • 通过 readOnly 属性,可以控制输入框是否可编辑。
  • 通过 disabled 属性,可以控制输入框是否禁用。
  • 通过 clearable 属性,可以控制输入框是否出现删除按钮,实现清空。
  • 通过 inputWidth 属性,可以控制输入框的宽度。默认为 100%

提交方式

通过 submitType 控制换行与提交模式。默认 'enter'。即 回车提交,'shift + Enter' 换行。

💌 消息

  • submitType='enter' 设置 回车提交,'shift + Enter' 换行。
  • submitType='shiftEnter' 设置 'shift + Enter' 提交,回车换行。

语音识别

📌 注意

浏览器内置语音识别 API,可以使用组件库内置的 useRecord hooks 更方便内置语音识别集成和控制

内置 语音识别 功能,通过 allowSpeech 属性开启即可。调用浏览器原生的语音识别 API,在 谷歌浏览器 中使用,需要在 🪄魔法环境 中才能正常使用。

💌 消息

如果你不想使用内置的 语音识别 功能,可以通过 @recording-change 事件来监听录音状态,自行实现语音识别功能。

你也可以通过组件 ref 实例对象进行调用

  • senderRef.value.startRecognition() 触发开始录音
  • senderRef.value.stopRecognition() 触发结束录音

变体-垂直样式

通过 variant 属性设置输入框的变体。默认 'default' | 上下结构 'updown'

这个属性,将左右结构的 输入框,变成 上下结构的 输入框。上面为 输入框,下面为 内置的 前缀和操作列表栏

自定义操作列表

📌 注意

1.0.81 版本前,在自定义插槽的时候,会牺牲内置的操作按钮。我们在 1.0.81 版本 推出了流式请求的 hooks,可以让用户更好的控制流式请求,从而更好的自己定义 #action-list 插槽。详情请查看 useXStream

此温馨提示更新时间:2025-04-06

通过 #action-list 插槽用于自定义输入框的操作列表内容。

💌 消息

当你使用 #action-list 插槽时,会隐藏内置的输入框的操作按钮。你可以通过和 组件实例方法 相结合,实现更丰富的操作。

自定义前缀

通过 #prefix 插槽用于自定义输入框的前缀内容。

自定义头部

通过 #header 插槽用于自定义输入框的头部内容。

💌 消息

通过组件实例控制 头部容器 展开收起

  • senderRef.value.openHeader() 打开头部容器
  • senderRef.value.closeHeader() 关闭头部容器

自定义底部

自定义输入框样式

通过 input-style 方便对输入框的样式透传

触发指令

输入框,内置指令弹框,方便调用指令操作

💌 消息

  • 通过 triggerStrings 属性,设置 指令触发字符,类型一个 字符数组 ['/', '@']
  • 通过 v-model 绑定 triggerPopoverVisible 属性,控制指令弹框是否可见

v-model:trigger-popover-visible="triggerVisible"

  • 通过 triggerPopoverWidth 属性,设置指令弹框宽度 默认 'fit-content'
  • 通过 triggerPopoverLeft 属性,设置指令弹框距离左侧距离 默认 '0px'
  • 通过 triggerPopoverOffset 属性,设置指令弹框和输入框的距离 默认 8
  • 通过 triggerPopoverPlacement 属性,设置指令弹框弹出位置 同 el-popover 的 placement 属性一致,默认 'top-start'

取值 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end'

  • @trigger 设置指令弹框显示隐藏发生改变的回调方法

💡 提示

  • @trigger 当你要在指令被触发的时候做某些事,但是不想要内置的弹框样式时,可以不用 v-model:trigger-popover-visible="triggerVisible",这样 内置弹框 就不会出现

输入框聚焦控制

通过 ref 选项控制聚焦。

💌 消息

通过组件实例控制

  • senderRef.value.focus('all') 聚焦到整个文本 (默认)
  • senderRef.value.focus('start') 聚焦到文本最前方
  • senderRef.value.focus('end') 聚焦到文本最后方
  • senderRef.value.blur() 失去焦点

属性

属性名类型是否必填默认值说明
v-modelString''输入框的绑定值,使用 v-model 进行双向绑定。
placeholderString''输入框的提示语文本。
auto-sizeObject{ minRows:1, maxRows:6 }设置输入框的最小展示行数和最大展示行数。
read-onlyBooleanfalse输入框是否为只读状态。
disabledBooleanfalse输入框是否为禁用状态。
submitBtnDisabledBoolean | undefinedundefined内置发送按钮禁用状态。(注意使用场景)
loadingBooleanfalse是否显示加载状态。为 true 时,输入框会显示加载动画。
clearableBooleanfalse输入框是否可清空内容。展示默认清空按钮
allowSpeechBooleanfalse是否允许语音输入。默认展示内置语音识别按钮,内置浏览器内置语音识别 API
submitTypeString'enter'提交方式,支持 'shiftEnter'(按 Shift + Enter 提交)。
headerAnimationTimerNumber300输入框的自定义头部显示时长,单位为 ms
inputWidthString'100%'输入框的宽度。
variantString'default'输入框的变体类型,支持 'default''updown'
showUpdownBooleantrue当变体为 updown 时,是否展示内置样式。
inputStyleObject{}输入框的样式。
triggerStringsstring[][]触发指令的 字符串数组
triggerPopoverVisibleBooleanfalse触发指令的 弹框 是否可见。需要使用 v-model:triggerPopoverVisible 进行控制。
triggerPopoverWidthString'fit-content'触发指令的 弹框 的宽度。可使用百分比等css单位。
triggerPopoverLeftString'0px'触发指令的 弹框 的左边距。可使用百分比等css单位。
triggerPopoverOffsetNumber8触发指令的 弹框 的左边距。只能是数字类型,单位px
triggerPopoverPlacementString'top-start'触发指令的 弹框 的位置。取值:'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end'

事件

事件名说明回调参数
submit内置 提交按钮 提交时触发的事件。
cancel内置 loading按钮 点击时触发的事件。
recordingChange内置语音识别状态变化时触发的事件。
trigger指令弹框发生变化时触发的事件。interface TriggerEvent{oldValue: string; newValue: string; isOpen: boolean; }

Ref 实例方法

属性名类型描述
openHeaderFunction打开输入框的自定义头部。
closeHeaderFunction关闭输入框的自定义头部。
clearFunction清空输入框的内容。
blurFunction移除输入框的焦点。
focusFunction聚焦输入框。 默认 focus('all') 聚焦整个文本,focus('start') 聚焦文本最前方,focus('end') 聚焦文本最后方。
submitFunction提交输入内容。
cancelFunction取消加载状态。
startRecognitionFunction开始语音识别。
stopRecognitionFunction停止语音识别。

插槽

插槽名参数类型描述
#header-Slot用于自定义输入框的头部内容。
#prefix-Slot用于自定义输入框的前缀内容。
#action-list-Slot用于自定义输入框的操作列表内容。
#footer-Slot用于自定义输入框的尾部内容。

功能特性

  1. 焦点控制:支持将焦点设置到文本最前方、最后方或选中整个文本,也可取消焦点。
  2. 自定义内容:提供头部、前缀、操作列表等插槽,允许用户自定义这些部分的内容。
  3. 提交功能:支持按 Shift + Enter 提交输入内容,提交后可执行自定义操作。
  4. 加载状态:可显示加载状态,模拟提交处理过程。
  5. 语音输入:支持语音输入功能,提升输入的便捷性。
  6. 清空功能:输入框可清空内容,方便用户重新输入。