跳到主要内容
新版 Web IMKit SDKWeb IMKit SDK 从 5.36.0 版本开始升级了 UI 和 SDK 结构。如果您集成的版本低于 5.36.0,请参考旧版 Web IMKit 文档。

自定义组件

Web IMKit 允许你覆盖部分公开组件,以定制消息、输入框预览等 UI。本文介绍可覆盖组件范围、registerCustomElement 的调用方式,以及 5.42.0 起需要注意的 setup 入参变化。

组件分类​

为了兼顾稳定性和定制能力,Web IMKit 将内部组件分为 Provider 组件和 Component 组件。

Component 组件为无状态组件,仅负责 UI 渲染,不负责数据管理。此类组件通过接收 props 外部输入以驱动 UI 渲染更新,但无法修改 props 数据本身。

Provider 组件为业务容器组件,内部包含响应式数据管理、交互事件分发等逻辑。此类组件是 SDK 内部实现的一部分,标签名通常以 -provider 结尾。

Web IMKit 仅允许覆盖公开的 Component 组件,用以深度定制开发。

5.42.0 破坏性变更 / 升级注意事项
  • registerCustomElement 的 setup 入参从 { value: props } 调整为直接接收 props。已覆盖组件的业务需要将 props.value.xxx 更新为 props.xxx。
  • HQ 语音消息组件 props 新增 position 字段。已覆盖该组件的业务建议适配该字段。
  • 仅建议覆盖本文列出的公开可复写组件,不要依赖 Web IMKit 内部未公开组件名、Provider 或内部 props 结构。

registerCustomElement​

Web IMKit 提供 registerCustomElement 接口,用于注册自定义组件并覆盖 SDK 内置组件。

提示
  • 该接口仅限 ready 调用前有效。
  • 由于自定义组件注册相对复杂,建议使用 TypeScript 进行业务开发,以获取更好的 IDE 语法提示支持和类型推导。
  • Web IMKit 内部使用 Vue 作为 DOM 组件渲染引擎,因此自定义组件模板语法与 Vue 模板语法一致。

为了保障 Web IMKit 迭代升级过程中的兼容性,Web IMKit 仅允许覆盖部分公开组件。

当前版本开放以下组件供业务层覆盖:

组件标签说明
RCKitOverrideAbleComponent.HQVoiceMessageComponentrc-hq-voice-messageHQ 语音消息组件。
RCKitOverrideAbleComponent.ReplyPreviewBarComponentrc-reply-preview-bar输入框回复预览栏组件。

参数说明

参数类型是否必传说明
tagRCKitOverrideAbleComponent是需要重写的组件标识,为 RCKitOverrideAbleComponent 枚举值。
optionsIRCKitDefineCustomElementOptions是组件配置。

IRCKitDefineCustomElementOptions 说明

属性类型是否必传说明
templatestring是组件模板,模板语法使用 Vue 组件模板语法。
setup(props: T, ctx: IRCKitComponentContext) => any是组件逻辑处理函数,props 为当前组件直接接收的属性对象。
stylesstring[]否组件样式表。

setup 入参升级说明​

5.42.0 起,setup 入参直接接收组件 props,不再包装在 value 字段中。升级时,请按以下规则调整:

TypeScript
// 旧写法
setup(props) {
const value = props.value;
}

// 新写法
setup(props) {
const value = props;
}

如果业务代码中仍使用 props.value.xxx 读取属性,需要改为 props.xxx。

代码示例

TypeScript
// 重写语音消息组件
kitApp.registerCustomElement(
RCKitOverrideAbleComponent.HQVoiceMessageComponent,
{
setup(props, ctx) {
return {
value: props,
position: props.position,
};
},
template: `<button @click="value.toggle()">{{ value.playing ? '暂停' : '播放' }}</button><br/>
playing: {{ value.playing }}<br/>
progress: {{ value.progress }} / 100<br/>
duration: {{ value.duration }}s<br/>
position: {{ position }}<br/>`,
}
);

回复预览栏组件​

从 5.42.0 开始,Web IMKit 支持通过 RCKitOverrideAbleComponent.ReplyPreviewBarComponent 覆盖输入框中的回复预览栏。

IRCKitReplyPreviewBarComponentProps 包含以下字段:

字段类型说明
messageIRCKitCachedMessage被回复的消息。
usernamestring被回复消息的发送者名称。
previewTextstring回复预览文案。
thumbnailstring预览缩略图地址,可选。
cancelFunction取消当前回复状态的方法。

代码示例

TypeScript
kitApp.registerCustomElement(
RCKitOverrideAbleComponent.ReplyPreviewBarComponent,
{
setup(props) {
const onCancel = () => {
props.cancel();
};

return {
message: props.message,
username: props.username,
previewText: props.previewText,
thumbnail: props.thumbnail,
onCancel,
};
},
template: `
<div class="reply-preview-bar">
<img v-if="thumbnail" :src="thumbnail" />
<span>{{ username }}:{{ previewText }}</span>
<button @click="onCancel">取消</button>
</div>
`,
}
);

复用既有组件​

Web IMKit 允许你在 template 模板中通过 <rc-origin> 标签复用被覆盖组件的原始实现。

代码示例

TypeScript
// 重写语音消息组件
kitApp.registerCustomElement(
RCKitOverrideAbleComponent.HQVoiceMessageComponent,
{
setup(props, ctx) {
const onClick = () => {
console.log('点击了自定义测试按钮');
};
return { value: props, onClick };
},
// template 中通过 <rc-origin> 复用原组件。注意传递 value 属性。
template: `
<rc-origin :value="value"></rc-origin>
<br/>
<button @click="onClick">测试</button><br/>
`,
}
);