Search bar with debounce — delay search until user stops typing.
Implementation:
1import { useState, useCallback, useEffect } from "react";2import { TextInput, FlatList, View, Text } from "react-native";34function SearchableList() {5 const [query, setQuery] = useState("");6 const [results, setResults] = useState([]);7 const [debouncedQuery, setDebouncedQuery] = useState("");89 // Debounce effect10 useEffect(() => {11 const timer = setTimeout(() => {12 setDebouncedQuery(query);13 }, 500);1415 return () => clearTimeout(timer);16 }, [query]);1718 // Search effect19 useEffect(() => {20 if (debouncedQuery) {21 performSearch(debouncedQuery);22 }23 }, [debouncedQuery]);2425 return (26 <View>27 <TextInput28 placeholder="Search..."29 value={query}30 onChangeText={setQuery}31 />32 <FlatList33 data={results}34 renderItem={({ item }) => <Text>{item.name}</Text>}35 keyExtractor={(item) => item.id}36 />37 </View>38 );39}
Custom debounce hook:
1function useDebounce(value: string, delay: number) {2 const [debouncedValue, setDebouncedValue] = useState(value);34 useEffect(() => {5 const handler = setTimeout(() => {6 setDebouncedValue(value);7 }, delay);89 return () => clearTimeout(handler);10 }, [value, delay]);1112 return debouncedValue;13}