useChange

useChange is a custom React hook that allows you to add change event listeners to your components. This hook is implemented using the @react-toolbelt/hooks package.

It takes two parameters, a element and a callback function.


Parameters

element: Document | HTMLElement

The HTML Element on which to listen for change events (optional, defaults to the document object).

Note: Provide only a single element, not the entire ref object.

cb: (target: HTMLElement) => void

A callback function that will be called when the component is changed. This function takes one parameter, target, which is the DOM element that was changed.


Return value

Returns undefined. Use the cb function to handle the EventTarget object.


Syntax

1
2
3
4
5
import { useChange } from '@react-toolbelt/hooks';

useChange(ref.current, (target) => {
  // At every change event, you have access to the EventTarget object
});

Example

Here's an example of how you can use useChange in your React component:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/** Controlled Components and Validations in a Form using the useChange hook */
import { useRef, useState } from 'react';
import { useChange } from '@react-toolbelt/hooks';

const SignUpForm = () => {
  const [formData, setFormData] = useState({
    firstName: '',
    lastName: '',
    gender: '',
    skills: ''
  });

  const formRef = useRef(null);

  useChange(formRef.current, (target) => {
    if (['INPUT', 'SELECT'].includes(target.tagName)) {
      const { name, value, type } = target;
      setFormData((prev) => ({ ...prev, [name]: value }));
    }
  });

  return (
    <form ref={formRef}>
      <label htmlFor="firstName">First Name</label>
      <input
        id="firstName"
        name="firstName"
        type="text"
        value={formData.firstName}
      />

      <label htmlFor="lastName">Last Name</label>
      <input
        id="lastName"
        name="lastName"
        type="text"
        value={formData.lastName}
      />

      <div className="RadioGroup flex flex-col gap-4">
        <span className="radio-button align-center inline-flex justify-center gap-3">
          <label htmlFor="male">Male</label>
          <input
            id="male"
            name="gender"
            type="radio"
            value="male"
            checked={formData.gender === 'male'}
          />
        </span>

        <span className="radio-button align-center inline-flex justify-center gap-3">
          <label htmlFor="lastName">Last Name</label>
          <input
            id="female"
            name="gender"
            type="radio"
            value="female"
            checked={formData.gender === 'female'}
          />
        </span>

        <span className="radio-button align-center inline-flex justify-center gap-3">
          <label htmlFor="lastName">Last Name</label>
          <input
            id="other"
            name="gender"
            type="radio"
            value="other"
            checked={formData.gender === 'other'}
          />
        </span>
      </div>

      <label htmlFor="skills">Skills</label>
      <select id="skills" name="skills" value={formData.skills}>
        <option value="">{'--Select a Skill--'}</option>
        <option value="javascript">JavaScript</option>
        <option value="css">CSS</option>
        <option value="react">React</option>
      </select>
      <button className="btn btn-submit" type="submit">
        Submit
      </button>
    </form>
  );
};