React.js 05: Custom Hooks


Docs

https://react.dev/learn/reusing-logic-with-custom-hooks


Problem Statement

I want to reuse code logic that includes a React Hook i.e. useEffect() with call to a database.

Solution

Create a custom hook.


Custom Hook: Example One

useCounter.js

import { useState, useEffect } from "react";

export const useCounter = (start = 0) => {
  // set the state
  const [counter, setCounter] = useState(start);

  // use the effect whenever counter changes
  useEffect(() => {
    if (counter % 2 == 0)) {
      alert("counter is even" + counter)
    } else {
      alert("counter is odd" + counter)
    }
  }, [counter]);

  // create an easy-to-use increment function
  const increment = () => {
    setCounter((counter) => counter + 1);
  };

  // return the counter value and the incrementer
  return [counter, increment];
};

App.js

import React from "react";
import ReactDOM from "react-dom/client";
import { useCounter } from "./hooks/useCounter.js";

function App() {
  const [currentCount, increment] = useCounter();

  return (
    <div>
      <h2>Count: {currentCount}</h2>
      <button onClick={increment}>Click Me!</button>
    </div>
  );
}

export default App;

Custom Hook: Example Two

TBD: custom hooks on form ??

useFormInput.js

import { useState } from 'react';

export function useFormInput(initialValue) {
  const [value, setValue] = useState(initialValue);

  function handleChange(e) {
    setValue(e.target.value);
  }

  const inputProps = {
    value: value,
    onChange: handleChange
  };

  return inputProps;
}

App.js

import { useFormInput } from './useFormInput.js';

export default function Form() {
  const firstNameProps = useFormInput('Mary');
  const lastNameProps = useFormInput('Poppins');

  return (
    <>
      <label>
        First name:
        <input value={firstNameProps.value} onChange={firstNameProps.onChange}/>
      </label>
      <label>
        Last name:
        <input {...lastNameProps} />
      </label>
      <p><b>Good morning, {firstNameProps.value} {lastNameProps.value}.</b></p>
    </>
  );
}

Last updated