Cover image for Getting Started with React Hooks

Getting Started with React Hooks

2025-09-04
5 min read
A

Animesh Pandey

Senior Software Engineer with 6+ years of experience in PHP, Python, and backend development.

Getting Started with React Hooks

React Hooks have revolutionized the way developers build components in React, offering a cleaner and more functional approach to managing state and side effects in functional components. Introduced in React 16.8, hooks allow you to use state and other React features without writing a class. In this blog post, we will explore the basics of React Hooks and provide practical examples to get you started.

What Are React Hooks?

React Hooks are functions that let you "hook into" React state and lifecycle features from function components. They provide a more intuitive and declarative way to manage state, handle side effects, and perform other component lifecycle tasks.

Why Use Hooks?

  • Simplification: Hooks simplify the code by eliminating the need for lifecycle methods.
  • Reusable Logic: Hooks enable you to reuse stateful logic without changing component hierarchy.
  • Functional Components: They allow you to use state and other React features without writing classes.

Key React Hooks

Let's dive into some of the most commonly used Hooks and see how they work.

1. useState

The useState hook lets you add state to your functional components.

import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}>Click me</button> </div> ); }

Explanation:

  • useState initializes the state variable count with a default value of 0.
  • setCount is the function that updates the state.

2. useEffect

The useEffect hook lets you perform side effects in function components, replacing lifecycle methods like componentDidMount, componentDidUpdate, and componentWillUnmount.

import React, { useState, useEffect } from 'react'; function Timer() { const [seconds, setSeconds] = useState(0); useEffect(() => { const interval = setInterval(() => { setSeconds(prevSeconds => prevSeconds + 1); }, 1000); return () => clearInterval(interval); }, []); return <h1>{seconds} seconds have passed.</h1>; }

Explanation:

  • The useEffect hook sets up a timer that updates the seconds state every second.
  • The cleanup function return () => clearInterval(interval); is called when the component is unmounted.

3. useContext

The useContext hook allows you to consume context without the need for a Context.Consumer wrapper.

import React, { useContext } from 'react'; const ThemeContext = React.createContext('light'); function ThemedButton() { const theme = useContext(ThemeContext); return <button className={theme}>I am a {theme} themed button</button>; }

Explanation:

  • useContext(ThemeContext) gets the current value of the ThemeContext.

Advanced Hooks

4. useReducer

The useReducer hook is usually preferable to useState when you have complex state logic.

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

Explanation:

  • useReducer takes a reducer function and an initial state.
  • dispatch is used to send actions to the reducer to update the state.

5. useMemo and useCallback

These hooks optimize performance by memoizing expensive functions and preventing unnecessary re-renders.

import React, { useState, useMemo, useCallback } from 'react'; function ExpensiveComponent({ compute }) { return <div>{compute()}</div>; } function App() { const [count, setCount] = useState(0); const compute = useMemo(() => { return () => { console.log('Computing...'); return count * 2; }; }, [count]); const increment = useCallback(() => setCount(c => c + 1), []); return ( <div> <ExpensiveComponent compute={compute} /> <button onClick={increment}>Increment</button> </div> ); }

Explanation:

  • useMemo caches the result of a computation.
  • useCallback returns a memoized version of a callback function.

Conclusion

React Hooks have dramatically changed the way we write React components, providing a more functional and declarative approach. By using hooks like useState, useEffect, and useContext, you can manage state and side effects more effectively in functional components. For more complex state management, useReducer can be a powerful alternative. As you become more comfortable with hooks, you can leverage useMemo and useCallback to optimize performance further.

React Hooks encourage a cleaner, more readable code style and enable you to reuse logic more effectively. As you continue to explore hooks, you'll find them to be an indispensable part of your React development toolkit. Happy coding!

Related Posts