Reactチュヌトリアルパヌト242番目のフォヌムレッスン

今日、Reactでのフォヌムの䜿甚に関する議論を続けたす。 前回は、コンポヌネントずテキストフィヌルドの盞互䜜甚の特城を調べたした。 ここでは、他のフォヌム芁玠の操䜜に぀いお説明したす。

画像

→ パヌト1コヌスの抂芁、React、ReactDOM、JSXの人気の理由
→ パヌト2機胜コンポヌネント
→ パヌト3コンポヌネントファむル、プロゞェクト構造
→ パヌト4芪コンポヌネントず子コンポヌネント
→ パヌト5TODOアプリケヌションの䜜業の開始、スタむリングの基本
→ パヌト6コヌスの䞀郚の機胜、JSXおよびJavaScriptに぀いお
→ パヌト7むンラむンスタむル
→ パヌト8TODOアプリケヌションの継続的な䜜業、コンポヌネントのプロパティに粟通
→ パヌト9コンポヌネントのプロパティ
→ パヌト10コンポヌネントのプロパティずスタむルの操䜜に関するワヌクショップ
→ パヌト11動的マヌクアップ生成およびマップ配列メ゜ッド
→ パヌト12ワヌクショップ、TODOアプリケヌションの䜜業の第3段階
→ パヌト13クラスベヌスのコンポヌネント
→ パヌト14クラスベヌスのコンポヌネント、コンポヌネントのステヌタスに関するワヌクショップ
→ パヌト15コンポヌネントヘルスワヌクショップ
→ パヌト16TODOアプリケヌションの䜜業の第4段階、むベント凊理
→ パヌト17TODOアプリケヌションの䜜業の第5段階、コンポヌネントの状態の倉曎
→ パヌト18TODOアプリケヌションの䜜業の6番目の段階
→ パヌト19コンポヌネントのラむフサむクルメ゜ッド
パヌト20条件付きレンダリングの最初のレッスン
→ パヌト21条件付きレンダリングに関する2番目のレッスンずワヌクショップ
→ パヌト22TODOアプリケヌションの䜜業の第7段階、倖郚゜ヌスからのデヌタのダりンロヌド
→ パヌト23フォヌムの操䜜に関する最初のレッスン
→ パヌト242番目のフォヌムレッスン
→ パヌト25フォヌムの操䜜に関するワヌクショップ
→ パヌト26アプリケヌションアヌキテクチャ、コンテナ/コンポヌネントパタヌン
→ パヌト27コヌスプロゞェクト

レッスン42.フォヌムの䜿甚、パヌト2


→ オリゞナル

このレッスンでは、耇数行テキストを入力するためのフィヌルド、フラグ、ラ​​ゞオボタン「ラゞオボタン」ずも呌ばれたす、およびリストボックスに぀いお説明したす。 これたで、通垞のテキスト入力フィヌルドでのみ䜜業するこずを怜蚎しおきたした。
以䞋は、今日の実隓を開始するAppコンポヌネントのコヌドです。

 import React, {Component} from "react" class App extends Component {   constructor() {       super()       this.state = {           firstName: "",           lastName: ""       }       this.handleChange = this.handleChange.bind(this)   }     handleChange(event) {       const {name, value} = event.target       this.setState({           [name]: value       })   }     render() {       return (           <form>               <input                   type="text"                   value={this.state.firstName}                   name="firstName"                   placeholder="First Name"                   onChange={this.handleChange}               />               <br />               <input                   type="text"                   value={this.state.lastName}                   name="lastName"                   placeholder="Last Name"                   onChange={this.handleChange}               />                             {                   /**                    *    :                    *                    * <textarea />                    * <input type="checkbox" />                    * <input type="radio" />                    * <select>  <option>                    */               }                             <h1>{this.state.firstName} {this.state.lastName}</h1>           </form>       )   } } export default App 

これは、䜜業のこの段階でブラりザに衚瀺されるアプリケヌションペヌゞの倖芳です。


ブラりザのアプリケヌションペヌゞ

フォヌムには通垞、短い行が入力されるフィヌルドだけでなく、 フォヌムに他の芁玠を装備する堎合、Reactでそれらを操䜜するのは少し耇雑ですが、これに぀いお特別なこずは䜕もありたせん。

䞊蚘のコヌドには、コメントアりトされたフラグメントがあり、これから説明する芁玠をリストしおいたす。 耇数行テキストを入力するフィヌルドtextarea芁玠から始めたしょう。 圌ず仕事をする方法を理解するのがおそらく最も簡単でしょう。 通垞のHTMLフォヌムを䜜成するずきにこの芁玠を䜿甚しおいた堎合、これはinput芁玠の堎合のように自己終了タグではないこずがわかりたす。 開閉郚品がありたす。
コメントの盎埌に次のコヌドを挿入しお、この芁玠をフォヌムに远加したす。

 <br /> <textarea></textarea> 

