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

如何将Next.js Link组件与MUI Pagination组件结合使用?

解决Next.js Link与MUI PaginationItem兼容问题

问题背景

在Next.js项目中使用MUI的Pagination组件时,尝试将PaginationItem的component从原生<a>标签替换为Next.js的Link组件,代码如下:

原有可用代码:

<PaginationItem
  component={'a'}
  href={`/tunes${item.page === 1 ? '' : `?page=${item.page}`}`}
  {...item}
/>

替换后的代码:

<PaginationItem
  component={Link}
  href={`/tunes${item.page === 1 ? '' : `?page=${item.page}`}`}
  {...item}
/>

执行后出现错误:

Error: Multiple children were passed to <Link> with 'href' of '/tunes?page=0' but only one child is supported

原因是MUI的PaginationItem会向传入的component传递两个子元素(页码文本和TouchRipple波纹元素),而Next.js的Link组件仅支持单个子元素。

解决方案

方法1:自定义Link包装组件

创建一个中间组件,将PaginationItem的多个子元素包裹在单个容器内,再传递给Next.js Link:

import Link from 'next/link';

// 自定义包装组件
const LinkWrapper = ({ href, children, ...props }) => {
  return (
    <Link href={href} {...props}>
      {/* 用span包裹所有子元素,作为Link的单个子节点 */}
      <span>{children}</span>
    </Link>
  );
};

// 使用方式
<PaginationItem
  component={LinkWrapper}
  href={`/tunes${item.page === 1 ? '' : `?page=${item.page}`}`}
  {...item}
/>

方法2:通过Pagination的renderItem自定义渲染

直接在Pagination的renderItem属性中自定义每个分页项的结构,确保Link只接收单个子元素:

import Link from 'next/link';
import { Pagination, PaginationItem } from '@mui/material';

// 在Pagination组件中使用
<Pagination
  count={10} // 替换为实际总页数
  renderItem={(item) => (
    <PaginationItem
      {...item}
      component={() => (
        <Link href={`/tunes${item.page === 1 ? '' : `?page=${item.page}`}`}>
          <span>{item.children}</span>
        </Link>
      )}
    />
  )}
/>

说明

两种方法核心逻辑一致:将PaginationItem传递的多个子元素合并到单个容器(如<span>或<div>)中,满足Next.js Link对单个子元素的要求。若使用Next.js 13+的App Router,Link组件用法略有差异,但核心思路依然适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:31:35