#javascript #html #reactjs
Вопрос:
Я пытаюсь создать ввод с выпадающим списком, в котором содержатся предложения. У меня есть элемент ввода, который использует onBlur, который технически при нажатии снаружи удалит элемент ul. Когда я нажимаю на элемент ul, он также удаляет элемент ul, который запускает событие onBlur на входе. Есть ли способ реализовать onBlur, который не позволяет элементу ul запускать событие onBlur?
import React, { useState, useEffect, useRef } from "react";
import "./styles.css";
const Autocomplete = (props) => {
const [userInput, setUserInput] = useState("");
const [listResults, setListResults] = useState([]);
const [openModal, setOpenModal] = useState(false);
useEffect(() => {
const filteredResults = props.options.filter((option) =>
option.includes(userInput)
);
setListResults(filteredResults);
}, [userInput, props.options]);
const handleInput = (event) => {
setUserInput(event.target.value);
};
const handleInputClick = () => {
setOpenModal(!openModal);
};
const handleClickOption = (data) => {
setUserInput(data);
setOpenModal(false);
ulEl.current.focus();
};
return (
<div className="container">
<input
name="search-input"
value={userInput}
onChange={handleInput}
autoComplete="off"
onFocus={handleInputClick}
onBlur={handleInputClick}
/>
<ul className="search-list">
{openModal amp;amp;
listResults amp;amp;
listResults.map((data, key) => (
<li
key={key}
onClick={() => {
handleClickOption(data);
}}
>
{data}
</li>
))}
</ul>
</div>
);
};
export default Autocomplete;
Любая помощь будет очень признательна
Ответ №1:
Короткий ответ, просто добавьте это в свой элемент
onMouseDown={(e) => e.preventDefault()}
В этой ситуации позвоните event.preventDefault()
на onMouseDown
мероприятие. onMouseDown
по умолчанию вызовет событие размытия и не будет делать этого при preventDefault
вызове. Тогда у onClick
вас будет шанс быть призванным. Событие размытия все равно произойдет, только после onClick
.
Комментарии:
1. Отличный ответ. Спасибо! Я нашел другое решение, в котором я могу использовать функцию onClick вместо OnMouseDown, так как onBlur происходит сразу после события OnMouseDown.
Ответ №2:
Вы можете использовать атрибут списка <input>
с a <datalist>
вместо использования a <ul>
.
Надеюсь, это подходит для вашего случая.