Reactでオートコンプリートコンポーネントを構築する方法
序章
オートコンプリートは、入力フィールドがユーザー入力に基づいて単語を提案する機能です。 これは、検索が必要な場合など、アプリケーションのユーザーエクスペリエンスを向上させるのに役立ちます。
この記事では、Reactでオートコンプリートコンポーネントを構築する方法を検討します。 提案の固定リスト、イベントバインディング、キーボードコードの理解、および状態管理の操作を行います。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Reactの理解が必要です。 Reactの詳細については、Reactでコーディングする方法シリーズをご覧ください。
ステップ1—Autocomplete
コンポーネントを構築する
Autocomplete
コンポーネントは、オートコンプリート機能の機能を作成する場所です。
Autocomplete.js
ファイルを作成し、Reactをインポートして、Autocomplete
クラスをインスタンス化します。
Autocomplete.js
import React, { Component, Fragment } from "react"; import './styles.css' class Autocomplete extends Component { constructor(props) { super(props); this.state = { activeSuggestion: 0, filteredSuggestions: [], showSuggestions: false, userInput: "" }; }
あなたの州では、activeSuggestion
プロパティは、選択された提案のインデックスを定義します。 空の配列に設定されたプロパティfilteredSuggestions
は、ユーザーの入力と一致します。 showSuggestions
プロパティは、提案リストが表示されるかどうかを決定し、userInput
プロパティは、ユーザーの入力から単語を受け入れるための空の文字列を自分自身に割り当てます。
クラスを開始して状態を設定したら、コンポーネントに適用するメソッドを見てみましょう。
Autocomplete.js
ファイルで、onChange
メソッドを定義し、状態を更新します。
Autocomplete.js
onChange = e => { const { suggestions } = this.props; const userInput = e.currentTarget.value; const filteredSuggestions = suggestions.filter( suggestion => suggestion.toLowerCase().indexOf(userInput.toLowerCase()) > -1 ); this.setState({ activeSuggestion: 0, filteredSuggestions, showSuggestions: true, userInput: e.currentTarget.value }); };
メソッドonChange
は、ユーザーが入力値を変更したときに起動します。 変更のたびに、メソッドは提案リストにフィルターをかけ、ユーザーの入力を含まない提案を返します。 フィルタが実行されると、.setState()
メソッドは、状態のuserInput
プロパティを修正して値を含め、showSuggestions
ブール値を設定して提案を表示できるようにし、[X186X各メソッド呼び出しの]プロパティ。
onClick
イベントは、ユーザーが提案をクリックしたときに呼び出されます。 Autocomplete.js
ファイルで、onClick
メソッドを宣言し、.setState()
メソッドを実装します。
Autocomplete.js
onClick = e => { this.setState({ activeSuggestion: 0, filteredSuggestions: [], showSuggestions: false, userInput: e.currentTarget.innerText }); };
.setState()
メソッドは、ユーザーの入力を更新し、状態のプロパティをリセットします。
onKeyDown
メソッドは、ユーザーがキーを押したときに有効になります。 Autocomplete.js
ファイルで、onKeyDown
メソッドを宣言し、いくつかの条件を設定します。
Autocomplete.js
onKeyDown = e => { const { activeSuggestion, filteredSuggestions } = this.state; if (e.keyCode === 13) { this.setState({ activeSuggestion: 0, showSuggestions: false, userInput: filteredSuggestions[activeSuggestion] }); } else if (e.keyCode === 38) { if (activeSuggestion === 0) { return; } this.setState({ activeSuggestion: activeSuggestion - 1 }); } // User pressed the down arrow, increment the index else if (e.keyCode === 40) { if (activeSuggestion - 1 === filteredSuggestions.length) { return; } this.setState({ activeSuggestion: activeSuggestion + 1 }); } };
プロパティactiveSuggestion
およびfilteredSuggestion
を分解されたオブジェクトに保存すると、条件文は、ユーザーが押したキーがキーコードと一致するかどうかをチェックします。 最初の条件は、キーコードが13
、エンターキーと一致するかどうかを確認し、.setState()
メソッドを実行して、userInput
プロパティを更新し、提案リストを閉じます。 ユーザーが上矢印、キーコード38
を押すと、条件はactiveSuggestion
プロパティのインデックスをデクリメントし、インデックスがゼロの場合は何も返しません。 ユーザーが下矢印、キーコード40
を押すと、条件はactiveSuggestion
プロパティのインデックスをインクリメントし、インデックスがfilteredSuggestions
の長さと一致する場合は何も返しません。 ] 財産。
メソッドが完成したので、render
ライフサイクルメソッドの適用に進みましょう。
Autocomplete.js
ファイルで、render()
ステートメントを設定し、分解されたオブジェクトでメソッドと状態を定義します。
Autocomplete.js
render() { const { onChange, onClick, onKeyDown, state: { activeSuggestion, filteredSuggestions, showSuggestions, userInput } } = this; let suggestionsListComponent;
変数suggestionsListComponent
には、以下の条件で割り当てるため、定義された値はありません。
Autocomplete.js
if (showSuggestions && userInput) { if (filteredSuggestions.length) { suggestionsListComponent = ( <ul class="suggestions"> {filteredSuggestions.map((suggestion, index) => { let className; // Flag the active suggestion with a class if (index === activeSuggestion) { className = "suggestion-active"; } return ( <li className={className} key={suggestion} onClick={onClick}> {suggestion} </li> ); })} </ul> ); } else { suggestionsListComponent = ( <div class="no-suggestions"> <em>No suggestions available.</em> </div> ); } }
最初の条件は、プロパティshowSuggestions
およびuserInput
の値が存在するかどうかをチェックし、次の条件は、filteredSuggestions
プロパティの長さをチェックします。 条件が満たされると、suggestionsListComponent
変数は、filteredSuggestions
プロパティを反復処理する値を割り当て、インデックスが [の値と一致する場合、クラス名でアクティブな提案にフラグを立てます。 X211X]プロパティ。 suggestionsListComponent
変数は、onClick
メソッドの実行時に提案の順序付きリストを返し、各提案にクラス名を割り当てます。 プロパティshowSuggestions
およびuserInput
の値が存在しない場合、利用可能な提案がないことを示すテキストが表示されます。
ユーザーがリストされた条件を満たさない場合、render()
ライフサイクルメソッドはReactFragment
を返し、入力フィールドを適用して、ドキュメントオブジェクトモデルにノードを追加せずにメソッドを呼び出します。
Autocomplete.js
return ( <Fragment> <input type="text" onChange={onChange} onKeyDown={onKeyDown} value={userInput} /> {suggestionsListComponent} </Fragment> ); } } export default Autocomplete;
Autocomplete
コンポーネントを開発したので、ファイルをエクスポートして、その機能を別のコンポーネントに結合します。
ステップ2—Reactプロジェクトに参加する
App
コンポーネントは、Autocomplete
コンポーネントの機能を表示する場所です。 index.js
ファイルで、App
コンポーネントを宣言し、Autocomplete
コンポーネントをインポートします。
index.js
import React from "react"; import Autocomplete from "./Autocomplete"; function App() { return ( <div> <h1>React Autocomplete Demo</h1> <h2>Start typing and experience the autocomplete wizardry!</h2> <Autocomplete suggestions={"Oranges", "Apples", "Banana", "Kiwi", "Mango"]}/> </div> ); } export default App
App
コンポーネントのreturnステートメントは、提案の固定リストを持つAutocomplete
コンポーネントを受け入れます。
ステップ3—Autocomplete
コンポーネントのスタイリング
Autocomplete
コンポーネントを完成させるには、CSSを使用してスタイルを追加し、アプリケーションと入力フィールドの位置と色を設定します。
styles.css
ファイルを作成し、CSSルールを設定してAutocomplete
コンポーネントを形成します。
styles.css
body { font-family: sans-serif; } input { border: 1px solid #999; padding: 0.5rem; width: 300px; } .no-suggestions { color: #999; padding: 0.5rem; } .suggestions { border: 1px solid #999; border-top-width: 0; list-style: none; margin-top: 0; max-height: 143px; overflow-y: auto; padding-left: 0; width: calc(300px + 1rem); } .suggestions li { padding: 0.5rem; } .suggestion-active, .suggestions li:hover { background-color: #008f68; color: #fae042; cursor: pointer; font-weight: 700; } .suggestions li:not(:last-of-type) { border-bottom: 1px solid #999; }
CSSルールを作成したら、ファイルをAutocomplete.js
ファイルにインポートしてスタイルを適用します。
結論
Reactは、ユーザーと対話するための組み込みメソッドとカスタムメソッドを使用して、1つのコンポーネントで利用可能なオートコンプリート機能を構築するための手段を提供します。
CodeSandboxでオートコンプリートコンポーネントがどのように動作するかを確認してください。