如何在keydown事件触发时停止计时器 解决文本输入框更新异常问题
问题根因
你当前实现的问题在于定时器timer是strValue setter函数内的局部变量,每次setter被输入触发时都会重新初始化timer为undefined,导致clearTimeout逻辑完全不生效。每次输入都会新增一个独立的8秒定时器,到时间就自动触发更新,才会出现你输入过程中文本框频繁重载的问题。
修复方案
步骤1:在组件data中声明定时器存储变量
你需要把定时器ID挂载到组件实例上持久存储,避免每次触发setter丢失上一次的定时器引用:
data() { return { // 保留你现有的其他data变量,新增以下字段 updateStrValueTimer: null } }
步骤2:修改strValue的setter逻辑
调整防抖逻辑,每次触发输入先清空上一次未执行的定时器,再创建新的定时器:
strValue: { get: function () { return this.attachment.strValue; }, set: function (val) { // 清空上一次未执行的更新定时器 if (this.updateStrValueTimer) { clearTimeout(this.updateStrValueTimer) } // 创建新的定时器,ID存入实例变量 this.updateStrValueTimer = setTimeout(() => { this.updateAttachment([this.attachment.id, { strValue: val }]) // 更新完成后重置定时器变量 this.updateStrValueTimer = null }, 8000) } }
方案说明
你最初的思路完全正确,这种高频触发场景下等待操作停止指定时长后再执行回调的逻辑就是标准的防抖(debounce) 实现,是当前输入框延迟提交场景下最直接、性能最优的实现路径,没有额外的事件监听开销,完全匹配你的业务需求。
内容的提问来源于stack exchange,提问作者user16741832
相关产品推荐
相关产品推荐

