You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS聊天组件如何让typing indicator仅在消息底部显示一次

问题根因

Typing 提示逻辑写在了单条消息渲染组件ShowMessages内部,你有多少条消息就会调用多少次该组件,自然会重复渲染出对应数量的Typing提示。


修改方案

  • 第一步:精简ShowMessages组件,仅保留单条消息渲染逻辑,移除 Typing 相关代码和不必要的状态引用:
import React from "react";

function ShowMessages({ idx, item }) {
  return (
    <li className={item.direction === "send" ? "replies" : "sent"} key={idx}>
      <div className="media-body">
        <h5>{item.body}</h5>
      </div>
    </li>
  );
}

export default ShowMessages;
  • 第二步:在循环渲染ShowMessages的父组件中,将Typing提示放在消息列表循环的末尾,保证全局仅渲染一次,参考父组件代码:
import React from "react";
import { useSelector } from "react-redux";
import ShowMessages from "./ShowMessages";

function ChatContainer() {
  const chatWith = useSelector((state) => state.user.chatWith);
  // 替换为你实际的消息列表数据源
  const messageList = useSelector(state => state.chat.messageList);

  return (
    <ul className="chat-message-list">
      {/* 循环渲染所有聊天消息 */}
      {messageList.map((item, idx) => (
        <ShowMessages key={idx} idx={idx} item={item} />
      ))}
      {/* 所有消息底部仅渲染一次Typing提示 */}
      {chatWith.isTyping === "composing" && <li className="sent">Typing</li>}
    </ul>
  );
}

优化提示

建议将Typing提示也用li标签包裹,符合ul列表的DOM结构规范,避免浏览器解析DOM时出现异常。

内容的提问来源于stack exchange,提问作者Dev54

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:48:01