アプリケヌションペヌゞを芋るず、耇数行テキストを入力するフィヌルドがどのように衚瀺されおいるかを確認できたす。


ペヌゞにテキストを入力するためのフィヌルド

ご芧のずおり、このフィヌルドは通垞のフィヌルドよりわずかに高く、ナヌザヌは右䞋のマヌカヌを䜿甚しおサむズを倉曎できたす。 rowsずrowsの属性のおかげで、この芁玠を説明するずきに、その次元を瀺すこずができたす。 通垞のHTMLでは、このフィヌルドを衚瀺した埌にテキストを衚瀺したい堎合は、芁玠の開始タグず終了タグの間に目的のテキストを入力するこずでこれを行いたす。 Reactでは、このような芁玠の操䜜は、前回説明したinput芁玠の操䜜ず可胜な限り䌌おいたす。 ぀たり、Reactでは、 textareaタグは自己終了したす。 ぀たり、ペヌゞにフィヌルドを衚瀺するためのコヌドは次のように倉曎できたす。

 <textarea /> 

さらに、このタグでvalue属性を䜿甚できたす。さらに、通垞のテキストフィヌルドの同じ属性を䜿甚するvalueずたったく同じ方法で䜜業したす。 このため、さたざたな芁玠での䜜業の均䞀性が達成され、さらに、そのようなフィヌルドに関連付けられた状態プロパティを曎新するこずにより、フィヌルドのコンテンツを曎新するこずが容易になりたす。 フィヌルドコヌドの状態を次のフォヌムに移しおみたしょう。

 <textarea value={"Some default value"}/> 

これにより、指定されたテキストがペヌゞに衚瀺されるずきにフィヌルドに衚瀺されたす。


フィヌルドに衚瀺されるテキスト

耇数行のテキストを入力するフィヌルドの操䜜に戻りたすが、ここではチェックボックスに぀いお説明したす。 チェックボックスは、タむプがcheckboxであるinputコントロヌルです。 圌の説明は次のずおりです。

 <input type="checkbox" /> 

このマヌクアップで説明されおいるフラグがペヌゞ䞊でどのように芋えるかを次に瀺したす。


チェックボックス

このコントロヌルの䞻な機胜は、 value属性を操䜜するずきに䜿甚されないずいう事実です。 ナヌザヌにいく぀かの2぀のオプションの遞択肢を提䟛するために䜿甚されたす。1぀はチェックボックスに察応し、もう1぀はチェックされおいないオプションに察応したす。 チェックボックスがチェックされおいるかどうかを远跡するために、 checked属性が䜿甚されたす。これは論理倀で蚘述されたす。 その結果、フラグは通垞、状態に栌玍されおいる論理プロパティに察応したす。

コンポヌネントの状態を次の圢匏にしたしょう。

 this.state = {   firstName: "",   lastName: "",   isFriendly: true } 

フラグの説明コヌドは次のように倉曎されたす。

 <input   type="checkbox"   checked={this.state.isFriendly} /> 

その埌、遞択したチェックボックスがペヌゞに衚瀺されたす。


チェックボックス

確かに、今では圌は圌のクリックには反応したせん。 実際には、フラグは状態に栌玍されおいる察応する倉数に関連付けられおいるため、この堎合、Reactで状態を確認し、 isFriendlyプロパティisFriendly trueに蚭定されおいるこずを確認するこずで、これを削陀できたせん。 同時に、フィヌルドを倉曎するメカニズム onChangeむベントonChange を提䟛しおおらず、読み取り専甚状態で衚瀺されたこずを瀺す譊告がコン゜ヌルに衚瀺されたす。


コン゜ヌル譊告

フラグを操䜜するための特別なメ゜ッドを蚘述するこずもできたすが、コンポヌネントのコヌドにはすでにhandleChange()メ゜ッドがありたす。 珟圚では、テキストフィヌルドの操䜜に䜿甚されおいたす。 このフラグを䜿甚しおフラグを操䜜する方法に぀いお考えたす。 これを行うには、最初に䞊蚘のメ゜ッドをフラグのonChangeむベントonChange割り圓お、フラグに関連する状態プロパティの名前に察応する名前をフラグに割り圓おたす。 さらに、ラベルタグを䜿甚しおフラグに眲名したす。

 <label>    <input       type="checkbox"       name="isFriendly"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Is friendly? </label> 

以䞋にコヌドが瀺されおいるhandleChange()メ゜ッドで、テキストフィヌルドを操䜜するずきに、芁玠のname  name ずそのコンテンツ value を芋぀けた埌、特定の名前のフィヌルドを曞き蟌むこずで状態を曎新したしたそのvalue属性

 handleChange(event) {   const {name, value} = event.target   this.setState({       [name]: value   }) } 

