DEV Community

Cover image for Understanding React Hooks: A Beginner's Guide
kumarshivam1998
kumarshivam1998

Posted on

Understanding React Hooks: A Beginner's Guide

React Hooks are a powerful feature in React that allow you to use state and other React features without writing a class. Introduced in React 16.8, hooks make it easier to manage state and side effects in your functional components. In this blog post, we'll explore the basics of React Hooks and how you can use them in your projects.

Why Hooks?

Before hooks, if you wanted to use state in a React component, you had to use a class component. This often led to more complex and less readable code. Hooks solve this problem by allowing you to use state and other features in functional components, which are typically simpler and easier to work with.

The Most Common Hooks

There are several hooks available in React, but we'll focus on the two most commonly used ones: useState and useEffect.

useState
The useState hook lets you add state to your functional components. Here's how it works:

import React, { useState } from 'react';

function Counter() {
  // Declare a new state variable called "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

Enter fullscreen mode Exit fullscreen mode

In this example, we import useState from React. We then call useState(0) to initialize our state variable count with a value of 0. useState returns an array with two elements: the current state (count) and a function to update it (setCount). We use these in our component to display and update the count value.

useEffect
The useEffect hook lets you perform side effects in your components. It’s similar to lifecycle methods in class components like componentDidMount, componentDidUpdate, and componentWillUnmount.

import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  // Similar to componentDidMount and componentDidUpdate:
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  }, [count]); // Only re-run the effect if count changes

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

Enter fullscreen mode Exit fullscreen mode

In this example, we use useEffect to update the document title whenever the count changes. The function inside useEffect runs after every render by default. However, by providing [count] as the second argument, it only runs when count changes.

Rules of Hooks

When using hooks, there are a few rules you need to follow:

1- Only Call Hooks at the Top Level: Don’t call hooks inside loops, conditions, or nested functions. Always use them at the top level of your component so that React can preserve the state correctly.

2- Only Call Hooks from React Functions: You can call hooks from React functional components or custom hooks, but not from regular JavaScript functions.

Custom Hooks

Custom hooks allow you to extract and reuse stateful logic across components. They’re JavaScript functions whose names start with "use" and can call other hooks inside them.

import React, { useState, useEffect } from 'react';

// Custom hook to fetch data
function useFetchData(url) {
  const [data, setData] = useState(null);

  useEffect(() => {
    async function fetchData() {
      const response = await fetch(url);
      const result = await response.json();
      setData(result);
    }

    fetchData();
  }, [url]);

  return data;
}

function DataDisplay() {
  const data = useFetchData('https://api.example.com/data');

  if (!data) return <div>Loading...</div>;

  return (
    <div>
      <h1>Data</h1>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  );
}

Enter fullscreen mode Exit fullscreen mode

In this example, useFetchData is a custom hook that fetches data from a given URL. It uses useState to manage the data and useEffect to perform the fetch operation.

Conclusion

React Hooks are a game-changer for building React applications. They make it easier to write clean and maintainable code by enabling state and side effects in functional components. By understanding useState, useEffect, and custom hooks, you can unlock the full potential of hooks in your React projects.

Feel free to experiment with hooks in your projects and explore other hooks like useContext, useReducer, and more to enhance your applications even further!

Top comments (0)