DEV Community

Parth Raval
Parth Raval

Posted on

📘 30 Most Useful React Snippets

I. Basic Component Structures

  1. Functional Component (Basic):

    import React from 'react';
    
    const MyComponent = () => {
      return (
        <div>
          <p>Hello from MyComponent!</p>
        </div>
      );
    };
    
    export default MyComponent;
    
  2. Functional Component with Props:

    import React from 'react';
    
    const Greeting = ({ name }) => {
      return (
        <div>
          <h1>Hello, {name}!</h1>
        </div>
      );
    };
    
    export default Greeting;
    
  3. Class Component (Basic):

    import React, { Component } from 'react';
    
    class MyClassComponent extends Component {
      render() {
        return (
          <div>
            <p>Hello from MyClassComponent!</p>
          </div>
        );
      }
    }
    
    export default MyClassComponent;
    

II. State Management with Hooks

  1. useState for simple state:

    import React, { useState } from 'react';
    
    const Counter = () => {
      const [count, setCount] = useState(0);
    
      const increment = () => {
        setCount(count + 1);
      };
    
      return (
        <div>
          <p>Count: {count}</p>
          <button onClick={increment}>Increment</button>
        </div>
      );
    };
    
    export default Counter;
    
  2. useState with object state:

    import React, { useState } from 'react';
    
    const UserProfile = () => {
      const [user, setUser] = useState({ name: 'John Doe', age: 30 });
    
      const updateAge = () => {
        setUser(prevUser => ({ ...prevUser, age: prevUser.age + 1 }));
      };
    
      return (
        <div>
          <p>Name: {user.name}</p>
          <p>Age: {user.age}</p>
          <button onClick={updateAge}>Happy Birthday!</button>
        </div>
      );
    };
    
    export default UserProfile;
    
  3. useEffect for side effects (on mount/unmount):

    import React, { useEffect, useState } from 'react';
    
    const Timer = () => {
      const [seconds, setSeconds] = useState(0);
    
      useEffect(() => {
        const intervalId = setInterval(() => {
          setSeconds(prevSeconds => prevSeconds + 1);
        }, 1000);
    
        // Cleanup function
        return () => clearInterval(intervalId);
      }, []); // Empty dependency array means it runs once on mount and cleans up on unmount
    
      return (
        <div>
          <p>Seconds: {seconds}</p>
        </div>
      );
    };
    
    export default Timer;
    
  4. useEffect with dependencies:

    import React, { useEffect, useState } from 'react';
    
    const DataFetcher = ({ userId }) => {
      const [data, setData] = useState(null);
      const [loading, setLoading] = useState(true);
    
      useEffect(() => {
        setLoading(true);
        fetch(`https://api.example.com/users/${userId}`)
          .then(response => response.json())
          .then(json => {
            setData(json);
            setLoading(false);
          });
      }, [userId]); // Reruns when userId changes
    
      if (loading) return <p>Loading data...</p>;
      return <pre>{JSON.stringify(data, null, 2)}</pre>;
    };
    
    export default DataFetcher;
    
  5. useContext for global state (simple example):

    import React, { createContext, useContext, useState } from 'react';
    
    const ThemeContext = createContext(null);
    
    const ThemeProvider = ({ children }) => {
      const [theme, setTheme] = useState('light');
      const toggleTheme = () => setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));
    
      return (
        <ThemeContext.Provider value={{ theme, toggleTheme }}>
          {children}
        </ThemeContext.Provider>
      );
    };
    
    const ThemeButton = () => {
      const { theme, toggleTheme } = useContext(ThemeContext);
      return (
        <button onClick={toggleTheme}>Toggle Theme ({theme})</button>
      );
    };
    
    // Usage:
    // <ThemeProvider>
    //   <ThemeButton />
    // </ThemeProvider>
    
  6. useRef for direct DOM access or mutable values:

    import React, { useRef } from 'react';
    
    const FocusInput = () => {
      const inputRef = useRef(null);
    
      const handleClick = () => {
        inputRef.current.focus();
      };
    
      return (
        <div>
          <input type="text" ref={inputRef} />
          <button onClick={handleClick}>Focus Input</button>
        </div>
      );
    };
    
    export default FocusInput;
    
  7. useCallback for memoizing functions:

    import React, { useState, useCallback } from 'react';
    
    const Button = React.memo(({ onClick, children }) => {
      console.log('Button rendered');
      return <button onClick={onClick}>{children}</button>;
    });
    
    const ParentComponent = () => {
      const [count, setCount] = useState(0);
    
      // This function will only be recreated if `count` changes
      const handleClick = useCallback(() => {
        setCount(prevCount => prevCount + 1);
      }, []); // Empty dependency array means it's memoized once
    
      return (
        <div>
          <p>Count: {count}</p>
          <Button onClick={handleClick}>Increment Count</Button>
        </div>
      );
    };
    
    export default ParentComponent;
    
  8. useMemo for memoizing expensive calculations:

    import React, { useState, useMemo } from 'react';
    
    const ExpensiveCalculation = ({ value }) => {
      const result = useMemo(() => {
        console.log('Performing expensive calculation...');
        let sum = 0;
        for (let i = 0; i < value * 1000000; i++) {
          sum += i;
        }
        return sum;
      }, [value]); // Recalculates only when 'value' changes
    
      return (
        <div>
          <p>Value: {value}</p>
          <p>Result of expensive calculation: {result}</p>
        </div>
      );
    };
    
    const App = () => {
      const [input, setInput] = useState(10);
      return (
        <div>
          <input
            type="number"
            value={input}
            onChange={(e) => setInput(parseInt(e.target.value))}
          />
          <ExpensiveCalculation value={input} />
        </div>
      );
    };
    
    export default App;
    
  9. useReducer for complex state logic:

    import React, { useReducer } from 'react';
    
    const initialState = { count: 0 };
    
    function reducer(state, action) {
      switch (action.type) {
        case 'increment':
          return { count: state.count + 1 };
        case 'decrement':
          return { count: state.count - 1 };
        case 'reset':
          return { count: 0 };
        default:
          throw new Error();
      }
    }
    
    const CounterWithReducer = () => {
      const [state, dispatch] = useReducer(reducer, initialState);
      return (
        <div>
          <p>Count: {state.count}</p>
          <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
          <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
          <button onClick={() => dispatch({ type: 'reset' })}>Reset</button>
        </div>
      );
    };
    
    export default CounterWithReducer;
    

