@tencentcloud/sdk-mcp 1.0.9 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/resource/doc/chatuikit/faq/vue_qa.md +0 -344
- package/resource/doc/chatuikit/react/create-group.md +1 -1
- package/resource/doc/chatuikit/vue/components/chat.md +5 -0
- package/resource/doc/chatuikit/vue/components/chatheader.md +3 -1
- package/resource/doc/chatuikit/vue/components/conversation-list.md +3 -0
- package/resource/doc/chatuikit/vue/components/message-input.md +4 -0
- package/resource/doc/chatuikit/vue/create-group.md +1 -1
- package/resource/doc/chatuikit/vue/init.md +35 -0
- package/resource/doc/chatuikit/vue/integration.md +7 -1
- package/resource/doc/livekit/vue/components/barrage.md +615 -0
- package/resource/doc/livekit/vue/components/chat-barrage.md +615 -0
- package/resource/doc/livekit/vue/components/live-list.md +227 -0
- package/resource/doc/livekit/vue/components/live-player.md +374 -0
- package/resource/doc/livekit/vue/components/live-view.md +427 -0
- package/resource/doc/roomkit/states/device-state.md +316 -0
- package/resource/doc/roomkit/states/login-state.md +51 -0
- package/resource/doc/roomkit/states/room-list-state.md +287 -0
- package/resource/doc/roomkit/states/room-participant-state.md +307 -0
- package/tools/chat/get-web-chat-component-detail.js +0 -1
- package/tools/chat/get-web-chat-component-detail.js.map +1 -1
- package/tools/chat/get-web-chat-integration.js +1 -1
- package/tools/chat/get-web-chat-integration.js.map +1 -1
- package/tools/chat/{get-web-chat-uikit-login.js → get-web-chat-uikit-init.js} +5 -5
- package/tools/chat/get-web-chat-uikit-init.js.map +1 -0
- package/tools/common/present-framework-choice.js +1 -1
- package/tools/common/present-framework-choice.js.map +1 -1
- package/tools/common/record-prompt.js +0 -1
- package/tools/common/record-prompt.js.map +1 -1
- package/tools/index.js +12 -4
- package/tools/index.js.map +1 -1
- package/tools/live/get-web-live-component-detail.js +35 -0
- package/tools/live/get-web-live-component-detail.js.map +1 -0
- package/tools/room/get-web-room-state-detail.js +33 -0
- package/tools/room/get-web-room-state-detail.js.map +1 -0
- package/utils/handle-component-name.js +8 -2
- package/utils/handle-component-name.js.map +1 -1
- package/resource/doc/chatuikit/vue/components/MessageInput.md +0 -546
- package/resource/doc/chatuikit/vue/components/login.md +0 -29
- package/resource/doc/chatuikit/vue/login.md +0 -29
- package/resource/doc/chatuikit/vue3/components/MessageInput.md +0 -546
- package/resource/doc/chatuikit/vue3/components/MessageList.md +0 -385
- package/resource/doc/chatuikit/vue3/components/avatar.md +0 -105
- package/resource/doc/chatuikit/vue3/components/chatheader.md +0 -153
- package/resource/doc/chatuikit/vue3/components/component-list.md +0 -88
- package/resource/doc/chatuikit/vue3/components/userpicker.md +0 -256
- package/resource/doc/chatuikit/vue3/integration.md +0 -218
- package/tools/call/get-native-call-integration-guide.js +0 -35
- package/tools/call/get-native-call-integration-guide.js.map +0 -1
- package/tools/call/get-web-call-integration-guide.js +0 -34
- package/tools/call/get-web-call-integration-guide.js.map +0 -1
- package/tools/chat/auto-create-group.js +0 -44
- package/tools/chat/auto-create-group.js.map +0 -1
- package/tools/chat/get-native-chat-integration-guide.js +0 -33
- package/tools/chat/get-native-chat-integration-guide.js.map +0 -1
- package/tools/chat/get-web-chat-integration-guide.js +0 -42
- package/tools/chat/get-web-chat-integration-guide.js.map +0 -1
- package/tools/chat/get-web-chat-uikit-login.js.map +0 -1
|
@@ -1,546 +0,0 @@
|
|
|
1
|
-
## 概述
|
|
2
|
-
|
|
3
|
-
MessageInput 是一个功能完整的消息输入组件,专为 Vue3 应用设计,提供了文本编辑、表情选择、文件附件、发送按钮等核心聊天输入功能。该组件支持丰富的自定义选项,包括输入行为配置、工具栏定制、组件替换和插槽扩展,能够满足不同聊天场景的个性化需求。
|
|
4
|
-
|
|
5
|
-
## 基础用法
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
<script>
|
|
9
|
-
import { MessageInput } from "@tencentcloud/chat-uikit-vue3";
|
|
10
|
-
</script>
|
|
11
|
-
|
|
12
|
-
<template>
|
|
13
|
-
<MessageInput />
|
|
14
|
-
</template>
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Props 配置
|
|
18
|
-
|
|
19
|
-
| 字段 | 类型 | 默认值 | 描述 |
|
|
20
|
-
|------|------|--------|------|
|
|
21
|
-
| autoFocus | boolean | true | 是否自动聚焦到输入框 |
|
|
22
|
-
| disabled | boolean | false | 是否禁用输入组件 |
|
|
23
|
-
| hideSendButton | boolean | false | 是否隐藏发送按钮 |
|
|
24
|
-
| placeholder | string | '' | 输入框占位符文本 |
|
|
25
|
-
| attachmentPickerMode | 'collapsed' \| 'expanded' | 'collapsed' | 附件选择器显示模式 |
|
|
26
|
-
| actions | MessageInputActions | ['EmojiPicker', 'ImagePicker', 'FilePicker', 'VideoPicker'] | 工具栏操作按钮配置 |
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
## Slots 配置
|
|
30
|
-
|
|
31
|
-
| 字段 | 类型 | 默认值 | 描述 |
|
|
32
|
-
|------|------|--------|------|
|
|
33
|
-
| headerToolbar | () => VNode[] | undefined | 头部工具栏插槽 |
|
|
34
|
-
| footerToolbar | () => VNode[] | undefined | 底部工具栏插槽 |
|
|
35
|
-
| leftInline | () => VNode[] | undefined | 左侧内联插槽 |
|
|
36
|
-
| rightInline | () => VNode[] | undefined | 右侧内联插槽 |
|
|
37
|
-
| inputPrefix | () => VNode[] | undefined | 输入框前缀插槽 |
|
|
38
|
-
| inputSuffix | () => VNode[] | undefined | 输入框后缀插槽 |
|
|
39
|
-
| TextEditor | Component \| null | null | 自定义文本编辑器组件配置 |
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
### 类型定义
|
|
43
|
-
``` typescript
|
|
44
|
-
type BuiltInAction =
|
|
45
|
-
| 'EmojiPicker'
|
|
46
|
-
| 'ImagePicker'
|
|
47
|
-
| 'FilePicker'
|
|
48
|
-
| 'VideoPicker'
|
|
49
|
-
| 'AttachmentPicker';
|
|
50
|
-
|
|
51
|
-
export type CustomAction = {
|
|
52
|
-
key: string;
|
|
53
|
-
label?: string | undefined;
|
|
54
|
-
component?: Component | undefined;
|
|
55
|
-
className?: string | undefined;
|
|
56
|
-
style?: CSSProperties | undefined;
|
|
57
|
-
iconSize?: number | undefined;
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export type MessageInputActions = Array<BuiltInAction | CustomAction>;
|
|
61
|
-
|
|
62
|
-
export type MessageInputAttachmentPickerMode = 'collapsed' | 'expanded';
|
|
63
|
-
|
|
64
|
-
export interface MessageInputSlots {
|
|
65
|
-
headerToolbar?: () => VNode[];
|
|
66
|
-
footerToolbar?: () => VNode[];
|
|
67
|
-
leftInline?: () => VNode[];
|
|
68
|
-
rightInline?: () => VNode[];
|
|
69
|
-
inputPrefix?: () => VNode[];
|
|
70
|
-
inputSuffix?: () => VNode[];
|
|
71
|
-
textEditor?: () => VNode[];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// MessageInputProps 接口定义
|
|
75
|
-
export interface MessageInputProps {
|
|
76
|
-
autoFocus?: boolean;
|
|
77
|
-
disabled?: boolean;
|
|
78
|
-
hideSendButton?: boolean;
|
|
79
|
-
placeholder?: string;
|
|
80
|
-
attachmentPickerMode?: MessageInputAttachmentPickerMode;
|
|
81
|
-
actions?: MessageInputActions;
|
|
82
|
-
slots?: MessageInputSlots;
|
|
83
|
-
TextEditor?: Component | null;
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## 自定义功能详解
|
|
88
|
-
|
|
89
|
-
### autoFocus
|
|
90
|
-
- 类型:boolean
|
|
91
|
-
|
|
92
|
-
- 详细说明:autoFocus 用于设置是否在组件挂载时自动聚焦到输入框,默认值为 `true`。
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
### disabled
|
|
96
|
-
- 类型:boolean
|
|
97
|
-
|
|
98
|
-
- 详细说明:disabled 用于设置是否禁用整个输入组件,包括文本输入和所有操作按钮,默认值为 `false`。
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
### hideSendButton
|
|
102
|
-
- 类型:boolean
|
|
103
|
-
|
|
104
|
-
- 详细说明:hideSendButton 用于设置是否隐藏发送按钮,适用于需要自定义发送触发方式的场景,默认值为 `false`。
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
### placeholder
|
|
108
|
-
- 类型:string
|
|
109
|
-
|
|
110
|
-
- 详细说明:placeholder 用于设置输入框的占位符文本,默认值为空字符串。
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
### attachmentPickerMode
|
|
114
|
-
- 类型:'collapsed' | 'expanded'
|
|
115
|
-
|
|
116
|
-
- 详细说明:attachmentPickerMode 用于设置附件选择器的显示模式,默认值为 `'collapsed'`。
|
|
117
|
-
|
|
118
|
-
- **collapsed**:收起模式,点击后展开选项。
|
|
119
|
-
|
|
120
|
-
- **expanded**:展开模式,直接显示所有选项。
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
### actions
|
|
124
|
-
- 类型:MessageInputActions
|
|
125
|
-
|
|
126
|
-
- 详细说明:actions 用于配置工具栏中显示的操作按钮,默认值为 `['EmojiPicker', 'ImagePicker', 'FilePicker', 'VideoPicker']`。
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
#### 示例1:自定义工具栏按钮顺序
|
|
130
|
-
``` typescript
|
|
131
|
-
<template>
|
|
132
|
-
<MessageInput :actions="customActions" />
|
|
133
|
-
</template>
|
|
134
|
-
|
|
135
|
-
<script lang="ts" setup>
|
|
136
|
-
import { MessageInput } from '@tencentcloud/uikit-component-vue3';
|
|
137
|
-
|
|
138
|
-
// 自定义按钮顺序:文件、图片、视频、表情
|
|
139
|
-
const customActions = ['FilePicker', 'ImagePicker', 'VideoPicker', 'EmojiPicker'];
|
|
140
|
-
</script>
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
#### 示例2:添加自定义操作按钮
|
|
144
|
-
``` typescript
|
|
145
|
-
<template>
|
|
146
|
-
<MessageInput :actions="customActions" />
|
|
147
|
-
</template>
|
|
148
|
-
|
|
149
|
-
<script lang="ts" setup>
|
|
150
|
-
import { defineComponent, h } from 'vue';
|
|
151
|
-
import { MessageInput } from '@tencentcloud/uikit-component-vue3';
|
|
152
|
-
|
|
153
|
-
// 自定义位置分享按钮组件
|
|
154
|
-
const LocationPicker = defineComponent({
|
|
155
|
-
name: 'LocationPicker',
|
|
156
|
-
setup() {
|
|
157
|
-
const handleLocationShare = () => {
|
|
158
|
-
// 获取用户位置并发送
|
|
159
|
-
if (navigator.geolocation) {
|
|
160
|
-
navigator.geolocation.getCurrentPosition((position) => {
|
|
161
|
-
const { latitude, longitude } = position.coords;
|
|
162
|
-
console.log(`分享位置: ${latitude}, ${longitude}`);
|
|
163
|
-
alert(`分享位置: ${latitude}, ${longitude}`); // For demonstration
|
|
164
|
-
});
|
|
165
|
-
} else {
|
|
166
|
-
alert('浏览器不支持地理定位。');
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
return () =>
|
|
171
|
-
h('button',
|
|
172
|
-
{
|
|
173
|
-
onClick: handleLocationShare,
|
|
174
|
-
style: { padding: '4px 8px', border: 'none', background: 'transparent' },
|
|
175
|
-
title: '分享位置',
|
|
176
|
-
},
|
|
177
|
-
'📍',
|
|
178
|
-
);
|
|
179
|
-
},
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
const customActions = [
|
|
183
|
-
'EmojiPicker',
|
|
184
|
-
'ImagePicker',
|
|
185
|
-
{
|
|
186
|
-
key: 'location',
|
|
187
|
-
label: 'Location',
|
|
188
|
-
component: LocationPicker,
|
|
189
|
-
},
|
|
190
|
-
'AttachmentPicker',
|
|
191
|
-
];
|
|
192
|
-
</script>
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
#### 示例3:客服系统快捷回复
|
|
196
|
-
``` typescript
|
|
197
|
-
<template>
|
|
198
|
-
<MessageInput :actions="actions" />
|
|
199
|
-
</template>
|
|
200
|
-
|
|
201
|
-
<script lang="ts" setup>
|
|
202
|
-
import { defineComponent, h, ref } from 'vue';
|
|
203
|
-
import { MessageInput } from '@tencentcloud/uikit-component-vue3';
|
|
204
|
-
import { useMessageInputState } from '@tencentcloud/uikit-component-vue3/src/states/MessageInputState';
|
|
205
|
-
|
|
206
|
-
// 快捷回复组件
|
|
207
|
-
const QuickReplyPicker = defineComponent({
|
|
208
|
-
name: 'QuickReplyPicker',
|
|
209
|
-
setup() {
|
|
210
|
-
const { setContent } = useMessageInputState();
|
|
211
|
-
const showPicker = ref(false);
|
|
212
|
-
|
|
213
|
-
const quickReplies = [
|
|
214
|
-
'您好,很高兴为您服务!',
|
|
215
|
-
'请稍等,我来为您查询...',
|
|
216
|
-
'感谢您的咨询,还有其他问题吗?',
|
|
217
|
-
'问题已为您解决,祝您生活愉快!',
|
|
218
|
-
];
|
|
219
|
-
|
|
220
|
-
const handleQuickReply = (text: string) => {
|
|
221
|
-
setContent(text);
|
|
222
|
-
showPicker.value = false;
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
return () =>
|
|
226
|
-
h('div', { style: { position: 'relative' } }, [
|
|
227
|
-
h('button',
|
|
228
|
-
{
|
|
229
|
-
title: '快捷回复',
|
|
230
|
-
onClick: () => (showPicker.value = !showPicker.value),
|
|
231
|
-
},
|
|
232
|
-
'⚡',
|
|
233
|
-
),
|
|
234
|
-
showPicker.value &&
|
|
235
|
-
h('div',
|
|
236
|
-
{
|
|
237
|
-
style: {
|
|
238
|
-
position: 'absolute',
|
|
239
|
-
bottom: '100%',
|
|
240
|
-
left: 0,
|
|
241
|
-
background: 'white',
|
|
242
|
-
border: '1px solid #ccc',
|
|
243
|
-
borderRadius: '4px',
|
|
244
|
-
padding: '8px',
|
|
245
|
-
minWidth: '200px',
|
|
246
|
-
zIndex: 100, // Ensure it's above other elements
|
|
247
|
-
},
|
|
248
|
-
},
|
|
249
|
-
quickReplies.map((reply, index) =>
|
|
250
|
-
h('div',
|
|
251
|
-
{
|
|
252
|
-
key: index,
|
|
253
|
-
onClick: () => handleQuickReply(reply),
|
|
254
|
-
style: {
|
|
255
|
-
padding: '4px 8px',
|
|
256
|
-
cursor: 'pointer',
|
|
257
|
-
borderRadius: '2px',
|
|
258
|
-
'&:hover': { backgroundColor: '#f0f0f0' },
|
|
259
|
-
},
|
|
260
|
-
},
|
|
261
|
-
reply,
|
|
262
|
-
),
|
|
263
|
-
),
|
|
264
|
-
),
|
|
265
|
-
]);
|
|
266
|
-
},
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
const actions = [
|
|
270
|
-
{
|
|
271
|
-
key: 'quickReply',
|
|
272
|
-
label: '快捷回复',
|
|
273
|
-
component: QuickReplyPicker,
|
|
274
|
-
},
|
|
275
|
-
'EmojiPicker',
|
|
276
|
-
'FilePicker',
|
|
277
|
-
];
|
|
278
|
-
</script>
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
#### 示例4:自定义表情面板
|
|
283
|
-
``` typescript
|
|
284
|
-
<template>
|
|
285
|
-
<MessageInput :EmojiPicker="CustomEmojiPicker" />
|
|
286
|
-
</template>
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
<script lang="ts" setup>
|
|
290
|
-
import { defineComponent, h, ref } from 'vue';
|
|
291
|
-
import { MessageInput } from '@tencentcloud/uikit-component-vue3';
|
|
292
|
-
import { useMessageInputState } from '@tencentcloud/uikit-component-vue3/src/states/MessageInputState';
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const CustomEmojiPicker = defineComponent({
|
|
296
|
-
name: 'CustomEmojiPicker',
|
|
297
|
-
setup() {
|
|
298
|
-
const { insertContent } = useMessageInputState();
|
|
299
|
-
const showPicker = ref(false);
|
|
300
|
-
const activeCategory = ref('common');
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
const emojiCategories = {
|
|
304
|
-
'common': ['😀', '😂', '🥰', '😍', '🤔', '😭', '😡', '👍'],
|
|
305
|
-
'hand': ['👋', '🤝', '👏', '🙏', '✌️', '🤞', '🤟', '👌'],
|
|
306
|
-
'animal': ['🐶', '🐱', '🐭', '🐹', '🐰', '🦊', '🐻', '🐼'],
|
|
307
|
-
};
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const insertEmoji = (emoji: string) => {
|
|
311
|
-
insertContent(emoji);
|
|
312
|
-
showPicker.value = false;
|
|
313
|
-
};
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
return () =>
|
|
317
|
-
h('div', { style: { position: 'relative' } }, [
|
|
318
|
-
h('button',
|
|
319
|
-
{
|
|
320
|
-
onClick: () => (showPicker.value = !showPicker.value),
|
|
321
|
-
style: { border: 'none', background: 'transparent', cursor: 'pointer' },
|
|
322
|
-
},
|
|
323
|
-
'😊',
|
|
324
|
-
),
|
|
325
|
-
showPicker.value &&
|
|
326
|
-
h('div',
|
|
327
|
-
{
|
|
328
|
-
style: {
|
|
329
|
-
position: 'absolute',
|
|
330
|
-
bottom: '100%',
|
|
331
|
-
left: 0,
|
|
332
|
-
background: 'white',
|
|
333
|
-
border: '1px solid #ccc',
|
|
334
|
-
borderRadius: '8px',
|
|
335
|
-
padding: '12px',
|
|
336
|
-
width: '280px',
|
|
337
|
-
boxShadow: '0 4px 12px rgba(0,0,0,0.1)',
|
|
338
|
-
zIndex: 100, // Ensure it's above other elements
|
|
339
|
-
},
|
|
340
|
-
},
|
|
341
|
-
[
|
|
342
|
-
// 分类标签
|
|
343
|
-
h('div', { style: { display: 'flex', marginBottom: '8px' } },
|
|
344
|
-
Object.keys(emojiCategories).map((category) =>
|
|
345
|
-
h('button',
|
|
346
|
-
{
|
|
347
|
-
key: category,
|
|
348
|
-
onClick: () => (activeCategory.value = category),
|
|
349
|
-
style: {
|
|
350
|
-
padding: '4px 8px',
|
|
351
|
-
border: 'none',
|
|
352
|
-
background: activeCategory.value === category ? '#1890ff' : 'transparent',
|
|
353
|
-
color: activeCategory.value === category ? 'white' : '#666',
|
|
354
|
-
borderRadius: '4px',
|
|
355
|
-
cursor: 'pointer',
|
|
356
|
-
fontSize: '12px',
|
|
357
|
-
},
|
|
358
|
-
},
|
|
359
|
-
category,
|
|
360
|
-
),
|
|
361
|
-
),
|
|
362
|
-
),
|
|
363
|
-
// 表情网格
|
|
364
|
-
h('div',
|
|
365
|
-
{
|
|
366
|
-
style: {
|
|
367
|
-
display: 'grid',
|
|
368
|
-
gridTemplateColumns: 'repeat(8, 1fr)',
|
|
369
|
-
gap: '4px',
|
|
370
|
-
},
|
|
371
|
-
},
|
|
372
|
-
emojiCategories[activeCategory.value].map((emoji) =>
|
|
373
|
-
h('button',
|
|
374
|
-
{
|
|
375
|
-
key: emoji,
|
|
376
|
-
onClick: () => insertEmoji(emoji),
|
|
377
|
-
style: {
|
|
378
|
-
border: 'none',
|
|
379
|
-
background: 'transparent',
|
|
380
|
-
fontSize: '20px',
|
|
381
|
-
cursor: 'pointer',
|
|
382
|
-
padding: '4px',
|
|
383
|
-
borderRadius: '4px',
|
|
384
|
-
},
|
|
385
|
-
},
|
|
386
|
-
emoji,
|
|
387
|
-
),
|
|
388
|
-
),
|
|
389
|
-
),
|
|
390
|
-
],
|
|
391
|
-
),
|
|
392
|
-
]);
|
|
393
|
-
},
|
|
394
|
-
});
|
|
395
|
-
</script>
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
## Slots 详解
|
|
399
|
-
- 类型:MessageInputSlots
|
|
400
|
-
|
|
401
|
-
- 详细说明:用于在输入组件的特定位置插入自定义内容。
|
|
402
|
-
|
|
403
|
-
``` typescript
|
|
404
|
-
interface MessageInputSlots {
|
|
405
|
-
headerToolbar?: () => VNode[];
|
|
406
|
-
footerToolbar?: () => VNode[];
|
|
407
|
-
leftInline?: () => VNode[];
|
|
408
|
-
rightInline?: () => VNode[];
|
|
409
|
-
inputPrefix?: () => VNode[];
|
|
410
|
-
inputSuffix?: () => VNode[];
|
|
411
|
-
textEditor?: () => VNode[];
|
|
412
|
-
}
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
#### 示例1:自定义 footerToolbar 插槽
|
|
417
|
-
``` typescript
|
|
418
|
-
<template>
|
|
419
|
-
<MessageInput>
|
|
420
|
-
<template #footerToolbar>
|
|
421
|
-
<div style="padding: 4px 12px; font-size: 12px; color: #999; text-align: right;">
|
|
422
|
-
press Ctrl+Enter to wrap
|
|
423
|
-
</div>
|
|
424
|
-
</template>
|
|
425
|
-
</MessageInput>
|
|
426
|
-
</template>
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
#### 示例2:输入框前后缀功能
|
|
431
|
-
``` typescript
|
|
432
|
-
<template>
|
|
433
|
-
<MessageInput>
|
|
434
|
-
<template #inputPrefix>
|
|
435
|
-
|
|
436
|
-
</template>
|
|
437
|
-
<template #inputSuffix>
|
|
438
|
-
<button
|
|
439
|
-
style="border: none; background: transparent; cursor: pointer;"
|
|
440
|
-
@click="handleVoiceInput"
|
|
441
|
-
>
|
|
442
|
-
🎤
|
|
443
|
-
</button>
|
|
444
|
-
</template>
|
|
445
|
-
</MessageInput>
|
|
446
|
-
</template>
|
|
447
|
-
|
|
448
|
-
<script lang="ts" setup>
|
|
449
|
-
import { MessageInput } from '@tencentcloud/uikit-component-vue3';
|
|
450
|
-
|
|
451
|
-
const handleAtUser = () => {
|
|
452
|
-
// 触发@用户选择
|
|
453
|
-
console.log('打开@用户选择');
|
|
454
|
-
};
|
|
455
|
-
|
|
456
|
-
const handleVoiceInput = () => {
|
|
457
|
-
// 开始语音输入
|
|
458
|
-
console.log('开始语音输入');
|
|
459
|
-
};
|
|
460
|
-
</script>
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
### TextEditor
|
|
465
|
-
|
|
466
|
-
类型:Component | null
|
|
467
|
-
|
|
468
|
-
详细说明:TextEditor 用于替换默认的文本编辑器组件,默认值为 `null`。
|
|
469
|
-
|
|
470
|
-
#### 示例:自定义文本编辑器
|
|
471
|
-
``` typescript
|
|
472
|
-
<template>
|
|
473
|
-
<MessageInput>
|
|
474
|
-
<template #textEditor>
|
|
475
|
-
<RichTextEditor />
|
|
476
|
-
</template>
|
|
477
|
-
</MessageInput>
|
|
478
|
-
</template>
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
<script lang="ts" setup>
|
|
482
|
-
import { defineComponent, h, ref, onMounted } from 'vue';
|
|
483
|
-
import { MessageInput } from '@tencentcloud/uikit-component-vue3';
|
|
484
|
-
import { useMessageInputState } from '@tencentcloud/uikit-component-vue3/src/states/MessageInputState';
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
const RichTextEditor = defineComponent({
|
|
488
|
-
name: 'RichTextEditor',
|
|
489
|
-
setup() {
|
|
490
|
-
const { sendMessage } = useMessageInputState();
|
|
491
|
-
const editorRef = ref<HTMLDivElement | null>(null);
|
|
492
|
-
const inputRawValue = ref('');
|
|
493
|
-
|
|
494
|
-
const handleInput = (e: Event) => {
|
|
495
|
-
const target = e.target as HTMLDivElement;
|
|
496
|
-
inputRawValue.value = (e.target as HTMLDivElement).textContent || '';
|
|
497
|
-
};
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
const handleKeyDown = (e: KeyboardEvent) => {
|
|
501
|
-
if (e.key === 'Enter') {
|
|
502
|
-
sendMessage(inputRawValue.value);
|
|
503
|
-
if (editorRef.value) {
|
|
504
|
-
editorRef.value.textContent = '';
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
};
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
onMounted(() => {
|
|
511
|
-
if (editorRef.value) {
|
|
512
|
-
editorRef.value.textContent = inputRawValue.value || '';
|
|
513
|
-
}
|
|
514
|
-
});
|
|
515
|
-
|
|
516
|
-
return () =>
|
|
517
|
-
h('div',
|
|
518
|
-
{
|
|
519
|
-
style: {
|
|
520
|
-
flex: 1,
|
|
521
|
-
border: '1px solid #d9d9d9',
|
|
522
|
-
borderRadius: '6px',
|
|
523
|
-
padding: '8px 12px',
|
|
524
|
-
minHeight: '32px',
|
|
525
|
-
maxHeight: '120px',
|
|
526
|
-
overflow: 'auto',
|
|
527
|
-
},
|
|
528
|
-
},
|
|
529
|
-
h('div',
|
|
530
|
-
{
|
|
531
|
-
ref: editorRef,
|
|
532
|
-
contentEditable: true,
|
|
533
|
-
style: {
|
|
534
|
-
outline: 'none',
|
|
535
|
-
minHeight: '20px',
|
|
536
|
-
lineHeight: '20px',
|
|
537
|
-
},
|
|
538
|
-
onInput: handleInput,
|
|
539
|
-
onKeydown: handleKeyDown,
|
|
540
|
-
},
|
|
541
|
-
),
|
|
542
|
-
);
|
|
543
|
-
},
|
|
544
|
-
});
|
|
545
|
-
</script>
|
|
546
|
-
```
|