Learnitweb

Call hook on a condition like button click or input value

In React, hooks must not be called conditionally or inside event handlers directly — they must always be called at the top level of a functional component or inside a custom hook. However, you can use state to control when the effect of a hook should happen.

Here’s how to trigger logic in a hook conditionally, such as after a button click or input change:

Correct Pattern: Use State and useEffect

Example 1: Hook logic triggered on button click

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

function MyComponent() {
  const [clicked, setClicked] = useState(false);

  useEffect(() => {
    if (clicked) {
      console.log("Button was clicked!");
      // Put your hook-based logic here
    }
  }, [clicked]);

  return (
    <button onClick={() => setClicked(true)}>Click Me</button>
  );
}

Example 2: Hook logic triggered by input value

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

function InputWatcher() {
  const [inputValue, setInputValue] = useState('');

  useEffect(() => {
    if (inputValue.length > 3) {
      console.log("Input is longer than 3 characters!");
      // Trigger your hook logic here
    }
  }, [inputValue]);

  return (
    <input
      type="text"
      value={inputValue}
      onChange={e => setInputValue(e.target.value)}
    />
  );
}

Don’t Do This (Invalid Hook Usage)

if (someCondition) {
  useEffect(() => {   // ❌ This is not allowed!
    // ...
  }, []);
}

React needs to call hooks in the same order every render. Conditional calls break this rule and can lead to bugs.