You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS Redux dispatch重复触发:关闭窗口后cardIndex异常回退

问题根源:事件冒泡导致的重复触发

嘿,我一眼就看出问题啦——这是事件冒泡在捣乱!

你看,你的关闭按钮(.close-modal)是嵌套在绑定了openWindow(dateIndex)的.day-card元素里面的。当你点击关闭按钮时,会先触发按钮自己的onClick(调用closeWindow()把cardIndex设为null),但这个点击事件会向上“冒泡”到父元素.day-card,触发它的onClick事件,又把cardIndex设回了当前的dateIndex。所以你才会看到cardIndex先变null,随即又被设回之前的索引。


解决方案:阻止事件冒泡

最直接的解决方法,就是在关闭按钮的点击事件里阻止冒泡,让事件停在按钮这里,不再向上传递给父元素。修改你的关闭按钮代码:

<span className="close-modal" onClick={(e) => {
  e.stopPropagation(); // 阻止事件冒泡到父元素
  closeWindow();
}}>x</span>

这样点击关闭按钮时,只会执行closeWindow(),父元素的openWindow就不会被触发了,cardIndex就能正常设为null,窗口也会关闭。


额外小优化(非必须)

看你的handleCalendarIndex函数,里面并没有异步操作,其实可以去掉async关键字,简化一下:

export function handleCalendarIndex(calendarIndex) {
  return dispatch => {
    dispatch(changeCalendarIndex(calendarIndex))
  }
}

或者如果changeCalendarIndex是普通的同步action creator,甚至可以直接把它传给mapDispatchToProps,不用额外包一层函数,不过这对你当前的问题没有影响,只是代码更简洁而已~

内容的提问来源于stack exchange,提问作者Nataly Firstova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:42:50