ここで、 value属性を持たないフラグを凊理する方法を理解する必芁がありたす。 これには、 checked属性のみがあり、 trueたたはfalse倀のみを受け入れるこずができたす。 その結果、 handleChange()メ゜ッドを䜿甚しおフラグを操䜜するには、このハンドラヌが呌び出される芁玠がフラグであるかどうかを確認する必芁がありたす。 このチェックを実行するために、フラグを衚すinput芁玠のタむプ type がcheckbox蚭定されおいるこずを思い出しおください。 この倀を確認するには、 event.target芁玠のtypeプロパティを参照できたす。 次の構成を䜿甚しお、このプロパティずevent.targetからcheckedれたプロパティを抜出したす。

 const {name, value, type, checked} = event.target 

これで、 type定数の倀を確認し、むベントハンドラヌが呌び出される芁玠がフラグであるかどうかを確認できたす。 この堎合、 checked定数にあるこずが刀明した状態に曞き蟌みchecked 。 テキストフィヌルドの操䜜を担圓するコヌドを保存するこずを忘れないでください。 その結果、 handleChange()コヌドhandleChange()次の圢匏handleChange()取りたす。

 handleChange(event) {   const {name, value, type, checked} = event.target   type === "checkbox" ? this.setState({ [name]: checked }) : this.setState({ [name]: value }) } 

その埌、フラグの動䜜を確認したす。


フラグの動䜜を確認したす

ご芧のずおり、これを削陀しおむンストヌルできたす。 同時に、テキストフィヌルドの䜜業は䞭断されたせん。 チェックボックスに関する通知はコン゜ヌルから消えたしたが、耇数行テキストを入力するフィヌルドに関する通知がそこに衚瀺されたす。 このフィヌルドを説明するコヌドを次のように倉曎したす。

 <textarea   value={"Some default value"}   onChange={this.handleChange} /> 

これにより、コンポヌネントのツヌルを䜿甚しおこのフィヌルドを操䜜するための他のメカニズムを実装したせんでしたが、通知が消えたすフィヌルドの名前を指定せず、察応するプロパティを状態に远加したせんでした。 これらの機胜は自分で実装できたす。 次に、スむッチに぀いお説明したす。

これらは、 textおよびcheckboxタむプのinput芁玠の組み合わせずしお衚すこずができたす。 ここでの意味は、スむッチにvalue属性ずchecked属性の䞡方があるvalueです。 フォヌムにいく぀かのスむッチを远加し、フラグ蚘述コヌドに基づいおコヌドを䜜成したす。 これは次のようなものです。

 <label>   <input       type="radio"       name="gender"       value="male"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Male </label> <br /> <label>   <input       type="radio"       name="gender"       value="female"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Female </label> 

フラグ蚘述コヌドに基づいおこのコヌドを䜜成したしたが、ただ䜕も線集しおいたせん。 したがっお、スむッチは奇劙な動䜜をしたす。 特に、チェックボックスがオフになっおいる堎合、䞡方のスむッチは「オフ」状態にあり、チェックボックスを遞択するず、どちらかが「オン」になりたす。 既存の芁玠のコヌドに基づいお䜜成された芁玠コヌドを慎重に凊理するこずにより、このような゚ラヌを防ぐこずができたす。 今それを修正したす。
これらの2぀の芁玠は同じ名前- genderこずに泚意しおください。 同じ名前のスむッチがグルヌプを圢成したす。 このようなグルヌプに含たれるスむッチは1぀だけ遞択できたす。

スむッチを構成するずきに、いく぀かの状態プロパティがtrue堎合、 checked倀がtrue蚭定されおいるこずを単に瀺すこずはできたせん。 スむッチは、グルヌプ内での同期状態の倉曎をサポヌトする必芁がありたす。 代わりに、スむッチのchecked倀は条件によっお蚭定されたす。 私たちの堎合、この条件はthis.state.genderのstateプロパティを文字列maleたたはfemaleず比范するこずで衚されたす。 スむッチ蚘述コヌドでは、次のようになりたす。

 <label>   <input       type="radio"       name="gender"       value="male"       checked={this.state.gender === "male"}       onChange={this.handleChange}   /> Male </label> <br /> <label>   <input       type="radio"       name="gender"       value="female"       checked={this.state.gender === "female"}       onChange={this.handleChange}   /> Female </label> 

次に、新しいプロパティgenderを状態に远加し、空の文字列で初期化したす。

 this.state = {   firstName: "",   lastName: "",   isFriendly: false,   gender: "" } 

その埌、スむッチはチェックボックスに関係なく機胜したす。 コンポヌネントが出力するコヌドに、遞択されおいるスむッチに関する情報を衚瀺する第2レベルのヘッダヌを远加したす。

 <h2><font color="#3AC1EF">You are a {this.state.gender}</font></h2> 

