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

React技术问题:如何移除状态更新中的prevent.default

解决移除event.preventDefault()后Modal意外触发的问题

看起来问题的核心在于你使用了带有href="#"的<a>标签——它的默认行为是导航到页面顶部(锚点定位),这会引发一些意外副作用,比如页面滚动导致组件重新渲染,甚至触发你没注意到的状态更新逻辑,最终导致Modal被错误触发。

最优解决方案:替换<a>标签为<button>标签

既然这个元素的作用是触发操作(打开删除用户的Modal),而不是导航,使用<button>标签更符合语义,也没有默认的导航行为,完全不需要preventDefault():

  1. 修改渲染函数中的元素:
export const userDeleteRenderer = (options: any): any => ( cell: string, row: string ): JSX.Element => {
  const deleteUserClick = options.onClick({ cell, row });
  return (
    <div className="float-right" data-test="delete-icon">
      {/* 替换a标签为button,添加样式消除默认按钮外观 */}
      <button 
        className="text-danger p-1 text-lg bg-transparent border-0 cursor-pointer" 
        onClick={deleteUserClick}
        data-test="delete-button"
      >
        <Icon icon="trash" />
      </button>
    </div>
  );
};
  1. 移除状态更新函数中的preventDefault():
openDeleteUserModal = ({ row }: { row: IUser | null }): any => ( event: React.SyntheticEvent ): void => {
  this.setState({ userToDelete: row, isDeleteUserModalOpen: true });
};

备选方案(如果必须保留<a>标签)

如果因为样式或其他原因需要保留<a>标签,把href设置为javascript:void(0)可以阻止默认的导航行为,同样不需要preventDefault():

<a href="javascript:void(0)" className="text-danger p-1 text-lg" onClick={deleteUserClick}>
  <Icon icon="trash" />
</a>

为什么移除preventDefault()会触发Modal?

当你点击带有href="#"的<a>标签且不阻止默认行为时,浏览器会滚动到页面顶部,这个操作可能会触发组件的重新渲染(比如组件依赖滚动位置,或者父组件监听了滚动事件),进而意外执行了打开Modal的状态更新逻辑。换成按钮或者修改href值就能彻底避免这个问题,同时让代码更简洁,测试也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:13:16