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

Next.js使用Link包裹函数组件出现ref警告点击不跳转如何解决?

问题原因

Next.js 13+ 版本的 Link 组件默认会向直接子元素传递 ref 用于绑定跳转逻辑,你自定义的 BlogCard 是普通函数组件,没有处理 ref 接收逻辑,因此触发了控制台警告,同时跳转功能也无法正常生效。


解决方法

方法1:给BlogCard外层包裹原生DOM标签(推荐,无需修改原有组件)

在BlogCard外面套一层原生的<div>或<a>标签,原生DOM元素可以正常接收ref,不需要修改BlogCard的内部代码:

<div className="flex justify_between align_center flex_wrap mb_2 ">
    {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map((item) => (
      <Link href="/blog-details" key={item}>
        <div>
          <BlogCard />
        </div>
      </Link>
    ))}
</div>

方法2:使用React.forwardRef改造BlogCard组件

如果不想额外增加DOM层级,可以直接改造BlogCard组件支持接收ref:

// BlogCard 组件定义文件修改
import React from 'react'

const BlogCard = React.forwardRef((props, ref) => {
  // 原有组件逻辑不变,将ref挂载到组件最外层的DOM元素上
  return (
    <div ref={ref} className="你原有卡片的样式类">
      {/* 原有卡片内部内容 */}
    </div>
  )
})

BlogCard.displayName = 'BlogCard'
export default BlogCard

改造完成后原有调用代码无需修改,即可正常实现跳转,控制台警告也会消失。

方法3:旧版本Next.js适配(12及更早版本)

如果使用的是Pages Router的旧版本Next.js,可以给Link添加passHref属性,同时在BlogCard内部接收href属性绑定到自身的<a>标签上:

// 调用处修改
<Link href="/blog-details" key={item} passHref>
  <BlogCard />
</Link>
// BlogCard内部修改
const BlogCard = (props) => {
  return (
    <a href={props.href} className="卡片样式">
      {/* 卡片内容 */}
    </a>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:06:03