feat: 停止的时候处理

This commit is contained in:
2025-09-09 23:13:33 +08:00
parent 6fc01a1bd5
commit 35abfea922
2 changed files with 62 additions and 35 deletions

View File

@@ -7,8 +7,8 @@ class TypewriterManager {
// 配置选项
this.options = {
typingSpeed: 50, // 打字速度(毫秒)
cursorText: '', // 光标样式
...options
cursorText: "", // 光标样式
...options,
};
// 状态变量
@@ -41,11 +41,11 @@ class TypewriterManager {
* @param {string} content - 要添加的内容
*/
addContent(content) {
if (typeof content !== 'string') {
if (typeof content !== "string") {
content = String(content);
}
this.currentMessageContent += content;
// 如果没有在打字,启动打字机效果
if (!this.isTyping) {
this.startTypewriter();
@@ -70,18 +70,22 @@ class TypewriterManager {
_typeNextChar() {
// 如果已显示内容长度小于完整内容长度,继续打字
if (this.displayedContent.length < this.currentMessageContent.length) {
const nextLength = Math.min(
this.displayedContent.length + 1,
this.currentMessageContent.length
);
this.displayedContent = this.currentMessageContent.substring(
0,
this.displayedContent.length + 1
nextLength
);
const displayContent = this.displayedContent;
// 调用内容更新回调
if (this.onContentUpdate) {
this.onContentUpdate(displayContent);
}
// 调用字符打字回调
if (this.onCharacterTyped) {
this.onCharacterTyped(this.displayedContent);
@@ -92,18 +96,17 @@ class TypewriterManager {
this.typewriterTimer = setTimeout(() => {
this._typeNextChar();
}, delay);
} else {
// 打字完成,移除光标
if (this.onContentUpdate) {
this.onContentUpdate(this.currentMessageContent);
}
// 调用打字完成回调
if (this.onTypingComplete) {
this.onTypingComplete(this.currentMessageContent);
}
this.stopTypewriter();
}
}
@@ -119,6 +122,21 @@ class TypewriterManager {
this.isTyping = false;
}
/**
* 停止打字机效果并保留当前显示的内容
* 与stopTypewriter不同这个方法会将当前显示的内容设为最终内容
*/
stopAndKeepCurrent() {
this.stopTypewriter();
// 将当前显示的内容设为完整内容,避免后续添加更多内容
this.currentMessageContent = this.displayedContent;
// 调用完成回调
if (this.onTypingComplete) {
this.onTypingComplete(this.displayedContent);
}
}
/**
* 重置打字机状态
*/
@@ -137,9 +155,10 @@ class TypewriterManager {
isTyping: this.isTyping,
currentContent: this.currentMessageContent,
displayedContent: this.displayedContent,
progress: this.currentMessageContent.length > 0
? this.displayedContent.length / this.currentMessageContent.length
: 0
progress:
this.currentMessageContent.length > 0
? this.displayedContent.length / this.currentMessageContent.length
: 0,
};
}
@@ -149,11 +168,11 @@ class TypewriterManager {
completeImmediately() {
this.stopTypewriter();
this.displayedContent = this.currentMessageContent;
if (this.onContentUpdate) {
this.onContentUpdate(this.currentMessageContent);
}
if (this.onTypingComplete) {
this.onTypingComplete(this.currentMessageContent);
}
@@ -171,4 +190,4 @@ class TypewriterManager {
}
}
export default TypewriterManager;
export default TypewriterManager;