Я пытаюсь создать выпадающий список поиска, но мой поисковый фильтр не обновляется должным образом с помощью useCallback
. Обратный вызов searchFilter не обновляет значения в первом onChange
const [inputValue, setInputValue] = useState('');
const [opts, setOpts] = useState(allOptions);
const searchFilter = useCallback(
(val) => {
setInputValue(val);
const filter = val.toUpperCase();
const ops = options.filter((opt) => opt.text.toUpperCase().indexOf(filter) > -1);
setOpts(ops);
}, [inputValue] // state not being updated on first onChange
);
<textArea
onChange={(e) => searchFilter(e.target.value)}
value={inputValue}
/>
<ul>
{opts.map((option) => (
<li key={option.key}>
{option.text}
</li>
))}
</ul>
Я смог исправить эту ошибку, убрав обратный вызов:
const searchFilter = (val) => {
setInputValue(val);
const filter = val.toUpperCase();
const ops = options.filter((opt) => opt.text.toUpperCase().indexOf(filter) > -1);
setOpts(ops);
} // this works on every onChange
Что не так с моей реализацией из useCallback
?
Я даже пытался добавить ref
в логи c, но это не сработало. Я прочитал в документации по React многие входные изменения, которые они предпочитают использовать с помощью ссылок:
const [inputValue, setInputValue] = useState('');
const [opts, setOpts] = useState(allOptions);
const inputEl = useRef(null);
useEffect(() => {
inputEl.current = inputValue; // Write it to the ref
});
const searchFilter = useCallback(
(val) => {
setInputValue(val);
const filter = val.toUpperCase();
const ops = options.filter((opt) => opt.text.toUpperCase().indexOf(filter) > -1);
setOpts(ops);
}, [inputEl]
);
<textArea
ref={inputEl}
onChange={(e) => searchFilter(e.target.value)}
value={inputValue}
/>
** note Я пытался добавить фрагмент JS, но, похоже, я пока не могу добавить обработчики реакции в stackoverflow. Нужно обрабатывать версии React 16.8+. Если есть способ, которым я могу это сделать, пожалуйста, дайте мне знать.