ホームページ >ウェブフロントエンド >jsチュートリアル >Reactフック:あなた自身を始めて構築する方法
フックは反応の世界を席巻しています。このチュートリアルでは、フックとは何か、どのように使用するかを見ていきます。 Reactで出荷するいくつかの一般的なフックを紹介し、自分のものを書く方法を示します。終了する頃には、自分のReactプロジェクトでフックを使用できるようになります。
キーテイクアウトReactフックは、2018年10月に開催されたReact Conferenceで最初に発表され、React 16.8で公式に利用可能になりました。機能はまだ開発中です。まだ多くのReactクラス機能がフックに移行されています。良いニュースは、今すぐ使用を開始できることです。必要に応じてReactクラスコンポーネントを使用することもできますが、この入門ガイドを読んだ後にしたいと思うとは思いません。
私があなたの好奇心をそそりたなら、飛び込み、いくつかの実用的な例を見てみましょう。前提条件
このチュートリアルは、反応が何であり、どのように機能するかを基本的に理解している人々を対象としています。 React初心者の場合は、ここで進む前にReactチュートリアルを始めましょう。
これにより、MyAppフォルダーが作成されます。このフォルダーに変更して、そのように開発サーバーを起動します:
デフォルトのブラウザが開き、新しいReactアプリが表示されます。このチュートリアルの目的のために、src/app.js。
にあるアプリコンポーネントで作業することができます。npx create-react-app myappこのチュートリアルのこのチュートリアルのコードと、このチュートリアルの最後にある完成したコードのデモも見つけることができます。
uesestate hook
<span>cd myapp </span><span>npm start </span>次に、いくつかのコードを見てみましょう。 UseStateフックは、おそらくReactに出荷される最も一般的なフックです。名前が示すように、関数コンポーネントで状態を使用できます。
次のReactクラスコンポーネントを検討してください:
Create Reactアプリをフォローしている場合は、app.jsの内容を上記に置き換えてください。
コードを理解するために少し時間を与えてください。 コンストラクターでは、状態オブジェクトの名前プロパティを宣言し、コンポーネントインスタンスにハンドレンマンガンジ関数をバインドしています。次に、入力のあるフォームがあり、その値はthis.state.nameに設定されています。 this.state.nameに保持されている値は、挨拶の形でページに出力されます。
ユーザーが入力フィールドに何かを入力すると、HandlenAmechange関数が呼び出され、状態とその結果、挨拶を更新します。
次に、UseState Hookを使用してこのコードの新しいバージョンを作成します。その構文は次のようになります:
npx create-react-app myappuseState関数を呼び出すと、2つの項目が返されます。
状態:あなたの状態の名前 - this.state.nameまたはthis.state.locationなどのような。
<span>cd myapp </span><span>npm start </span>クラス全体のコンストラクターは、単一の行で構成されるUseStateフックに置き換えられました。
UseStateフックはローカル変数を出力するため、このキーワードを使用して関数変数または状態変数を参照する必要はなくなりました。正直なところ、これはほとんどのJavaScript開発者にとって大きな痛みです。これを使用する必要があるとは限らないためです。
JSXコードは、これを使用せずにローカルの状態値を参照できるため、クリーンになりました。ここに複数のuseStateフックがあるコンポーネントの例があります:
非常に簡単ですね。クラスバージョンで同じことをするには、このキーワードをさらに使用する必要があります。
さあ、次の基本的なReactフックに進みましょう。データの取得、データストリームへのサブスクライブ、または手動でDOMの変更などの特定の操作を実行するには、ほとんどのReactコンポーネントが必要です。これらの種類の操作は、副作用として知られています
クラスベースのコンポーネントでは、通常、副作用コードをComponentDidMountとcomponentDidupdateに入れます。これらは、適切なタイミングでレンダリング方法をトリガーできるライフサイクル方法です。
ここに簡単な例があります:<span>import <span>React</span> from "react"; </span> <span>export default class ClassDemo extends React<span>.Component</span> { </span> <span>constructor(props) { </span> <span>super(props); </span> <span>this.state = { </span> <span>name: "Agata" </span> <span>}; </span> <span>this.handleNameChange = this.handleNameChange.bind(this); </span> <span>} </span> <span>handleNameChange(e) { </span> <span>this.setState({ </span> <span>name: e.target.value </span> <span>}); </span> <span>} </span> <span>render() { </span> <span>return ( </span> <span><section> </span> <span><form autoComplete="off"> </span> <span><section> </span> <span><label htmlFor="name">Name</label> </span> <span><input </span> type<span>="text" </span> name<span>="name" </span> id<span>="name" </span> value<span>={this.state.name} </span> onChange<span>={this.handleNameChange} </span> <span>/> </span> <span></section> </span> <span></form> </span> <span><p>Hello {this.state.name}</p> </span> <span></section> </span> <span>); </span> <span>} </span><span>} </span>
npx create-react-app myapp
このコードは、州で保持されているものに基づいてドキュメントタイトルを設定します。ただし、フォームを介して状態値に変更を加えると、何も起こりません。これを修正するには、別のライフサイクル方法を追加する必要があります。
フォームの更新もドキュメントタイトルを更新する必要があります。<span>cd myapp </span><span>npm start </span>Useefectフックを使用して同じロジックを実装する方法を見てみましょう。上記の関数コンポーネントを次のように更新してください:
これらの数行のコードだけで、1つの単純な関数に2つのライフサイクルメソッドの作業を実装しました。
<span>import <span>React</span> from "react"; </span> <span>export default class ClassDemo extends React<span>.Component</span> { </span> <span>constructor(props) { </span> <span>super(props); </span> <span>this.state = { </span> <span>name: "Agata" </span> <span>}; </span> <span>this.handleNameChange = this.handleNameChange.bind(this); </span> <span>} </span> <span>handleNameChange(e) { </span> <span>this.setState({ </span> <span>name: e.target.value </span> <span>}); </span> <span>} </span> <span>render() { </span> <span>return ( </span> <span><section> </span> <span><form autoComplete="off"> </span> <span><section> </span> <span><label htmlFor="name">Name</label> </span> <span><input </span> type<span>="text" </span> name<span>="name" </span> id<span>="name" </span> value<span>={this.state.name} </span> onChange<span>={this.handleNameChange} </span> <span>/> </span> <span></section> </span> <span></form> </span> <span><p>Hello {this.state.name}</p> </span> <span></section> </span> <span>); </span> <span>} </span><span>} </span>
クリーンアップコードの追加
これは簡単な例でした。ただし、データストリームからの登録解除やイベントリスナーからの登録解除など、クリーンアップコードを作成する必要がある場合があります。これが通常、Reactクラスコンポーネントにどのように実装されているかの例を見てみましょう:
f11
を押すと、モニターの完全な解像度を表示する必要があります。また、ライフサイクルメソッドComponentWillunMountを使用して、サイズ変更イベントの登録を解除しました。<span>const [state, setState] = useState(initialState); </span>フックバージョンの上記のクラスベースのコードを複製しましょう。この新しい機能を処理するには、3番目のUseStateフックと2番目の使用Effectフックを定義する必要があります。
驚くべきことに、このコードのフックバージョンはまったく正確に行われます。よりクリーンでコンパクトです。コードを独自の使用効果宣言に入れることの利点は、コードが単独であるため、簡単にテストできることです。
このUseefectフックで関数を返していることに気づきましたか?これは、Useefect関数内で返す関数がクリーンアップのコードと見なされるためです。関数を返さない場合、クリーンアップは実行されません。この場合、クリーンアップが必要です。それ以外の場合は、「マウントされていないコンポーネントでReact State Updateを実行できない」というブラウザコンソールにログインしたエラーメッセージが発生します。<span>import <span>React, { useState }</span> from "react"; </span> <span>export default function <span>HookDemo</span>(props) { </span> <span>const [name, setName] = useState("Agata"); </span> <span>function handleNameChange(e) { </span> <span>setName(e.target.value); </span> <span>} </span> <span>return ( </span> <span><section> </span> <span><form autoComplete="off"> </span> <span><section> </span> <span><label htmlFor="name">Name</label> </span> <span><input </span> type<span>="text" </span> name<span>="name" </span> id<span>="name" </span> value<span>={name} </span> onChange<span>={handleNameChange} </span> <span>/> </span> <span></section> </span> <span></form> </span> <span><p>Hello {name}</p> </span> <span></section> </span> <span>); </span><span>} </span>カスタム反応フック
UseStateとEffect Hooksについて学んだので、これまでに達成したよりもコードをさらにコンパクトでクリーンで再利用可能にするための本当にクールな方法を見せてください。コードをさらに簡素化するために、
を作成します。
これを行い、サイズの機能を抽出し、コンポーネントの外側に配置します。次のように新しい関数を作成します:
…これで:
2番目の使用Effectコードを削除します。ファイルを保存してテストします。すべてが以前と同じように機能するはずです。
最初のカスタムフックを作成したので、ドキュメントタイトルについても同じことをしましょう。まず、コンポーネント内でEffectを使用するために残りの呼び出しを削除します。次に、コンポーネントの外側に、次のコードを追加します
npx create-react-app myapp最後に、コンポーネント内から呼び出してください:
<span>cd myapp </span><span>npm start </span>ブラウザに戻り、入力フィールドに何かを入力します。ドキュメントのタイトルは、前と同じように変更する必要があります
最後に、フォームフィールドをリファクタリングしましょう。私たちは、州の対応する値と同期するためのフックを作成したいと考えています。
カスタムフックから始めましょう。コンポーネントの外側に次のものを追加します:
次に、コンポーネントを更新して使用します
<span>import <span>React</span> from "react"; </span> <span>export default class ClassDemo extends React<span>.Component</span> { </span> <span>constructor(props) { </span> <span>super(props); </span> <span>this.state = { </span> <span>name: "Agata" </span> <span>}; </span> <span>this.handleNameChange = this.handleNameChange.bind(this); </span> <span>} </span> <span>handleNameChange(e) { </span> <span>this.setState({ </span> <span>name: e.target.value </span> <span>}); </span> <span>} </span> <span>render() { </span> <span>return ( </span> <span><section> </span> <span><form autoComplete="off"> </span> <span><section> </span> <span><label htmlFor="name">Name</label> </span> <span><input </span> type<span>="text" </span> name<span>="name" </span> id<span>="name" </span> value<span>={this.state.name} </span> onChange<span>={this.handleNameChange} </span> <span>/> </span> <span></section> </span> <span></form> </span> <span><p>Hello {this.state.name}</p> </span> <span></section> </span> <span>); </span> <span>} </span><span>} </span>コードをゆっくりと通過し、行ったすべての変更を特定します。かなりきれいですよね?私たちのコンポーネントははるかにコンパクトです。
このチュートリアルの目的のために、私たちはそれらを使用するコンポーネントと同じファイル内の機能としてフックを宣言しています。ただし、通常のReactプロジェクトでは、これらの各フックが別のファイルにあるフックフォルダーがあり、必要な場所にインポートできます。
コードの主なロジックとは完全に独立しているため、useforminput、usewindowresolutionフックを外部NPMモジュールにパッケージ化することもできます。これらのカスタムフックは、プロジェクトの他の部分、または将来の他のプロジェクトでも簡単に再利用できます。 参照のために、完全なHooksコンポーネントバージョン:<span>const [state, setState] = useState(initialState); </span>を参照してください
フックのコンポーネントは、クラスコンポーネントバージョンとまったく同じようにレンダリングして動作する必要があります。
フックバージョンをクラスコンポーネントバージョンと比較すると、フック機能によりコンポーネントコードが少なくとも30%削減されることがわかります。再利用可能な機能をNPMライブラリにエクスポートすることで、コードをさらに削減することもできます。
次に、コードで他の人のフックをどのように使用できるかを見てみましょう。
サードパーティのフックを使用してデータを取得します<span>import <span>React, { useState }</span> from "react"; </span> <span>export default function <span>HookDemo</span>(props) { </span> <span>const [name, setName] = useState("Agata"); </span> <span>function handleNameChange(e) { </span> <span>setName(e.target.value); </span> <span>} </span> <span>return ( </span> <span><section> </span> <span><form autoComplete="off"> </span> <span><section> </span> <span><label htmlFor="name">Name</label> </span> <span><input </span> type<span>="text" </span> name<span>="name" </span> id<span>="name" </span> value<span>={name} </span> onChange<span>={handleNameChange} </span> <span>/> </span> <span></section> </span> <span></form> </span> <span><p>Hello {name}</p> </span> <span></section> </span> <span>); </span><span>} </span>
axiosとReactフックを使用して、REST JSON APIからデータを取得する方法の例を見てみましょう。自宅でフォローしている場合は、Axiosライブラリをインストールする必要があります。
コンポーネントを変更して、次のようになります
次の出力を期待する必要があります
npx create-react-app myapp
以下では、axios-hooks:
を使用して上記のコードをリファクタリングしました<span>cd myapp </span><span>npm start </span>
コードからUseStateと使用Effectフックを取り除いただけでなく、私たちの側に余分な脳力を持たずに3つの新しい能力を獲得しました。
読み込みステータスを表示するdemo
以下は、これまでに達成したことのライブデモです:
これらは、日々の反応プロジェクトで出くわす基本的な反応フックです:
uesestate:ローカル州の管理
useref:コンポーネントの寿命のために持続する可変refオブジェクトを返します。
npx create-react-app myapp
このようなnpmまたはyarnを使用してローカルストレージフックをインストールする必要があります。
<span>cd myapp </span><span>npm start </span>かなりきちんとして、
Reactフックの導入により、大きなスプラッシュができました。その波は、Reactコミュニティを越えてJavaScriptの世界に移動しました。これは、フックがJavaScriptエコシステム全体に利益をもたらす新しい概念であるためです。実際、Vue.JSチームは最近、Composition APIと呼ばれる類似のものをリリースしました。
React HooksとContext APIが州の管理王座からのReduxを転覆することについての話もあります。明らかに、フックはコーディングをはるかに簡単にし、新しいコードの書き方を変えました。あなたが私のような場合、あなたはおそらくあなたのすべてのReactコンポーネントクラスを書き直し、それらを機能的なコンポーネントフックに置き換える強い衝動を持っています。これは本当に必要ではないことに注意してください。Reactチームは、Reactクラスコンポーネントを非難する予定ではありません。また、すべてのReact Class Lifecycleメソッドがまだフックで可能であるわけではないことに注意する必要があります。もう少し長くReactコンポーネントクラスに固執する必要がある場合があります。
基本的なReactフックに関する新しい知識に十分に自信を持っている場合は、挑戦を残したいと思います。このカウントダウンタイマークラスを反応フックを使用してリファクタリングして、可能な限り清潔でコンパクトにする。幸せなコーディング、そしてあなたがどのように乗るかを教えてください!
React HooksのFAQ 反応フックとは何ですか?Reactフックは、機能コンポーネントのReact状態とライフサイクルの機能を「フック」できる機能です。それらは、クラスコンポーネントを作成せずに状態やその他の反応機能を有効にするためにReact 16.8で導入されました。
機能成分の状態論理の再利用を簡素化するために反応フックが導入され、コンポーネントの状態と副作用の管理が容易になりました。フック?usereducerフックは、より複雑な国家管理のためにUseStateに代わるものです。予測可能な方法で状態遷移を管理する必要がある場合に役立ちます。
ビルトインフックまたはその他のカスタムフックを使用する関数を定義することにより、カスタムフックを作成できます。これらのカスタムフックは、コンポーネント間でステートフルなロジックをカプセル化して共有できます。正しく使用すると、Reactフックは不必要な再レンダーを減らすことでパフォーマンスを向上させることができます。ただし、USEMEMOとUSECALLBACKフックを使用して、必要に応じてパフォーマンスを最適化することが不可欠です。
以上がReactフック:あなた自身を始めて構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。