사용자 지정 React 자동 완성 검색 구성 요소 구축
28940 단어 tutorialwebdevreactjavascript
Create React App을 사용하여 기본 앱을 설정하여 시작하겠습니다.
npx create-react-app react-autocomplete-search
다음으로
data.js
폴더에 새 /src
파일을 만듭니다. 이 파일에는 자동 완성 제안을 제공하는 데 사용할 배열이 포함되어 있습니다. 실제로는 이 파일을 API 호출로 대체하여 데이터를 제공할 수 있습니다.export const autoCompleteData = [
"Asparagus",
"Beetroot",
"Broccoli",
"Cabbage",
"Carrot",
"Cauliflower",
"Celery",
"Corn",
"Eggplant",
"Lettuce",
"Mushroom",
"Onion",
"Parsnip",
"Pea",
"Potato",
"Pumpkin",
"Radish",
"Spinach",
"Tomato",
"Turnip",
];
그런 다음
AutoComplete.js
폴더에 다음 구조로 새 /src
파일을 만듭니다.import { useState } from "react";
const AutoComplete = ({ data }) => {
return (
<div className="autocomplete">
<input type="text" />
</div>
);
};
export default AutoComplete;
이제
State
변수로 시작하는 구성 요소 빌드를 시작할 수 있습니다.const [suggestions, setSuggestions] = useState([]);
const [suggestionIndex, setSuggestionIndex] = useState(0);
const [suggestionsActive, setSuggestionsActive] = useState(false);
const [value, setValue] = useState("");
suggestions
– 자동 완성 메뉴를 채우는 데 사용할 제안 배열. suggestionIndex
- 키보드 탐색에 사용되는 활성 제안의 색인입니다. suggestionsActive
– 자동 완성 제안의 가시성을 전환하는 데 사용됩니다. value
– 사용자가 선택한 자동 완성 제안. 자동 완성 제안은 사용자가 쿼리를 입력하는 동안 트리거되어야 합니다. 이를 위해 입력 필드의 변경 사항을 모니터링하는
onChange
이벤트를 사용합니다. 그런 다음 autoCompleteData
를 필터링하여 관련 제안을 찾습니다.const handleChange = (e) => {
const query = e.target.value.toLowerCase();
setValue(query);
if (query.length > 1) {
const filterSuggestions = data.filter(
(suggestion) => suggestion.toLowerCase().indexOf(query) > -1
);
setSuggestions(filterSuggestions);
setSuggestionsActive(true);
} else {
setSuggestionsActive(false);
}
};
또한 사용자는 자동 완성 제안을 클릭하고 해당 제안이 입력 필드를 채우도록 할 수 있어야 합니다. 이를 위해
onClick
이벤트에 의해 트리거되는 다음 함수를 추가해야 합니다.const handleClick = (e) => {
setSuggestions([]);
setValue(e.target.innerText);
setSuggestionsActive(false);
};
사용자가 각 제안 사이를 탐색하고 키보드를 사용하여 제안을 선택할 수 있도록
keyDown
이벤트를 사용하여 위쪽/아래쪽 화살표 및 Enter 키를 눌렀을 때 수신 대기합니다.const handleKeyDown = (e) => {
// UP ARROW
if (e.keyCode === 38) {
if (suggestionIndex === 0) {
return;
}
setSuggestionIndex(suggestionIndex - 1);
}
// DOWN ARROW
else if (e.keyCode === 40) {
if (suggestionIndex - 1 === suggestions.length) {
return;
}
setSuggestionIndex(suggestionIndex + 1);
}
// ENTER
else if (e.keyCode === 13) {
setValue(suggestions[suggestionIndex]);
setSuggestionIndex(0);
setSuggestionsActive(false);
}
};
실제 제안을 위해
Suggestions
구성 요소를 생성합니다.const Suggestions = () => {
return (
<ul className="suggestions">
{suggestions.map((suggestion, index) => {
return (
<li
className={index === suggestionIndex ? "active" : ""}
key={index}
onClick={handleClick}
>
{suggestion}
</li>
);
})}
</ul>
);
};
이렇게 하면
suggestions
배열이 정렬되지 않은 HTML 목록으로 출력됩니다. 키워드의 위쪽/아래쪽 화살표를 사용하여 사용자가 선택한 목록 항목의 스타일을 지정할 수 있는 조건부active
클래스를 추가했습니다. 구성 요소가 완료되면 다음 CSS를 추가하여 이를 확인할 수 있습니다..active {
background: lightgray;
}
구성 요소 업데이트를 완료하려면 다음과 같이
return
문을 업데이트합니다.return (
<div className="autocomplete">
<input
type="text"
value={value}
onChange={handleChange}
onKeyDown={handleKeyDown}
/>
{suggestionsActive && <Suggestions />}
</div>
);
완성된
AutoComplete
구성 요소의 모양은 다음과 같습니다.import { useState } from "react";
const AutoComplete = ({ data }) => {
const [suggestions, setSuggestions] = useState([]);
const [suggestionIndex, setSuggestionIndex] = useState(0);
const [suggestionsActive, setSuggestionsActive] = useState(false);
const [value, setValue] = useState("");
const handleChange = (e) => {
const query = e.target.value.toLowerCase();
setValue(query);
if (query.length > 1) {
const filterSuggestions = data.filter(
(suggestion) =>
suggestion.toLowerCase().indexOf(query) > -1
);
setSuggestions(filterSuggestions);
setSuggestionsActive(true);
} else {
setSuggestionsActive(false);
}
};
const handleClick = (e) => {
setSuggestions([]);
setValue(e.target.innerText);
setSuggestionsActive(false);
};
const handleKeyDown = (e) => {
// UP ARROW
if (e.keyCode === 38) {
if (suggestionIndex === 0) {
return;
}
setSuggestionIndex(suggestionIndex - 1);
}
// DOWN ARROW
else if (e.keyCode === 40) {
if (suggestionIndex - 1 === suggestions.length) {
return;
}
setSuggestionIndex(suggestionIndex + 1);
}
// ENTER
else if (e.keyCode === 13) {
setValue(suggestions[suggestionIndex]);
setSuggestionIndex(0);
setSuggestionsActive(false);
}
};
const Suggestions = () => {
return (
<ul className="suggestions">
{suggestions.map((suggestion, index) => {
return (
<li
className={index === suggestionIndex ? "active" : ""}
key={index}
onClick={handleClick}
>
{suggestion}
</li>
);
})}
</ul>
);
};
return (
<div className="autocomplete">
<input
type="text"
value={value}
onChange={handleChange}
onKeyDown={handleKeyDown}
/>
{suggestionsActive && <Suggestions />}
</div>
);
};
export default AutoComplete;
마지막으로 구성 요소와 데이터를 로드하도록 업데이트
App.js
할 수 있습니다.import Autocomplete from "./AutoComplete";
import { autoCompleteData } from "./data.js";
function App() {
return (
<div className="App">
<Autocomplete data={autoCompleteData} />
</div>
);
}
export default App;
이것이 이 튜토리얼의 전부입니다. 이제 React 애플리케이션에 쉽게 추가할 수 있는 작동하는 자동 완성 검색 구성 요소가 있어야 합니다. 이 튜토리얼에 대한 full source code 및 w3collective에 게시된 모든 튜토리얼을 GitHub에서 얻을 수 있습니다.
Reference
이 문제에 관하여(사용자 지정 React 자동 완성 검색 구성 요소 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/michaelburrows/build-a-custom-react-autocomplete-search-component-2hcd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)