Creating a Custom React Hook Library

Creating a custom React hook library is a great way to encapsulate and share reusable logic across projects. In this tutorial, I'll guide you through the process of creating your own custom React hooks library. Let's get started!

Step 1: Setting up the project

  1. Create a new directory for your project. Open your terminal and run the following command:
  •     mkdir custom-hooks-library
    
  • Navigate into the project directory:

  •     cd custom-hooks-library
    
  • Initialize a new npm project:

  •     npm init -y
    
  • Next, create a src directory and a hooks subdirectory inside it:

  •     mkdir src
        mkdir src/hooks
    
  • Move into the src directory:

  •     cd src
    
  • Create an empty index.js file:

  •     touch index.js
    
  • Open the index.js file and add the following line:

  1.   export * from './hooks';
    

Step 2: Creating custom hooks

  1. Inside the src/hooks directory, create a new file for your first custom hook. For example, let's create a hook called useLocalStorage:
  •     touch useLocalStorage.js
    
  • Open the useLocalStorage.js file and define your custom hook. The useLocalStorage hook allows you to synchronize a value with the browser's local storage:

  1.   import { useState, useEffect } from 'react';
    
      export function useLocalStorage(key, initialValue) {
        const [value, setValue] = useState(() => {
          const storedValue = localStorage.getItem(key);
          return storedValue !== null ? JSON.parse(storedValue) : initialValue;
        });
    
        useEffect(() => {
          localStorage.setItem(key, JSON.stringify(value));
        }, [key, value]);
    
        return [value, setValue];
      }
    

    This hook uses the useState hook to manage the state and the useEffect hook to synchronize the value with the local storage.

  2. You can create more custom hooks by adding additional files to the src/hooks directory and following the same pattern.

Step 3: Consuming the custom hooks

To test your custom hooks, you can create a sample React component that uses them.

  1. Create a new directory called components inside the src directory:
  •     mkdir components
    
  • Move into the components directory:

  •     cd components
    
  • Create a new file called ExampleComponent.js:

  •     touch ExampleComponent.js
    
  • Open the ExampleComponent.js file and add the following code:

  •     import React from 'react';
        import { useLocalStorage } from '../hooks';
    
        export function ExampleComponent() {
          const [name, setName] = useLocalStorage('name', '');
    
          return (
            <div>
              <input
                type="text"
                value={name}
                onChange={(e) => setName(e.target.value)}
              />
              <p>Hello, {name}!</p>
            </div>
          );
        }
    

    In this example, we import the useLocalStorage hook from our custom hook library and use it to manage a value stored in local storage.

  • Next, go back to the src directory:

  •     cd ..
    
  • Open the index.js file and update it with the following code:

  •     import React from 'react';
        import ReactDOM from 'react-dom';
        import { ExampleComponent } from './components';
    
        ReactDOM.render(
          <React.StrictMode>
            <ExampleComponent />
          </React.StrictMode>,
          document.getElementById('root')
        );
    
  • Finally, create an HTML file called index.html in the project root directory and add the following code:

  1.   <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8" />
          <meta name="viewport" content="width=device-width, initial-scale=1.0" />
          <title>Custom Hooks Library</title>
        </head>
        <body>
          <div id="root"></div>
          <script src="./dist/bundle.js"></script>
        </body>
      </html>
    

Step 4: Building and running the project

  1. Install the required dependencies by running the following command in the project root directory:
  •     npm install react react-dom
    
  • Create a new file called webpack.config.js in the project root directory and add the following configuration:

  •     const path = require('path');
    
        module.exports = {
          mode: 'development',
          entry: './src/index.js',
          output: {
            filename: 'bundle.js',
            path: path.resolve(__dirname, 'dist'),
          },
          module: {
            rules: [
              {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                  loader: 'babel-loader',
                  options: {
                    presets: ['@babel/preset-react'],
                  },
                },
              },
            ],
          },
        };
    

    This configuration sets up Webpack to bundle our React code and transpile it using Babel.

  • Install the required dev dependencies by running the following command in the project root directory:

  •     npm install --save-dev webpack webpack-cli babel-loader @babel/core @babel/preset-react
    
  • Add a build script to the scripts section of the package.json file:

  •     "scripts": {
          "build": "webpack --config webpack.config.js"
        }
    
  • Run the build script to bundle your code:

  1.   npm run build
    
  2. Open the index.html file in a web browser, and you should see your example component rendered with the custom hook.

Congratulations! You have created your own custom React hook library. You can now create additional custom hooks in the src/hooks directory and import them into your components as needed. This approach will help you improve code maintainability and reduce development time by reusing common logic across projects.