TypeScript条件代码无论confirm()返回值如何都执行问题求助
问题原因
你的window.confirm逻辑本身是正常的,从打印结果可以判断response的布尔值完全符合预期,问题出在逻辑之外的部分,分为两种常见场景:
- 场景1:视图渲染异常(数据实际未删除,只是页面显示错误)
如果你使用Vue/React/Angular等MVVM框架做列表渲染,大概率是你给列表项绑定的key属性用了数组索引index。框架基于key做虚拟DOM diff,当数组内容有其他变更、或者索引顺序变化时,会出现视图和实际数据不一致的问题,看起来像是条目被删除了,实际上你的this.feedback数组数据并没有变化。 - 场景2:数据真的被删除(else分支打印后数组长度确实变小)
说明删除逻辑在当前if(response)分支之外被触发,常见3个原因:- 事件冒泡:你绑定删除按钮的点击事件时,没有阻止冒泡,按钮的父元素也绑定了同名的删除操作,点击按钮时同时触发了两次删除逻辑,其中一次没有做confirm判断直接删了数据。
- 数组引用共享:你的
this.feedback/this.item数组是其他数组的浅拷贝引用,其他业务逻辑修改了同源数组,同步影响到了当前组件的数组数据。 - 表单默认提交:如果删除按钮放在
<form>标签内,且未指定type="button",按钮默认是submit类型,点击后会触发表单提交刷新页面,页面重置后看起来条目被删除。
修正方案
- 先确认是视图还是数据问题:在else分支添加打印
console.log(this.feedback.length),点击取消后对比点击前的数组长度:- 长度不变:属于场景1,把列表渲染的
key值从索引index换成每个条目唯一的业务ID(比如反馈条目自带的id字段)即可修复。 - 长度变小:属于场景2,按对应原因排查修复:
- 事件冒泡问题:给删除按钮的点击事件添加阻止冒泡逻辑,原生JS用
e.stopPropagation(),框架可直接用语法糖(比如Vue的@click.stop、React的e.nativeEvent.stopPropagation())。 - 数组引用问题:检查
this.feedback的赋值逻辑,要是是引用其他数组的情况,用深拷贝生成独立数组即可,比如this.feedback = JSON.parse(JSON.stringify(originFeedback))(无复杂函数的场景)或者用自定义深拷贝方法。 - 表单提交问题:给删除按钮添加
type="button"属性即可。
- 事件冒泡问题:给删除按钮的点击事件添加阻止冒泡逻辑,原生JS用
- 长度不变:属于场景1,把列表渲染的
- 可以额外加兜底逻辑避免代码异常穿透,参考修改后的代码:
deleteItem(index: number): void { const response = window.confirm("Are you sure?"); // 非确认直接返回,阻断后续逻辑执行 if (!response) { console.log("B"); return; } // 原有删除逻辑 for (let i = 0; i < this.csvRecords.length; i++) { if (this.students[i].feedbackBoolean[index] == true) { const newGrade = parseFloat(this.students[i].grade) + this.feedback[index].deduction this.students[i].grade = newGrade.toString(); } this.students[i].feedbackBoolean.splice(index,1); } this.feedback.splice(index,1); console.log("A"); }
内容的提问来源于stack exchange,提问作者Centixel
相关产品推荐
相关产品推荐

