我可以使用React Bootstrap和Next.js吗?

35

有人知道是否可以在Next.js中使用react-bootstrap吗?我正在使用它们的最新版本,在此时我可以提供代码,但目前我的应用程序没有抛出任何错误,只是没有注册任何react-bootstrap组件。也许有一些诀窍我无法在互联网上找到吗?如果需要,我可以提供代码或文件结构。提前感谢!

next.config.js

const withCSS = require('@zeit/next-css')

module.exports = withCSS({
    /* my next config */
})

页面/index.js

import Badge from 'react-bootstrap/Badge';
import "../public/css/bootstrap.css";
const Index = () => (
    <div>
        <p className='display-4'>Hello</p>
        <Badge>Heading</Badge>
    </div>
)

export default Index;

package.json

{
  "name": "vacation-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@zeit/next-css": "^1.0.1",
    "next": "^9.1.1",
    "react": "^16.10.2",
    "react-bootstrap": "^1.0.0-beta.14",
    "react-dom": "^16.10.2"
  }
}

1
是的,您应该提供最小化、可运行的代码结构。 - ravibagul91
使用className“display-4”是有效的,这意味着我下载的Bootstrap可以独立工作。但是React-Bootstrap无法注册。 - austinw
然而,使用从react-bootstrap导入的Badge组件,我刚刚注意到在使用chrome开发工具时,它将Badge组件注册为一个class为“badge”的span元素...这是否意味着react-bootstrap是半工作状态?在浏览器中,它不显示任何格式,只显示内部HTML中的文本。 - austinw
如果在开发工具中显示了 span,那么你的 react-bootstrap 已经正常工作了。你只需要提供 variant="primary",就像这样 <Badge variant="primary">Heading</Badge>。更多关于 variant 的信息请参阅。 - ravibagul91
你能否将bootstrap作为依赖添加进去? npm i bootstrap --save - ravibagul91
显示剩余2条评论
6个回答

60

是的,在nextjs应用程序中可以使用react-bootstrap。

你可能会遇到的一个问题是,如果用户浏览器中禁用了javascript并且您使用react-bootstrap组件来构建布局(请参见以下示例),则应用程序的渲染将出现问题。

Nextjs允许您显示SSG/SSR页面,没有启用javascript的用户仍然可以看到您的应用程序,但布局可能会混乱。

但如果您仍想使用它:

npm i react-bootstrap bootstrap

在你的_app.js中导入Bootstrap样式:

import 'bootstrap/dist/css/bootstrap.min.css';

您可以像在ReactJS中一样使用您的React-Bootstrap组件:

import {Container, Row, Col} from 'react-bootstrap';
        
const Layout = () => (
  <>
    <Container fluid>
      <Row>
        <Col>
          <p>Yay, it's fluid!</p>
        </Col>
      </Row>
    </Container>
  </>
);
        
export default Layout;

24

是的,我正在使用它!
您可以按照egdavid的答案配置react-bootstrap

我发现的唯一问题是链接在SPA方面无法正常工作。
为此,我找到了以下解决方案。 如果您想在链接上显示超链接,则必须将NavBar.Link包装在Link中,并使用passHref属性。

<Link href="/" passHref>
    <Nav.Link>Home</Nav.Link>
</Link>
<Link href="/contact" passHref>
    <Nav.Link>Contact</Nav.Link>
</Link>

10
可以使用它。 我认为最重要的问题是服务器端渲染是否支持next js和react-bootstrap的组合? 是的,在react-bootstrap文档中,你可以看到如何实现这个选项。

https://react-bootstrap.github.io/docs/getting-started/server-side-rendering

你可以这样做:
import SSRProvider from 'react-bootstrap/SSRProvider';

   <SSRProvider>
     <App />
   </SSRProvider>

3
是的,你可以在next.js中使用bootstrap和react-bootstrap。
我在我的应用程序中使用它,
这里有一个简单的示例,只是为了测试如何使用导航栏和模态框组件。
1- 首先通过以下命令安装"react-bootstrap bootstrap":
npm install react-bootstrap bootstrap

2- 在"_app.js"文件中,在文件顶部导入Bootstrap CSS文件,并在useEffect函数内导入Bootstrap JS文件,如下所示:
import { useEffect } from 'react';
import Nav from '../components/nav'
import 'bootstrap/dist/css/bootstrap.css';


function MyApp({ Component, pageProps }) {
    
    useEffect(() => {
        require ('bootstrap/dist/js/bootstrap.js')
    }, []);

  return (
    <>
        <Nav />
        <Component {...pageProps} />  
    </>
 
  )
}

3- 这是我的导航组件,用于测试(与Bootstrap 5兼容)... :
import { useState } from "react";
import {Modal, Button} from 'react-bootstrap';

