如何在BotFramework-WebChat中完全不渲染指定附件及外层气泡
解决BotFramework WebChat隐藏特定附件外层气泡的问题
你遇到的问题根源是:attachmentMiddleware仅控制附件内容是否渲染,但包含该附件的消息(activity)本身仍会被WebChat渲染,所以外层气泡会显示空框。要彻底去掉气泡,需要从消息层面拦截过滤,具体实现如下:
推荐方案:拦截并过滤目标消息
通过activityMiddleware检查消息中的附件类型,若包含需要隐藏的附件,直接返回null让WebChat不渲染整个消息(包括气泡),同时还能在拦截时执行你的业务逻辑:
// 定义activity中间件 const activityMiddleware = () => next => activity => { // 查找是否存在需要隐藏的附件 const targetAttachment = activity.attachments?.find( att => att.contentType === 'application/vnd.microsoft.card.adaptive.addUserDetails' ); if (targetAttachment) { // 在这里执行你需要的代码逻辑,比如处理用户详情数据 console.log('执行添加用户详情逻辑:', targetAttachment.content); // 返回null,WebChat将不渲染这条消息,气泡完全消失 return null; } // 其他消息正常传递处理 return next(activity); };
然后在WebChat组件中配置该中间件:
<WebChat activityMiddleware={activityMiddleware} attachmentMiddleware={attachmentMiddleware} // 你的其他配置(如directLine连接信息等) />
备选方案:保留消息但隐藏气泡(不推荐)
如果不想过滤整个消息,只是隐藏气泡,可以通过自定义气泡样式配合attachmentMiddleware返回空组件,但这种方式仍会保留消息的DOM结构,兼容性依赖CSS选择器:
- 修改
attachmentMiddleware返回空组件:
const attachmentMiddleware = (properties) => () => next => card => { switch(card.attachment.contentType) { case 'application/vnd.microsoft.card.adaptive.addUserDetails': return <></>; case 'application/vnd.microsoft.card.adaptive.locationpicker': return <LocationPicker/>; default: return next(card); } };
- 添加CSS隐藏空气泡:
.webchat__bubble:has(.webchat__attachment:empty) { display: none; }
内容的提问来源于stack exchange,提问作者user19600695
相关产品推荐
相关产品推荐

