需求:展示一个订单列表,有一个字段“备注”可以进行文本域内的更新。 相关代码如下
存在的问题:点击“保存”按钮不能正常触发,但“取消”按钮可以正常触发
问题原因:在于 el-input的@blur事件与 “保存” 按钮的点击事件存在冲突,
关键原因:el-input的blur事件先于 “保存” 按钮点击事件触发
- 事件执行顺序问题:当点击 “保存” 按钮时,鼠标从
el-input移开,会先触发el-input的@blur事件,执行handleCancelEdit函数,导致row.isEditing被设为false,编辑状态被关闭。此时 “保存” 按钮所在的div.notes-edit因v-else条件(row.isEditing为false)被销毁,按钮元素从 DOM 中移除,点击事件自然无法触发。 - 对比 “取消” 按钮:“取消” 按钮的点击事件会直接执行
handleCancelEdit,虽然同样会关闭编辑状态,但事件触发时按钮仍在 DOM 中,因此能正常执行。而 “保存” 按钮的点击被blur事件抢先中断,导致事件丢失。
验证与复现
- 当
el-input处于聚焦状态时,快速点击 “保存” 按钮,会观察到:输入框先失焦(触发blur→handleCancelEdit→关闭编辑状态),按钮消失,点击事件无效。 - 若先点击页面其他区域让输入框失焦(编辑状态已关闭),再点击 “保存” 按钮(此时按钮已消失),更明显无法触发。
解决方案:延迟blur事件的执行,优先响应按钮点击
通过setTimeout延迟handleCancelEdit的执行,给 “保存” 按钮的点击事件留出触发时间
解决代码如下: