96SEO 2026-08-12 11:21 7
feature/chat-typewriter-reply
在原有聊天 Demo 基础上,新增 AI 回复的打字机输出效果。老实说,
原始实现是一次性显示完整回复:

使用者发送消息 ↓AI 回复整段文本
再看本次改为。
使用者发送消息 ↓追加使用者消息 ↓追加一条 AI 消息
AI 消息先显示“AI 正在思考...”
定时器逐字更新这条 AI 消息的 content
页面逐字刷新
打字结束后恢复发送状态
entry/src/main/ets/pages/Setting.ets
docs/-chat-typewriter-reply.md
输入示例:
你好
页面显示流程:
使用者:你好
说到AI,AI 正在思考...
AI:你
说到AI,你刚
至于AI,你刚才
再看AI,你刚才说...
最终完整显示:
你刚才说的是:你好。这是一个模拟 AI 回复,当前正在使用打字机效果逐字输出。
聊天消息统一使用 ChatItem
interface ChatItem {
说到id,number;话说回来,type: 'user' | 'ai';content: string;}
| 字段 | 作用 |
|---|---|
| id | 消息唯一标识 |
| type | 区分使用者或 AI 消息 |
| content | 实际展示的文字内容 |
使用者消息这方面,
{ id: 1,type: 'user',content: '你好' }
AI 消息:
{ id: 2,type: 'ai',content: 'AI 正在思考...' }
private typingTimer: number = -1;
初始值 -1 表示当前没有正在运行的定时器。清理时只需判断是否不等于 -1.
aboutToDisappear 中清理定时器?
aboutToDisappear: void {
if {
clearInterval;this.typingTimer = -1;}
}
A) 错误写法:
{ content: '' }
B) 正确做法:让 AI 首条消息直接展示 “AI 正在思考...”,提高交互感知。
A) 原因:
B) 方法:让 key 同时包含
A) 在组件生命周期的
ts
private typingTimer: number = -1;
mockAskAi: void {
// 完整回复文本
const fullText =
}
关键步骤拆解
1️⃣ 准备完整回复文本 –
2️⃣ 创建占位 AI 消息 –
3️⃣ 延迟启动 –
4️⃣ 通过
5️⃣ 用
6️⃣ 用
7️⃣ 结束条件 – 当已输出全部字符后清除计时器并恢复
bash
git checkout ai-chat # 切换主分支
git pull origin ai-chat # 拉取最新代码
git checkout -b feature/chat-typewriter-reply # 创建功能分支
git add entry/src/main/ets/pages/Setting.ets docs/-chat-typewriter-reply.md
git commit -m "feat: add typewriter reply effect"
git push origin feature/chat-typewriter-reply
git checkout ai-chat
git pull origin ai-chat
git branch -d feature/chat-typewriter-reply
的
ForEach(this.chatList,=> { /* 渲染逻辑 */ },=> `${item.id}-${item.content}`);// key 包含 content
从痛点三来看,页面离开后仍有未清理的 timer。引发异常或卡顿
Nine、发送消息流程
sendMsg: void {
const text = this.inputValue.trim;if return,const userItem: ChatItem = { id: this.nextId++。type: 'user',content: text };this.chatList = this.chatList.concat;// 用 concat 创建新数组
this.inputValue = '';不过,this.isSending = true;this.scrollToBottom;this.mockAskAi;}
Ten、为什么继续使用 concat 新增消息
const oldList =;const newList = oldList.concat;/* oldList =>
newList => */
Eleven、打字机回复主要方法
完整实现代码:
你刚才说的是:${question}。这是一个模拟 AI 回复,当前正在使用打字机效果逐字输出。,老实说,
// 首条 AI 消息,仅展示“思考中”提示
const aiItem: ChatItem = {
再看id。this.nextId++,type: 'ai',content: 'AI 正在思考...'
};// 将其加入列表并滚动到底部
this.chatList = this.chatList.concat;
this.scrollToBottom;// 延迟模拟 AI 思考 → 开启逐字输出
setTimeout => {
let currentIndex = 0;this.typingTimer = setInterval => {
currentIndex++;const currentText = fullText.slice;// 用 map 更新同一条 AI 消息的 content
this.chatList = this.chatList.map(item =>
item.id === aiItem.id?{ ...item,content: currentText } : item
);this.scrollToBottom;话说回来,// 打完后停止计时器并恢复输入状态
if {
clearInterval;this.typingTimer = -1;this.isSending = false;}
},60),// 每60ms 输出一个字符,可自行调节速度
},500);// 思考延迟500ms
fullText 为最终要展示的全部文字。content:'AI 正在思考...' 给使用者即时反馈。setTimeout 模拟思考延迟。其实,currentIndex 控制进度 – 每次自增后截取子串。slice 获取当前要显示的文字 – 实现“打字机”。map 更新同一条记录 – 保证 UI 能感知到 content 的变化。isSending=false。话说回来,
E十二、为什么使用 map 更新单条消息?
E十三、ForEach key 必须同步内容变化才能刷新列表
ts
ForEach(this.chatList,=>{/* 渲染 */},=>`${item.id}-${item.content}`);// ✅ key 包含动态 content
若仅使用 `item.id` 做 key。则内容变化而 key 不变,导致 UI 重用旧节点,不会出现逐字刷新。
E十四、关于组件生命周期的定时器清理
ts
aboutToDisappear: void {
if {
clearInterval;this.typingTimer=-1;}
}
确保页面销毁前彻底关闭所有计时任务,防止内存泄漏和异常。其实,
setTimeout 等待 UI 完成渲染后再滚动,提高可靠性。chatList.length确保最新内容可见。
content) *。
以上即为《鸿蒙聊天 Demo练习——AI回复与刷新问题处理》完整排版与痛点解析。请直接复制使用,
。作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback