DEV Community

Abhay Singh Kathayat
Abhay Singh Kathayat

Posted on

A Comprehensive Guide to Dynamic Styling in React

Dynamic Styling in React refers to the ability to change the appearance of a component or element based on some dynamic condition (like state or props) at runtime. Instead of using static styles, dynamic styling allows React components to update their styles based on user interaction, component state, or external conditions. This makes the user interface (UI) more interactive and responsive to user actions.

There are several ways to apply dynamic styling in React. Some of the most popular methods include using inline styles, CSS-in-JS libraries, and CSS classes.

Methods of Dynamic Styling in React

1. Inline Styles

Inline styles allow you to apply styles directly to a component’s element via a style attribute, which takes an object with camelCased property names and values.

Example: Dynamic Inline Styling with State
import React, { useState } from 'react';

function App() {
  const [isActive, setIsActive] = useState(false);

  const toggleStyle = () => setIsActive(!isActive);

  const buttonStyle = {
    backgroundColor: isActive ? 'green' : 'red',
    color: 'white',
    padding: '10px 20px',
    border: 'none',
    borderRadius: '5px',
    cursor: 'pointer',
  };

  return (
    <div>
      <button style={buttonStyle} onClick={toggleStyle}>
        {isActive ? 'Active' : 'Inactive'}
      </button>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

In this example, the button's backgroundColor is dynamically changed based on the isActive state. The toggleStyle function toggles the state, which in turn updates the style.

2. CSS-in-JS (Styled Components)

CSS-in-JS libraries like Styled Components allow you to write CSS directly within your JavaScript file. This approach supports dynamic styling based on component props or state.

Example: Dynamic Styling with Styled Components
npm install styled-components
Enter fullscreen mode Exit fullscreen mode
import React, { useState } from 'react';
import styled from 'styled-components';

const Button = styled.button`
  background-color: ${props => (props.active ? 'green' : 'red')};
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
`;

function App() {
  const [isActive, setIsActive] = useState(false);

  const toggleStyle = () => setIsActive(!isActive);

  return (
    <div>
      <Button active={isActive} onClick={toggleStyle}>
        {isActive ? 'Active' : 'Inactive'}
      </Button>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

In this example, the Button component is styled dynamically using the active prop. The background-color changes based on whether the active prop is true or false.

3. CSS Classes with Conditional Rendering

You can also conditionally apply CSS classes to elements based on the component's state or props. This method allows you to combine regular CSS with React’s dynamic behavior.

Example: Dynamic Styling with Conditional Class Names
import React, { useState } from 'react';
import './App.css';

function App() {
  const [isActive, setIsActive] = useState(false);

  const toggleStyle = () => setIsActive(!isActive);

  return (
    <div>
      <button
        className={isActive ? 'active-btn' : 'inactive-btn'}
        onClick={toggleStyle}
      >
        {isActive ? 'Active' : 'Inactive'}
      </button>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode
/* App.css */
.active-btn {
  background-color: green;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}

.inactive-btn {
  background-color: red;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}
Enter fullscreen mode Exit fullscreen mode

In this example, the button's style is dynamically switched between the active-btn and inactive-btn CSS classes, based on the isActive state.

4. TailwindCSS with Conditional Classes

When using a utility-first CSS framework like TailwindCSS, dynamic styling can be achieved by conditionally applying utility classes.

Example: Dynamic Styling with TailwindCSS
import React, { useState } from 'react';

function App() {
  const [isActive, setIsActive] = useState(false);

  const toggleStyle = () => setIsActive(!isActive);

  return (
    <div>
      <button
        className={`px-4 py-2 text-white rounded ${
          isActive ? 'bg-green-500' : 'bg-red-500'
        }`}
        onClick={toggleStyle}
      >
        {isActive ? 'Active' : 'Inactive'}
      </button>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

In this example, we use TailwindCSS utility classes and conditionally apply the bg-green-500 or bg-red-500 class depending on the isActive state.

5. Dynamic Styling with React Context

For complex applications, it might be useful to apply dynamic styles globally across components based on a shared state. In such cases, React Context can be used to manage the styling logic.

Example: Dynamic Theme with React Context
import React, { useState, useContext } from 'react';

// Create a Context
const ThemeContext = React.createContext();

const ThemeProvider = ({ children }) => {
  const [isDark, setIsDark] = useState(false);

  const toggleTheme = () => setIsDark(!isDark);

  return (
    <ThemeContext.Provider value={{ isDark, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

const ThemedButton = () => {
  const { isDark, toggleTheme } = useContext(ThemeContext);

  return (
    <button
      style={{
        backgroundColor: isDark ? '#333' : '#fff',
        color: isDark ? '#fff' : '#333',
        padding: '10px 20px',
        border: 'none',
        borderRadius: '5px',
      }}
      onClick={toggleTheme}
    >
      Toggle Theme
    </button>
  );
};

function App() {
  return (
    <ThemeProvider>
      <div>
        <ThemedButton />
      </div>
    </ThemeProvider>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

In this example, ThemeContext is used to manage a dark theme and toggle between two styles. The ThemedButton component dynamically applies styles based on the isDark value from the context.

Conclusion

Dynamic styling in React is a powerful way to create interactive, responsive, and state-dependent UIs. Depending on the complexity of the project, you can use:

  • Inline styles for simple dynamic changes.
  • CSS-in-JS libraries like Styled Components for more advanced styling solutions.
  • CSS classes for standard CSS-based styling with dynamic class application.
  • Utility-first frameworks like TailwindCSS for conditional class-based styling.
  • React Context for global style management across components.

Each of these methods has its own benefits and is suited for different scenarios, so choose the one that best fits the needs of your project.

Top comments (0)