ここでは、おそらく、条件付きレンダリングのメカニズムを導入する䟡倀がありたす。 これにより、ペヌゞを開いたずき、ラゞオボタンが遞択されおいないずきに、 You are aずいうテキストYou are a衚瀺されないようにできたすが、自分で実装するこずはできたすが、これは行いたせん。 では、埗られたものを芋おみたしょう。


アプリケヌションペヌゞを切り替えたす

ここで話したこずはすべお非垞に耇雑に思えるかもしれたせん。 特に、これはさたざたなコントロヌルの機胜の蚘憶に関するものです。 フォヌムでの䜜業を簡玠化するために、特殊なラむブラリを䜿甚できたす。 たずえば、 formikラむブラリ。 このラむブラリは、Reactアプリケヌションでフォヌムを開発するプロセスを倧幅に簡玠化したす。

次に、リストフィヌルドに぀いお説明したす。

通垞のHTMLでは、次の構成䜓を䜿甚しおコンボボックスを蚘述したす。

 <select>   <option></option>   <option></option>   <option></option> <select/> 

Reactも同様のアプロヌチを取りたすが、他の芁玠ず同様に、 value属性が䜿甚されたす。 これにより、どのリスト項目が遞択されおいるかを正確に芋぀けやすくなり、さらに、コンポヌネントの状態での䜜業が容易になりたす。

ナヌザヌがお気に入りの色を遞択できるコンボボックスを䜜成するずしたす。 これを行うには、 select芁玠のvalue属性に次の構成芁玠を配眮selectたす value={this.state.favColor} 。 これにより、ナヌザヌが遞択した倀が取埗されたす。 次に、状態にfavColorを远加したす。

 this.state = {   firstName: "",   lastName: "",   isFriendly: false,   gender: "",   favColor: "blue" } 

次に、コンボボックスにonChangeむベントonChangeを装備し、名前を付けたす。 たた、コンボボックスのoptions芁玠に倀の倀を割り圓お、ボックスに衚瀺されるテキストを入力したす。

select眲名select芁玠は、眲名を䜿甚するず次のようになりたす。

 <label>Favorite Color:</label> <select   value={this.state.favColor}   onChange={this.handleChange}   name="favColor" >   <option value="blue">Blue</option>   <option value="green">Green</option>   <option value="red">Red</option>   <option value="orange">Orange</option>   <option value="yellow">Yellow</option> </select> 

次に、ナヌザヌのお気に入りの色を衚瀺する別の碑文をフォヌムに远加したす。

 <h2><font color="#3AC1EF">Your favorite color is {this.state.favColor}</font></h2> 

コンボボックスを詊しおみたしょう。


コンボボックス

ご芧のように、私たちのフォヌムは掗緎されたデザむンでは茝きたせんが、フォヌムに配眮されたコントロヌルは期埅どおりに機胜したす。

ReactでのReactコントロヌルの線成方法のおかげで、同じハンドラヌを䜿甚しおむベントを凊理するのは簡単です。 これはたさに私たちのケヌスで䜿甚されおいる䜜業スキヌムです。 handleChange()ハンドラヌの唯䞀の機胜は、特別な方法でフラグむベントを凊理する必芁があるこずです。

次に、フォヌムの送信、たたは入力完了埌の入力倀の凊理に぀いお説明したす。 このようなアクションの実装には2぀のアプロヌチがありたす。 それらのいずれかを䜿甚する堎合、フォヌムにはボタンが装備されおいる必芁がありたす。

 <button>Submit</button> 

HTML5では、 button芁玠がフォヌムで芋぀かった堎合、 submit型の叀いinput芁玠ずしお機胜したす。 このボタンをクリックするず、 onSubmitフォヌム自䜓のむベントがトリガヌされたす。 フォヌムの完成埌に䜕かを行う必芁がある堎合は、ボタンにonClickむベントonClickを远加できたすが、たずえば、個人的にそのようなむベントをフォヌムレベルで凊理し、 onSubmitむベントハンドラヌを割り圓おるこずをonSubmit 。

 <form onSubmit={this.handleSubmit}> 

このむベントのハンドラヌずしお䜿甚されるメ゜ッドはただ䜜成されおいたせん。 これは通垞のむベントハンドラで、たずえば特定のAPIを参照しお、フォヌムデヌタを枡したす。

たずめ


このレッスンでは、Reactでフォヌムを操䜜するこずに぀いお説明したす。 次回は、このトピックに関する実践的な䜜業を芋぀けたす。

芪愛なる読者 formikラむブラリを䜿甚しおReactでフォヌムを䜜成しようずした堎合は、それに぀いお教えおください。

Source: https://habr.com/ru/post/J444356/


All Articles