Global search bars are common, but debouncing search queries without messy prop drilling can get tricky. Let's create a clean, performant global search context with built-in debounce — no third-party libraries needed.

Why Use a Debounced Global Search?

Benefits include:

  • Reducing API call spam
  • Consistent search state across unrelated components
  • Improved UX with minimal extra code

Step 1: Create the Search Context

This context will handle search term updates and debounce internally:

// searchContext.js
import { createContext, useContext, useState, useRef } from "react";

const SearchContext = createContext(null);

export function SearchProvider({ children }) {
  const [searchTerm, setSearchTerm] = useState("");
  const debounceRef = useRef(null);

  const updateSearch = (term) => {
    if (debounceRef.current) clearTimeout(debounceRef.current);
    debounceRef.current = setTimeout(() => {
      setSearchTerm(term);
    }, 300); // 300ms debounce
  };

  return (
    
      {children}
    
  );
}

export function useSearch() {
  return useContext(SearchContext);
}

Step 2: Create a Search Input Component

This component will update the global search context on typing:

// SearchInput.js
import { useSearch } from "./searchContext";

function SearchInput() {
  const { updateSearch } = useSearch();

  const handleChange = (e) => {
    updateSearch(e.target.value);
  };

  return ;
}

export default SearchInput;

Step 3: Use Search Results Anywhere

Any component can now subscribe to the debounced search term:

// SearchResults.js
import { useSearch } from "./searchContext";

function SearchResults() {
  const { searchTerm } = useSearch();

  return 

Searching for: {searchTerm}

{/* Add your search fetching logic here */}
; } export default SearchResults;

Step 4: Wrap Your App with the Provider

// App.js
import { SearchProvider } from "./searchContext";
import SearchInput from "./SearchInput";
import SearchResults from "./SearchResults";

function App() {
  return (
    
      
      
    
  );
}

export default App;

Pros and Cons

✅ Pros

  • Built-in debounce without extra packages
  • Global search term accessible anywhere
  • Simple and lightweight

⚠️ Cons

  • Fixed debounce delay (hardcoded 300ms)
  • Doesn't cancel already-fired API calls
  • Minimal error handling for complex search behaviors

🚀 Alternatives

  • use-debounce library for more control
  • React Query for API-layer search state management

Summary

By wrapping a simple debounce inside a context provider, you can create elegant, scalable search systems in React with almost no overhead. Perfect for dashboards, admin panels, and internal tools where performance matters.

For a much more extensive guide on getting the most out of React portals, check out my full 24-page PDF file on Gumroad. It's available for just $10:

Using React Portals Like a Pro.

If you found this helpful, you can support me here: buymeacoffee.com/hexshift