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

NextJS中Link组件内嵌Button:仅执行点击事件阻止跳转的方法

在Next.js的Link组件中嵌套Button并阻止跳转的解决方案

当你在Link里嵌套Button时,点击按钮会先执行onClick逻辑,再触发Link的页面跳转——这是事件冒泡导致Link捕获到了点击事件。以下几种方法可以实现只执行Button的onClick逻辑,同时阻止页面跳转:

方法一:阻止事件冒泡

在Button的onClick回调中调用event.stopPropagation(),阻止事件向上传递到Link组件,这样Link就不会触发跳转行为。

修改你的代码如下:

<Link href={`./${school.attributes.Slug}/obor/${field.attributes.Code}`}>
  <div className="responsive-table__row">
    <div className="responsive-table__item">50</div>
    <div className="responsive-table__item">40/50</div>
    <div className="responsive-table__item">Test</div>
    <div className="responsive-table__item">
      <button 
        className="responsive-table__button button button--secondary" 
        onClick={(e) => {
          e.stopPropagation(); // 阻止事件冒泡
          handleModalOpenerClick(field);
        }}
      >
        Show modal
      </button>
    </div>
  </div>
</Link>

方法二:拆分Link的作用范围

如果只需要表格行的部分区域触发跳转,可以把Link仅包裹需要跳转的内容,Button所在区域单独拆分出来,从根源上避免事件冲突,同时结构更符合语义化:

<div className="responsive-table__row">
  <Link href={`./${school.attributes.Slug}/obor/${field.attributes.Code}`}>
    <div className="responsive-table__item">50</div>
    <div className="responsive-table__item">40/50</div>
    <div className="responsive-table__item">Test</div>
  </Link>
  <div className="responsive-table__item">
    <button 
      className="responsive-table__button button button--secondary" 
      onClick={() => handleModalOpenerClick(field)}
    >
      Show modal
    </button>
  </div>
</div>

方法三:在Link中判断点击目标(不推荐)

也可以在Link的onClick回调中判断点击目标是否为Button,若是则阻止默认跳转行为,但这种方式不如前两种简洁直观:

<Link 
  href={`./${school.attributes.Slug}/obor/${field.attributes.Code}`}
  onClick={(e) => {
    if (e.target.tagName === 'BUTTON' || e.target.closest('button')) {
      e.preventDefault();
    }
  }}
>
  <div className="responsive-table__row">
    <div className="responsive-table__item">50</div>
    <div className="responsive-table__item">40/50</div>
    <div className="responsive-table__item">Test</div>
    <div className="responsive-table__item">
      <button 
        className="responsive-table__button button button--secondary" 
        onClick={() => handleModalOpenerClick(field)}
      >
        Show modal
      </button>
    </div>
  </div>
</Link>

推荐优先使用前两种方法,尤其是方法二,后续维护时更不容易出现额外的事件问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:35:40