const Nav = () => {
    const [show, setShow] = useState(false);
    const handleClose = () => setShow(false);
    const handleShow = () => setShow(true);

    const confirm_modal = () => {
        console.log('modal is working ...')
        setShow(false)
    }

    return(
        <>

<nav className="navbar navbar-expand-lg navbar-light bg-light">
  <div className="container-fluid">
    <a className="navbar-brand" href="#">Navbar</a>
    <button className="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span className="navbar-toggler-icon"></span>
    </button>
    <div className="collapse navbar-collapse" id="navbarSupportedContent">
      <ul className="navbar-nav me-auto mb-2 mb-lg-0">

        <li className="nav-item">
          <a className="nav-link" onClick={handleShow} href="#"> test modal</a>
        </li>
        <li className="nav-item dropdown">
          <a className="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
            Dropdown
          </a>
          <ul className="dropdown-menu" aria-labelledby="navbarDropdown">
            <li><a className="dropdown-item" href="#">Action</a></li>
            <li><a className="dropdown-item" href="#">Another action</a></li>
            <li><hr className="dropdown-divider" /></li>
            <li><a className="dropdown-item" href="#">Something else here</a></li>
          </ul>
        </li>

      </ul>
      <form className="d-flex">
        <input className="form-control me-2" type="search" placeholder="Search" aria-label="Search" />
        <button className="btn btn-outline-success" type="submit">Search</button>
      </form>
    </div>
  </div>
</nav>



      <Modal show={show} onHide={handleClose}  keyboard="false">
        <Modal.Header closeButton>
          <Modal.Title>Modal heading</Modal.Title>
        </Modal.Header>
        <Modal.Body>Are You Sure You Want This!.</Modal.Body>
        <Modal.Footer>
          <Button variant="secondary" onClick={handleClose}>
            Close
          </Button>
          <Button variant="danger" onClick={ confirm_modal  }>
          Yes
          </Button>
        </Modal.Footer>
      </Modal>
 
        </>
    )
}

export default Nav

4- 现在创建任何页面(例如index.js)并进行测试。
如何进行测试:
1- 如果您在导航栏上看到Bootstrap样式(颜色,按钮样式),那就意味着“Bootstrap CSS工作正常”。
2- 如果下拉菜单可点击且正常工作,则表示Bootstrap JS文件工作正常。
3- 如果测试模态框能够正常工作并显示确认框,那就意味着React-Bootstrap组件工作正常。
这只是一个示例,请根据您的情况/要求进行更改。
希望对您有所帮助。

1

我想我们可以在这里添加一个更新。

在NextJS应用程序中使用react-bootstrap总是可以的,即使在最新的NextJs 13.4.x更新中,它添加了新的应用程序目录。

但是现在,为了保持应用程序运行,如果您决定移动到此最新更新并使用应用程序目录,则必须在组件顶部使用指令“use client”来使用和导入react-bootstrap组件,以便您正在使用应用程序中的每个单独组件。

React组件示例:

import { Container } from 'react-bootstrap';

const myReactComponentWithRB: React.FC<{}> = ({}) => {
   return (
       <Container>
         <h1>This is a test</h1>
       </Container>
   );
});

export default myReactComponentWithRB;

通常情况下,这段代码没有问题。但是如果您使用新的应用程序目录导入此组件,则需要在文件顶部添加"use client",或者您可以将其添加到包含此组件的文件顶部。但是如果您这样做,该组件将不会由Next服务器呈现,而是由浏览器呈现。

谢谢这个更新。我觉得它非常有用。如果你不是在使用react-bootstrap来处理所有的JSX组件,那么安装它就没有什么意义了。这意味着你将牺牲Next.js的整个服务器端方面——这是它的默认设置。这个问题呼唤着需要一个nextjs-bootstrap分支的react-bootstrap库,它是“use client”兼容的。 - Timothy Bushell
1
我想我们必须等待,因为react-bootstrap必须将所有组件迁移到使用服务器组件的react 18版本,但目前,您必须使用"use client"指令,这相当令人沮丧。 - Costa.S

0

没错,你可以使用它,在pages/index.js中的<head>标签内提供CDN链接即可。

import Head from 'next/head';
import Badge from 'react-bootstrap/Badge';
import "../public/css/bootstrap.css";
const Index = () => (
    <Head>
      <link
        rel="stylesheet"
        href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
        integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
        crossorigin="anonymous"
      />
    </Head>
    <div>
        <p className='display-4'>Hello</p>
        <Badge>Heading</Badge>
    </div>
)

export default Index;

希望它能正常工作!!!


3
使用Bootstrap和Next.js而不使用CDN是不可能的。 - nikoss
你可以下载 CSS 文件并将其托管在你的资产文件中。你也可以在 _app.js 文件中像上面的例子一样执行 import 'bootstrap/dist/css/bootstrap.min.css'; - efleurine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接