Единственный способ узнать, завершен ли пользователь, - это использовать onChangeCommitted
, но это работает только тогда, когда пользователь использует мышь для взаимодействия. Если пользователь использует клавиши со стрелками, то для каждого изменения будет срабатывать onChangeCommitted
.
Вы можете подождать некоторое время, прежде чем выполнять поиск. Если есть несколько поисковых терминов, которые пользователь может изменить, вы можете использовать useDebounce продемонстрировано здесь код в demo.js
const [search, setSearch] = React.useState({ slider1: 10, slider2: 10 });
const onChange = React.useCallback(
(key, val) => setSearch(search => ({ ...search, [key]: val })),
[]
);
//start searching when user did not change anything for 5 second
// I know it's a long time but demonstrates behavior more easily
const debouncedSearch = useDebounce(search, 5000);
// Effect for API call
React.useEffect(
() => {
console.log("user inactive for five seconds, going to search now");
},
[debouncedSearch] // Only call effect if debounced search term changes
);
Если вы выполните запрососновываясь на пользовательском вводе, вы должны обязательно что-то делать только с ответом last пользовательского ввода. Вы можете сделать это с эффектом отмены и продемонстрировано в коде выше и здесь . Если нет, вы можете получить неожиданные условия гонки.