Register to get access to free programming courses with interactive exercises

Handling class names JS: React

Interactive UI elements have more than one display state. For example, the modal window may be open or closed, and the switch may be on or off. It's generally accepted that you should change these states using classes.

When you work directly with the DOM, you can use classList, which contains convenient methods for adding and removing classes. React doesn't offer much convenience out of the box. The className property is just a string, and strings are awkward to process.

class Button extends React.Component {
  render () {
    const { isPressed, isHovered, label } = this.props;
    let btnClass = 'btn';
    if (isPressed) {
      // We have to concatenate classes
      btnClass += ' btn-pressed';
    } else if (isHovered) {
      btnClass += ' btn-over';
    return <button className={btnClass}>{label}</button>;

To solve this problem, the creators of React recommend using the classnames package. Its principle is simple: instead of manipulating a string directly, you need to generate the right object, which will then be converted into a string.

import cn from 'classnames';

class Button extends React.Component {
  render () {
    const { isPressed, isHovered, label } = this.props;
    // the value is true or false. If true, the class will be enabled, if false, it won't be
    // 'btn' is the class that will be substituted in any case
    const btnClass = cn('btn', {
      'btn-pressed': isPressed,
      'btn-over': !isPressed && isHovered,
    return <button className={btnClass}>{label}</button>;

Let's substitute specific values:

const btnClass = cn('btn', {
  'btn-pressed': false,
  'btn-over': true,

console.log(btnClass); // 'btn btn-over'

The cn() function is designed to accept any number of arguments as input. If the argument is a string, it's considered a required class. If it's an object, then the logic described above will work.

const btnClass = cn('btn', 'another-class', {
  'btn-pressed': isPressed,
  'btn-over': !isPressed && isHovered,

Mandatory classes can also be set in the object itself:

const btnClass = cn({
  'btn something-else': true
  'btn-pressed': isPressed,
  'btn-over': !isPressed && isHovered,

Sometimes, the class name is generated dynamically. In that case, the following code can be used:

const buttonType = 'primary';
const btnClass = cn('btn', `btn-${buttonType}`);
console.log(btnClass); // 'btn btn-primary'
// Or what's the same
// const btnClass = cn('btn', {
//   [`btn-${buttonType}`]: true
// });

Recommended materials

  1. classnames (documentation)

Hexlet Experts

Are there any more questions? Ask them in the Discussion section.

The Hexlet support team or other students will answer you.

About Hexlet learning process

For full access to the course you need a professional subscription.

A professional subscription will give you full access to all Hexlet courses, projects and lifetime access to the theory of lessons learned. You can cancel your subscription at any time.

Get access
hours of theory

Sign up

Programming courses for beginners and experienced developers. Start training for free

  • 130 courses, 2000+ hours of theory
  • 1000 practical tasks in a browser
  • 360 000 students
By sending this form, you agree to our Personal Policy and Service Conditions

Our graduates work in companies:

<span class="translation_missing" title="translation missing:">Bookmate</span>
<span class="translation_missing" title="translation missing:">Healthsamurai</span>
<span class="translation_missing" title="translation missing:">Dualboot</span>
<span class="translation_missing" title="translation missing:">Abbyy</span>
Suggested learning programs

From a novice to a developer. Get a job or your money back!

Frontend Developer icon
Development of front-end components for web applications
start anytime 10 months

Use Hexlet to the fullest extent!

  • Ask questions about the lesson
  • Test your knowledge in quizzes
  • Practice in your browser
  • Track your progress

Sign up or sign in

By sending this form, you agree to our Personal Policy and Service Conditions
Toto Image

Ask questions if you want to discuss a theory or an exercise. Hexlet Support Team and experienced community members can help find answers and solve a problem.