III. Conditional Rendering

  1. Conditional rendering with &&:

    import React from 'react';
    
    const UserGreeting = ({ isLoggedIn }) => {
      return (
        <div>
          {isLoggedIn && <h2>Welcome back!</h2>}
          {!isLoggedIn && <h2>Please log in.</h2>}
        </div>
      );
    };
    
    export default UserGreeting;
    
  2. Conditional rendering with ternary operator:

    import React from 'react';
    
    const AdminPanel = ({ isAdmin }) => {
      return (
        <div>
          {isAdmin ? (
            <p>Welcome, Admin!</p>
          ) : (
            <p>You do not have administrative access.</p>
          )}
        </div>
      );
    };
    
    export default AdminPanel;
    

IV. List Rendering

  1. Basic list rendering with map and key:

    import React from 'react';
    
    const ItemList = ({ items }) => {
      return (
        <ul>
          {items.map(item => (
            <li key={item.id}>{item.name}</li>
          ))}
        </ul>
      );
    };
    
    export default ItemList;
    

V. Event Handling

  1. Inline arrow function for event handler:

    import React from 'react';
    
    const MyButton = () => {
      const handleClick = () => {
        alert('Button clicked!');
      };
    
      return (
        <button onClick={handleClick}>Click Me</button>
      );
    };
    
    export default MyButton;
    
  2. Passing event object to handler:

    import React, { useState } from 'react';
    
    const InputField = () => {
      const [text, setText] = useState('');
    
      const handleChange = (event) => {
        setText(event.target.value);
      };
    
      return (
        <input type="text" value={text} onChange={handleChange} placeholder="Type here..." />
      );
    };
    
    export default InputField;
    

VI. Forms

  1. Controlled input component:

    import React, { useState } from 'react';
    
    const MyForm = () => {
      const [value, setValue] = useState('');
    
      const handleChange = (e) => {
        setValue(e.target.value);
      };
    
      const handleSubmit = (e) => {
        e.preventDefault();
        console.log('Submitted value:', value);
        setValue(''); // Clear input after submission
      };
    
      return (
        <form onSubmit={handleSubmit}>
          <input type="text" value={value} onChange={handleChange} />
          <button type="submit">Submit</button>
        </form>
      );
    };
    
    export default MyForm;
    

VII. Styling

  1. Inline styles:

    import React from 'react';
    
    const StyledDiv = () => {
      const divStyle = {
        color: 'blue',
        fontSize: '16px',
        border: '1px solid black',
        padding: '10px'
      };
    
      return (
        <div style={divStyle}>
          This text is styled inline.
        </div>
      );
    };
    
    export default StyledDiv;
    
  2. CSS Modules (example structure):

    // styles/MyComponent.module.css
    // .container {
    //   background-color: lightgray;
    //   padding: 20px;
    // }
    // .text {
    //   color: green;
    // }
    
    // MyComponent.jsx
    import React from 'react';
    import styles from './styles/MyComponent.module.css';
    
    const MyComponent = () => {
      return (
        <div className={styles.container}>
          <p className={styles.text}>Styled with CSS Modules</p>
        </div>
      );
    };
    
    export default MyComponent;
    

