ChatLayout - 对话流容器组件

该组件提供了一个完整的对话流容器,包含头部区域、内容区域和底部区域。

基础用法

含左侧 History、头部、消息区与底部任务条,贴近完整产品布局。

完整产品布局 - 侧栏 + 头部 + 消息流 + 任务条

无主栏 · 固定高度

无会话侧栏,父级给定高度即可;适合嵌入设置抽屉、弹层或分栏右侧等场景。

无主栏 · 固定高度嵌入

带 Markdown 输入框

底部使用 MarkdownInputField,scrollBehavior 为 auto。

带输入框

底部最小高度

通过 footerHeight 为多行输入等较高的 footer 预留最小高度,避免内容被遮挡。

footerHeight 与多行底部

滚动状态监听

使用 onScrollStateChange 的 isPinned 控制「回到底部」浮动按钮;与流式追加消息配合时常用。

滚动状态与回到底部

关闭底部背景动效

showFooterBackground={false},仅保留底部操作区。

关闭底部背景动效

API 参考

ChatLayoutProps

属性说明类型默认值版本
header头部配置对象,详见下方 LayoutHeaderConfigLayoutHeaderConfig--
children内容区域的自定义内容ReactNode--
footer底部区域的自定义内容ReactNode--
footerHeight底部区域的最小高度(px),仅在传入 footer 时生效;多行输入等高底部建议显式抬高,避免内容被遮挡number48-
onScrollStateChange滚动状态变化回调,便于「回到底部」等交互,参数见 ChatLayoutScrollState(state: ChatLayoutScrollState) => void--
scrollBehavior'smooth' 走基于 rAF 的渐进滚动(流式输出场景下更平滑、不会被新增内容打断);'auto' 立即滚动'smooth' | 'auto''smooth'-
showFooterBackground是否显示底部背景动效booleantrue-
className自定义类名string--
style自定义样式React.CSSProperties--
classNames自定义各部分类名,详见下方 ChatLayoutClassNamesChatLayoutClassNames--
styles自定义各部分样式,详见下方 ChatLayoutStylesChatLayoutStyles--

ChatLayoutClassNames

用于自定义组件各部分的类名。

属性说明类型默认值版本
root根容器类名string--
content内容区域类名string--
scrollable滚动区域类名string--
footer底部区域类名string--
footerBackground底部背景区域类名string--

ChatLayoutStyles

用于自定义组件各部分的内联样式。

属性说明类型默认值版本
root根容器样式React.CSSProperties--
content内容区域样式React.CSSProperties--
scrollable滚动区域样式React.CSSProperties--
footer底部区域样式React.CSSProperties--
footerBackground底部背景区域样式React.CSSProperties--

LayoutHeaderConfig

折叠按钮支持「受控(leftCollapsed / rightCollapsed)」与「非受控(leftDefaultCollapsed / rightDefaultCollapsed)」两种模式。

属性说明类型默认值版本
title头部标题,支持文本或自定义 React 节点ReactNode--
showShare是否显示分享按钮booleanfalse-
leftCollapsible左侧是否可折叠booleanfalse-
rightCollapsible右侧是否可折叠booleanfalse-
leftCollapsed左侧折叠状态(受控模式)boolean--
rightCollapsed右侧折叠状态(受控模式)boolean--
leftDefaultCollapsed左侧默认折叠状态(非受控模式)booleanfalse-
rightDefaultCollapsed右侧默认折叠状态(非受控模式)booleanfalse-
onLeftCollapse左侧折叠按钮点击事件回调(collapsed: boolean) => void--
onRightCollapse右侧折叠按钮点击事件回调(collapsed: boolean) => void--
onShare分享按钮点击事件回调() => void--
leftExtra自定义左侧内容ReactNode--
rightExtra自定义右侧内容ReactNode--
className自定义类名string--

ChatLayoutScrollState

onScrollStateChange 的回调参数,描述滚动容器当前的两种相关状态。isAtBottom 是几何距离的判定,isPinned 反映用户意图——区别在于:用户主动上滑离开底部时 isAtBottom 立即为 false,但 isPinned 在用户回到底部前都保持 false,可用来稳定地控制「回到底部」浮动按钮的显隐。

属性说明类型
isAtBottom是否贴近底部(距离底部 ≤ 容差阈值,当前 30px)boolean
isPinned是否处于「跟随底部」状态(用户未主动上滑离开)boolean

ChatLayoutRef

通过 ref 可以访问以下方法和属性:

属性/方法说明类型默认值版本
scrollContainer滚动容器的 DOM 引用HTMLDivElement | null--
scrollToBottom手动滚动到底部;behavior 默认 'auto' 立即滚动,传 'smooth' 走 rAF 渐进滚动(behavior?: 'smooth' | 'auto') => void--
isAtBottom当前滚动容器是否贴近底部() => boolean--

设计理念

  1. 组件需要父容器有明确的高度才能正常显示
  2. 内容区域支持自动滚动,建议配合虚拟滚动使用大量数据
  3. 所有按钮都支持键盘导航和屏幕阅读器
  4. 头部折叠状态由 LayoutHeaderConfig 提供受控(leftCollapsed / rightCollapsed)与非受控(leftDefaultCollapsed / rightDefaultCollapsed)两套接口
  5. 通过 ref 可以访问滚动容器和手动控制滚动行为
  6. 底部背景动效默认开启,可通过 showFooterBackground 控制
  7. 支持通过 classNames 和 styles 精细化定制各部分样式