插槽
聊天区有 17 个固定位置可以放业务组件,通过 slots 按位置名登记。
用法
17 个位置
会话列表上的两个位置
会话列表不在 <Chatkit> 里,它是单独的组件 SessionList,自己带两个位置,通过属性传入:
写法、排序、错误隔离的规则与下面讲的插槽相同。自定义列表直接读取应用持有的会话数组,选择时更新 activeSessionId,见会话列表。
这里的 items 是宿主维护的 ChatkitSessionView[],不是 useChatSessions 返回的运行时管理对象;即使外面有 Provider,数组和选择回调也不能省略。
三种写法
每个位置拿到的上下文
插槽里的组件能做什么
hooks 的完整说明见 Hook 参考。
一个位置放多个
写成数组。内置功能也放在这些位置上(比如附件按钮在 composer.toolbarStart),业务方的内容和它们排在一起。
顺序:order
从前到后:
order为负数的,小的在前- 内置功能
order为0的- 没写
order的,按书写顺序 order为正数的,小的在前
同一个位置放多项、并且会增减时,给每一项一个 key。
工具栏放不下时
composer.toolbarStart 与 composer.toolbarEnd 一行放不下时,靠后的项收进「更多」菜单。
只能放一个的位置
session.empty、composer.sendButton 只能放一项,放了就替换默认的显示:
defaultNode 保留内置发送/停止切换和禁用逻辑。完全替换时,handleSubmit 只负责提交,不能自动代替停止操作;需要结合 isSending、disabledSend 和 useChatkitActions().abort 实现完整交互。这里的 isSending 是当前按钮的停止态,允许排队且已有待发内容时会变回发送态。
单项位置直接写 null / false 会被视为没有配置;需要明确隐藏默认内容时使用 () => null。
右侧面板
panel 里放了内容,面板就显示。也可以按需打开:
错误隔离
每一项各自隔离。某一项渲染时抛错:
- 这一项不显示;同一位置的其他项、对话本身不受影响。
onError收到完整的错误。onEvent收到render_error事件,scope为slot,slot是出错的位置名。
此隔离只覆盖渲染错误,不覆盖按钮事件处理函数或异步请求的异常;业务组件需要自行处理后两者。