How to Add Classes Dynamically Based on State or Props in React
Adding classes based on some condition is a problem I face quite often in React.
Suppose we wanted to add an active or ready class to a <div> depending on the isActive and isReady states below, respectively.
const [isActive, setIsActive] = useState(false);
const [isReady, setIsReady] = useState(false);
Using Ternary Operator
We can add the class using a simple ternary operator. If isActive is true, then we’ll set className to active, otherwise, there will be no class.
<div className={isActive ? "active" : ""}></div>
What if we want a class to remain constant and another to be dynamic?
<div className={`constant1 ${isActive ? "active" : ""}`}></div>
What if we want multiple constant classes or multiple dynamic ones?
<div
className={`
constant1
constant2
${isActive ? "active" : ""}
${isReady ? "ready" : ""}
`}
></div>
active will depend on isActive while ready depends solely on isReady.
Using classnames
classnames is a lightweight, JavaScript library for just this purpose.
After installing classnames, we can use the classNames() function.
We can input an object structure, setting constant class names to true and dynamic ones to their respective variables.
<div
className={
classNames({
constant1: true,
constant2: true,
active: isActive,
ready: isReady,
})
}
></div>
We can also pass the constant classes as parameters to this function.
<div
className={
classNames(
"constant1",
"constant2",
{
active: isActive,
ready: isReady
}
)
}
></div>