VIII. Component Patterns

  1. Higher-Order Component (HOC) - Basic:

    import React from 'react';
    
    const withLogger = (WrappedComponent) => {
      return (props) => {
        console.log('Props:', props);
        return <WrappedComponent {...props} />;
      };
    };
    
    const MyPlainComponent = ({ message }) => <div>{message}</div>;
    
    const MyLoggedComponent = withLogger(MyPlainComponent);
    
    // Usage: <MyLoggedComponent message="Hello HOC!" />
    
  2. Render Props Pattern:

    import React, { useState } from 'react';
    
    const MouseTracker = ({ render }) => {
      const [position, setPosition] = useState({ x: 0, y: 0 });
    
      const handleMouseMove = (event) => {
        setPosition({
          x: event.clientX,
          y: event.clientY,
        });
      };
    
      return (
        <div style={{ height: '100vh' }} onMouseMove={handleMouseMove}>
          {render(position)}
        </div>
      );
    };
    
    const App = () => {
      return (
        <MouseTracker
          render={({ x, y }) => (
            <h1>
              The mouse position is ({x}, {y})
            </h1>
          )}
        />
      );
    };
    
    export default App;
    
  3. Custom Hook for reusable logic:

    import { useState, useEffect } from 'react';
    
    const useWindowWidth = () => {
      const [width, setWidth] = useState(window.innerWidth);
    
      useEffect(() => {
        const handleResize = () => setWidth(window.innerWidth);
        window.addEventListener('resize', handleResize);
        return () => window.removeEventListener('resize', handleResize);
      }, []);
    
      return width;
    };
    
    const MyResponsiveComponent = () => {
      const width = useWindowWidth();
    
      return (
        <div>
          <p>Window width: {width}px</p>
          {width > 768 ? <p>Large screen</p> : <p>Small screen</p>}
        </div>
      );
    };
    
    export default MyResponsiveComponent;
    

IX. Error Handling

  1. Error Boundary (Class Component - for production apps):

    import React, { Component } from 'react';
    
    class ErrorBoundary extends Component {
      constructor(props) {
        super(props);
        this.state = { hasError: false, error: null, errorInfo: null };
      }
    
      static getDerivedStateFromError(error) {
        return { hasError: true };
      }
    
      componentDidCatch(error, errorInfo) {
        console.error("ErrorBoundary caught an error:", error, errorInfo);
        this.setState({ error, errorInfo });
      }
    
      render() {
        if (this.state.hasError) {
          return (
            <div>
              <h1>Something went wrong.</h1>
              {this.state.error && <details style={{ whiteSpace: 'pre-wrap' }}>
                {this.state.error.toString()}
                <br />
                {this.state.errorInfo.componentStack}
              </details>}
            </div>
          );
        }
        return this.props.children;
      }
    }
    
    // Usage:
    // <ErrorBoundary>
    //   <MyProblematicComponent />
    // </ErrorBoundary>
    

X. Performance Optimization

  1. React.memo for functional components:
    (See snippet 10: useCallback for an example of React.memo usage)

  2. Lazy loading components with React.lazy and Suspense:

    import React, { lazy, Suspense } from 'react';
    
    const LazyComponent = lazy(() => import('./LazyComponent'));
    
    const App = () => {
      return (
        <div>
          <h1>My App</h1>
          <Suspense fallback={<div>Loading component...</div>}>
            <LazyComponent />
          </Suspense>
        </div>
      );
    };
    
    export default App;
    

XI. Miscellaneous

  1. Fragment for returning multiple elements:

    import React from 'react';
    
    const MyFragmentComponent = () => {
      return (
        <>
          <p>First paragraph</p>
          <p>Second paragraph</p>
        </>
      );
    };
    
    export default MyFragmentComponent;
    
  2. Passing children as props:

    import React from 'react';
    
    const Card = ({ title, children }) => {
      return (
        <div style={{ border: '1px solid #ccc', padding: '15px', margin: '10px' }}>
          <h2>{title}</h2>
          {children}
        </div>
      );
    };
    
    const App = () => {
      return (
        <Card title="My Awesome Card">
          <p>This is some content inside the card.</p>
          <button>Click me!</button>
        </Card>
      );
    };
    
    export default App;
    
  3. Destructuring props for cleaner code:
    (See snippet 2: Functional Component with Props for an example of destructuring name from props)

  4. Spreading props:

    import React from 'react';
    
    const Input = ({ type, placeholder, ...rest }) => {
      return <input type={type} placeholder={placeholder} {...rest} />;
    };
    
    const App = () => {
      return (
        <Input
          type="text"
          placeholder="Enter your name"
          maxLength={50}
          style={{ border: '2px solid blue' }}
          onChange={(e) => console.log(e.target.value)}
        />
      );
    };
    
    export default App;
    

Top comments (0)