How to use the new Bootstrap 5 with React
Bootstrap and React have both been around for a while now, but now that the Bootstrap 5 beta is out, there's finally something to cheer about! 🙌
Now that Bootstrap 5 no longer requires jQuery, using it in your React app is much easier and without conflicts! 😲 Now that Bootstrap 5 components are written as vanilla JS plugins, you get improved alignment with React's best patterns & practices.
This also means it's possible to use Bootstrap 5 components without the need for a 3rd party library like react-bootstrap or reactstrap.
First up, add Bootstrap to your React app's package.json
:
npm install bootstrap --save
Once Bootstrap is included, you'll be able to import
components the way you do with any JS module. For example, let's import Bootstrap's Toast component...
import { Toast} from bootstrap
And then use it with React's useEffect
and useState
hooks...
function ToastDemo() {
var [toast, setToast] = useState(false);
const toastRef = useRef();
useEffect(() => {
var myToast = toastRef.current
var bsToast = bootstrap.Toast.getInstance(myToast)
if (!bsToast) {
// initialize Toast
bsToast = new Toast(myToast, {autohide: false})
// hide after init
bsToast.hide()
setToast(false)
}
else{
// toggle
toast ? bsToast.show() : bsToast.hide()
}
})
return (
<div className="py-2">
<button className="btn btn-success" onClick={() => setToast(toast => !toast)}>
Toast {toast?'hide':'show'}
</button>
<div className="toast" role="alert" ref={toastRef}>
<div className="toast-header">
<strong className="me-auto">Bootstrap 5</strong>
<small>4 mins ago</small>
<button type="button" className="btn-close" onClick={() => setToast(false)} aria-label="Close"></button>
</div>
<div className="toast-body">
Hello, world! This is a toast message.
</div>
</div>
</div>
)
}
Or, (if that wasn't easy enough) use the new namespaced data-bs-
attributes directly in your markup. For example, let's use the Bootstrap 5 Collapse component...
function CollapseDemo() {
return (
<div className="py-2">
<button className="btn btn-primary" data-bs-target="#collapseTarget" data-bs-toggle="collapse">
Toggle collapse
</button>
<div className="collapse" id="collapseTarget">
This is the toggle-able content!
</div>
</div>
)
}
Now you can easily use any of the Bootstrap 5 Components in your React project. Check out these Bootstrap 5 React examples that use the Bootstrap 5 Toast, Alert, Collapse, Modal, Tooltip and Popover. Also be sure to take a look at all the new updates in Bootstrap 5.
What do you think? Do you plan on bringing Bootstrap 5 into your next React project, or do you prefer a different React friendly design system?
Top comments (16)
Aren't we supposed to avoid direct interaction with the DOM in a React app? Your useState targets the element directly by name; and also directly adds an event listener. Is there another way to make use of Bootstrap without the 3rd party libraries?
This is a great question and you're absolutely right! As explained in the React hooks FAQ you'd want
useRef
in this case. This will ensure we get the.current
instance of the DOM element that's synched with the React lifecycle. I've updated the Toast example accordingly...I also updated the other examples to follow this same pattern.
Thank you for the article, I have checked the examples and still can't be sure if it is okay to use bs components with only data-bs attribute.
Is it a bad practice for React virtual dom to use it like below.
For some or maybe most of these examples you should probably also add an empty array for the useEffect dependencies. Basically saying that we only want to run this code once (to create the component), then it does not have to run again as long as the component is left in the DOM tree.
But then the
bsToast.show()
orbsToast.hide()
wouldn't trigger when the state oftoast
changes. In my case I only added[toast]
to the useEffect dependencies.why the error 'bootstrap' is not defined appear? the bootstrap.Toast give error. where the bootstrap comes from?
I did something similar with the Modal component. But I also had to include an event listener when the user clicks outside of the modal to close it:
Please Provide an example for the Dropdown Component.
It works just like the others. See: codeply.com/p/IdzoX6osI2
Thank you.
Great explaination and example links ⭐️
Yes, as Joel rightly pointed out what you have done - is it the right way to do things in React?
Nice tutorial, thanks.
For those who are looking for ready to use solutions - you can also try out this Bootstrap 5 & React free UI KIT by MDB
mdbootstrap.com/docs/b5/react/
For those who are struggling with the navbar and the toggler, here is a good example. dev.to/johnotu/how-to-toggle-boots...
So does this make Reactstrap and React Bootstrap obsolete?
I don't think so, it just makes it possible to use Bootstrap in React in a way that aligns with React patterns/practices.