EbChatWidget 浮动挂件
网页右下角常驻的助手入口:收起时只有一颗悬浮球,点开是面板。窄屏自动换成底部抽屉(EbDrawer direction="btt"),桌面端是自持的浮层(自带焦点圈闭与滚动锁)。
本页组件在独立包
@wil-works/evoke-chat里,安装与注册见 Chatbot 对话窗口顶部说明。
窗体形态的另外四种不需要新组件——全屏页、侧边抽屉、对话框内嵌、移动端抽屉,用 EbAiConsole 配 EbDrawer / EbDialog 组合即可,见下方「组合配方」。
右下角的悬浮球是真实挂件(演示区内;用 mobile-mode=panel 让窄视口下也保持浮层形态)
用法
导出名为 EbChatWidget。v-model 管开合;内容完全由你放——常见就是一颗 EbChatbot 或 EbAiConsole:
vue
<eb-chat-widget v-model="open" title="智能助手" :badge="unread" disclaimer="…">
<eb-chatbot v-model="messages" height="100%" @send="onSend" />
</eb-chat-widget>合规声明门
给了 disclaimer 就先显示同意页,同意后才渲染内容,并抛 consent(让你持久化)。default-consented 可直接跳过(比如已存过同意记录)。同意按钮可用 #disclaimer-actions 替换——动作要自己接,组件把 accept 作为 slot prop 交出:
vue
<eb-chat-widget :disclaimer="text">
<template #disclaimer-actions="{ accept }">
<a href="/terms" target="_blank">查看条款</a>
<eb-button type="primary" @click="accept">同意并开始</eb-button>
</template>
</eb-chat-widget>组合配方(其余窗体形态)
| 形态 | 怎么拼 |
|---|---|
| 全屏页 | 路由页直接放 EbAiConsole |
| 侧边抽屉 | EbDrawer + EbAiConsole(direction="rtl") |
| 移动端抽屉 | EbDrawer direction="btt" + EbAiConsole |
| 对话框内嵌 | EbDialog(fullscreen 可全屏) + EbAiConsole |
| 右下角挂件 | 本组件 |
API
ChatWidget Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| modelValue | 展开态,配合 v-model | boolean | false |
| title | 面板标题(可用 #title 插槽替换) | string | — |
| icon | launcher 图标名 | string | customer-service |
| launcherTooltip | launcher 悬浮提示;展开时自动换成「收起」 | string | — |
| badge | launcher 角标,null 不显示 | number | null |
| placement | 贴边位置 | bottom-right | bottom-left | bottom-right |
| width / height | 桌面浮层尺寸 | string | number | 380 / 560 |
| mobileMode | 窄屏形态:drawer 底部抽屉 / panel 仍用浮层 | drawer | panel | drawer |
| drawerSize | 移动端抽屉高度 | string | number | 80% |
| disclaimer | 合规声明文本;给了就先显示同意门 | string | — |
| defaultConsented | 初始即视为已同意(例如已存过记录) | boolean | false |
| appendToBody | 挂到 body 以脱离宿主 overflow / z-index 上下文;关掉则内联渲染,两个形态都跟随 | boolean | true |
ChatWidget Events
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| update:modelValue | 开合意图(launcher 点击、关闭钮) | (open: boolean) => void | — |
| open / close | 受控值真的翻转时触发(状态迁移,不是意图) | () => void | — |
| consent | 同意声明门 | () => void | — |
ChatWidget Slots
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| default | 面板内容(未同意声明时不渲染) | — | — |
| title | 面板标题区 | — | title 文本 |
| launcher | 整块替换悬浮球;作用域 { open, toggle } | — | EbFloatButton |
| disclaimer-actions | 同意门按钮;作用域 { accept },动作需自行接 | — | 同意并开始 |
两处刻意的取舍
- 点击面板外部不关闭。聊天面板里常有需要选中复制的内容,误触关闭的代价比多按一次 Esc 大;Esc 与关闭钮都能关。
open/close表示状态迁移而非意图。受控方不接update:modelValue时面板不会展开——要「点了就开」就接 v-model。