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

Next.js 13:外部onClick与内部Link首次点击无效问题求助

问题原因

点击内部Link时,事件会先冒泡到外层div,触发setSelection(index)导致组件重新渲染。这会打断Link的第一次点击跳转逻辑——组件重新渲染后,原本的点击事件上下文被重置,所以第一次点击实际只完成了选中状态的切换,第二次点击时组件已完成渲染,Link的跳转才能正常生效。

解决方案

有两种常用方法可以解决这个事件冲突问题:

方法一:阻止Link的事件冒泡

直接在Link的点击事件中阻止事件向上冒泡,这样点击Link时不会触发外层div的onClick,避免组件重新渲染打断跳转:

<div
  className={`relative h-[350px] rounded-2xl (w-[480px]) ${
    index == selection ? 'border-t-2 border-width-[30px] border-solid border-primary-400' : ''
  }`}
  onClick={() => setSelection(index)}
>
  {/* ...Image及其他内容 */}
  <Link href={`/shop/${data.id}`} onClick={(e) => e.stopPropagation()}>
    Watch now
  </Link>
</div>

如果Link内部包含其他子元素,也可以给子元素添加阻止冒泡的逻辑:

<Link href={`/shop/${data.id}`}>
  <span onClick={(e) => e.stopPropagation()}>Watch now</span>
</Link>

方法二:在外层div的onClick中过滤Link点击

通过判断点击目标是否属于Link区域,只在点击非Link区域时才执行setSelection:

<div
  className={`relative h-[350px] rounded-2xl (w-[480px]) ${
    index == selection ? 'border-t-2 border-width-[30px] border-solid border-primary-400' : ''
  }`}
  onClick={(e) => {
    // 检查点击目标是否是Link或其后代元素
    const isLinkClicked = e.target.closest('a[href^="/shop/"]');
    if (!isLinkClicked) {
      setSelection(index);
    }
  }}
>
  {/* ...Image及其他内容 */}
  <Link href={`/shop/${data.id}`}>
    Watch now
  </Link>
</div>

这种方法的优势是保留了div其他区域的点击选中逻辑,同时不影响Link的跳转。

内容的提问来源于stack exchange,提问作者Valentino Fabris Valenti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:13