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

Next.js中React Bootstrap Pagination样式异常问题求助

Next.js中React Bootstrap Pagination组件局部样式失效问题及解决方案

在Next.js项目中使用React Bootstrap的Pagination组件时,仅在组件对应的Pagination.scss中嵌套引入@import "~bootstrap/scss/bootstrap";,会导致分页按钮的禁用(disabled)与激活(active)状态无法正常显示,page-link元素也缺失禁用样式;但将该样式全局引入到app.scss时一切正常。


父组件代码

<div className="pages">
  <Paginate
    count={totalElements}
    recordSize={20}
    currentPage={page}
    click={(page) => {
      console.log(page);
      getAllCoach(page);
    }}
  />
</div>

Paginate子组件代码

import Pagination from "react-bootstrap/Pagination";

function Paginate(props) {
  const amountPages = Math.ceil(props.count / props.recordSize);
  let next = props.currentPage + 1;
  let prev = props.currentPage - 1;

  return amountPages > 1 ? (
    <div className="pagination-block flex-vertical-center">
      <Pagination>
        <Pagination.Prev
          disabled={props.currentPage === 1 ? true : false}
          onClick={() => {
            props.click(props.currentPage - 1);
          }}
        />
        {props.currentPage !== 1 ? (
          <Pagination.Item
            active={1 === props.currentPage}
            onClick={() => {
              props.click(1);
            }}
          >
            1
          </Pagination.Item>
        ) : (
          ""
        )}
        {prev - 1 > 1 ? <Pagination.Ellipsis /> : ""}
        {props.currentPage !== 1 && prev !== 1 ? (
          <Pagination.Item
            active={props.currentPage === prev}
            onClick={() => {
              props.click(prev);
            }}
          >
            {prev}
          </Pagination.Item>
        ) : (
          ""
        )}
        <Pagination.Item
          active={props.currentPage}
          onClick={() => {
            props.click(props.currentPage);
          }}
        >
          {props.currentPage}
        </Pagination.Item>
        {props.currentPage !== amountPages && next !== amountPages ? (
          <Pagination.Item
            active={props.currentPage + 1 === props.currentPage}
            onClick={() => {
              props.click(props.currentPage + 1);
            }}
          >
            {props.currentPage + 1}
          </Pagination.Item>
        ) : (
          ""
        )}
        {next + 1 < amountPages ? <Pagination.Ellipsis /> : ""}
        {props.currentPage !== amountPages ? (
          <Pagination.Item
            active={amountPages === props.currentPage}
            onClick={() => {
              props.click(amountPages);
            }}
          >
            {amountPages}
          </Pagination.Item>
        ) : (
          ""
        )}
        <Pagination.Next
          disabled={props.currentPage === amountPages ? true : false}
          onClick={() => {
            props.click(props.currentPage + 1);
          }}
        />
      </Pagination>
    </div>
  ) : (
    ""
  );
}

Pagination.scss代码(原问题版本)

.pages {
  margin-top: 16px;
  @include flexBox(center, center);
  @import "~bootstrap/scss/bootstrap";
  .pagination-block {
    .pagination {
      display: flex;
      list-style: none;
      padding-left: 0;
    }
  }
}

问题对比

  • 局部引入样式时:局部引入样式时分页无禁用激活状态
  • 全局引入样式时:全局引入样式时分页显示正常

解决方案

问题根源

将Bootstrap样式嵌套在.pages类内部引入时,Bootstrap的原CSS选择器会被自动添加.pages前缀(如.pages .page-item.active),但React Bootstrap生成的分页DOM元素的类名层级无法匹配该嵌套选择器,导致样式无法生效。

具体解决方法

1. 移除外层嵌套,全局引入Bootstrap样式(推荐)

将Bootstrap样式引入放在SCSS文件最外层,避免嵌套:

@import "~bootstrap/scss/bootstrap";

.pages {
  margin-top: 16px;
  @include flexBox(center, center);
  .pagination-block {
    .pagination {
      display: flex;
      list-style: none;
      padding-left: 0;
    }
  }
}

2. 按需引入Bootstrap分页相关样式

如果不想引入完整Bootstrap,仅导入分页所需的SCSS模块:

.pages {
  margin-top: 16px;
  @include flexBox(center, center);
  
  // 引入Bootstrap基础依赖
  @import "~bootstrap/scss/functions";
  @import "~bootstrap/scss/variables";
  @import "~bootstrap/scss/mixins";
  
  // 仅导入分页样式
  @import "~bootstrap/scss/pagination";

  .pagination-block {
    .pagination {
      display: flex;
      list-style: none;
      padding-left: 0;
    }
  }
}

3. 使用:global()包裹Bootstrap引入(CSS Modules场景)

若使用Next.js的CSS Modules,用:global()避免类名被哈希化:

.pages {
  margin-top: 16px;
  @include flexBox(center, center);
  
  :global {
    @import "~bootstrap/scss/bootstrap";
  }

  .pagination-block {
    .pagination {
      display: flex;
      list-style: none;
      padding-left: 0;
    }
  }
}

4. 全局导入Bootstrap样式(官方推荐)

在Next.js的_app.js/_app.tsx中全局引入Bootstrap样式,确保所有React Bootstrap组件都能正常获取样式:

// pages/_app.js
import 'bootstrap/dist/css/bootstrap.min.css';

function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

export default MyApp;

内容的提问来源于stack exchange,提问作者Rahil Əliyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:01:10