Reactフック入門チュートリアル

Reactフック入門チュートリアル

ステートフック

例:

'react' から useState をインポートします。

関数の例() {
 定数[count, setCount] = useState(0);
//count: 宣言された変数; setCount: カウント値を変更する関数; 0: カウントの初期値 return (
  <div>
   <p>クリック回数は {count} 回です</p>
   <ボタンのクリック時={() => setCount(count + 1)}>
    クリックしてください
   </ボタン>
  </div>
 );
}

useState は react に付属するフック関数であり、その機能は状態変数を宣言することです。 useState 関数が受け取るパラメータは初期状態です。配列を返します。この配列の [0] 番目の項目は現在の状態値で、[1] 番目の項目は状態値を変更できるメソッド関数です。
実際に行ったのは聲明了一個狀態變量count,把它的初始值設為0,同時提供了一個可以更改count的函數setCountことです。

ユーザーがボタンをクリックすると、setCount 関数が呼び出され、新しい状態値がパラメーターとして受け取られます。次に、React に任せて、Example コンポーネントを再レンダリングします。

コンポーネントに複数の状態値がある場合はどうなりますか?
まず、 useState是可以多次調用的ため、次のように記述できます。

関数 ExampleWithManyStates() {
 定数[年齢、年齢の設定] = useState(42);
 const [フルーツ、setFruit] = useState('バナナ');
 const [todos, setTodos] = useState([{ text: 'フックを学ぶ' }]);
}

第二に、useState が受け取る初期値は、文字列/数値/ブール値などの単純なデータ型である必要はありません。オブジェクトまたは配列をパラメーターとして受け取ることができます。注目すべき唯一の点は、以前の this.setState は状態をマージして新しい状態を返しましたが、 useState是直接替換老狀態后返回新狀態です。

一方で、フックはクラスではなく関数内で直接使用されます。他方では、各フックは互いに独立しており、同じフックを呼び出す異なるコンポーネントは、それぞれの状態の独立性を確保できます。

react はどのようにして複数の useStates の独立性を確保するのでしょうか?

答えは、 react是根據useState出現的順序來定的です。詳しく見てみましょう

//最初のレンダリング useState(42); //年齢を42に初期化
 useState('banana'); // fruit を banana に初期化します
 useState([{ text: 'フックを学ぶ' }]); //...

 // 2 回目のレンダリング useState(42); // 状態変数 age の値を読み取る (このとき渡されたパラメータ 42 はそのまま無視されます)
 useState('banana'); //状態変数 fruit の値を読み取ります (この時点ではパラメータ banana は無視されます)
 useState([{ text: 'フックを学ぶ' }]); //...

React では、フックの実行順序の一貫性を確保するために、関数の最外層にフックを記述する必要があり、ifelse などの条件文に記述することはできないと規定されています。

エフェクトフック

例:

'react' から useState、useEffect をインポートします。

関数の例() {
 定数[count, setCount] = useState(0);

 // componentDidMount および componentDidUpdate と同様:
 使用効果(() => {
  // ドキュメントのタイトルを更新します document.title = `${count} 回クリックしました`;
 });

 戻る (
  <div>
   <p>クリック回数は {count} 回です</p>
   <ボタンのクリック時={() => setCount(count + 1)}>
    クリックしてください
   </ボタン>
  </div>
 );
}

フックなしでどのように記述するのでしょうか?

クラスExampleはReact.Componentを拡張します{
 コンストラクタ(props) {
  スーパー(小道具);
  この状態 = {
   カウント: 0
  };
 }

 コンポーネントマウント() {
  document.title = `${this.state.count} 回クリックしました`;
 }

 コンポーネントを更新しました() {
  document.title = `${this.state.count} 回クリックしました`;
 }

 与える() {
  戻る (
   <div>
    <p>{this.state.count} 回クリックしました</p>
    <ボタンのonClick={() => this.setState({ count: this.state.count + 1 })}>
     クリックしてください
    </ボタン>
   </div>
  );
 }
}

私たちが作成するステートフル コンポーネントには通常、データを取得するための Ajax リクエストの開始、リスナーの登録と登録解除の追加、DOM の手動変更など、多くの副作用があります。これまで、componentDidMount、componentDidUpdate、componentWillUnmount などのライフサイクル関数フックでこれらの副作用関数を記述してきました。現在的useEffect就相當與這些聲明周期函數鉤子的集合體。 3対1です。

useEffect のいくつかの副作用を解除するにはどうすればいいですか?

傳給useEffect的副作用函數返回一個新的函數即可。この新しい関数は、コンポーネントの次回の再レンダリング後に実行されます。

'react' から useState、useEffect をインポートします。

関数FriendStatus(props) {
 const [isOnline、setIsOnline] = useState(null);

 関数handleStatusChange(ステータス) {
  setIsOnline(ステータスがオンライン)。
 }

 使用効果(() => {
  ChatAPI.subscribeToFriendStatus(props.friend.id、handleStatusChange);
  // この順序に注意してください: コンポーネントの次の再レンダリング後、ChatAPI.subscribeToFriendStatus の次の呼び出しの前にクリーンアップを実行するように react に指示します。
  関数 cleanup() を返す {
   ChatAPI.unsubscribeFromFriendStatus(props.friend.id、handleStatusChange);
  };
 });

 if (isOnline === null) {
  '読み込み中...' を返します。
 }
 isOnline を返します? 'オンライン' : 'オフライン';
}

不要な副作用機能をスキップするにはどうすればよいでしょうか?

前のセクションの考え方によれば、これらの副作用関数はレンダリングが再レンダリングされるたびに実行される必要があり、これは明らかに経済的ではありません。不要な計算をスキップするにはどうすればよいでしょうか? 2 番目のパラメータを useEffect に渡すだけです。 2 番目のパラメータを使用して、このパラメータの値が変更された場合にのみ、渡した副作用関数 (最初のパラメータ) を実行するように React に指示します。

使用効果(() => {
 document.title = `${count} 回クリックしました`;
}, [count]); // countの値が変わったときのみ、文`document.title`が再実行されます

2 番目のパラメータとして空の配列 [] を渡すと、実際には最初のレンダリング時にのみそれを実行するのと同じになります。これは、componentDidMount と componentWillUnmount を組み合わせたパターンです。ただし、この使い方はバグの原因になる可能性があるため、あまり頻繁に使用しないでください。

他にどのような組み込みエフェクトフックがありますか?

使用コンテキスト
使用Reducer
コールバックの使用
メモを使う
参照を使う
命令型メソッドを使用する
ミューテーションエフェクトの使用
レイアウト効果を使用する

カスタムエフェクトフックを記述するにはどうすればいいですか?

なぜエフェクト フックを自分で作成する必要があるのでしょうか。この方法では把可以復用的邏輯抽離出來,變成一個個可以隨意插拔的“插銷”使用したいコンポーネントにプラグインできます。

例えば、上で書いた FriendStatus コンポーネントから友達がオンラインかどうかを判断する機能を抽出し、特定の ID がオンラインかどうかを判断するためだけの新しい useFriendStatus フックを作成することができます。

'react' から useState、useEffect をインポートします。

関数 useFriendStatus(friendID) {
 const [isOnline、setIsOnline] = useState(null);

 関数handleStatusChange(ステータス) {
  setIsOnline(ステータスがオンライン)。
 }

 使用効果(() => {
  ChatAPI.subscribeToFriendStatus(友人ID、handleStatusChange);
  戻り値 () => {
   ChatAPI.unsubscribeFromFriendStatus(友人ID、handleStatusChange);
  };
 });

 isOnline を返します。
}

現時点では、FriendStatus コンポーネントは次のように短縮できます。

関数FriendStatus(props) {
 const isOnline = useFriendStatus(props.friend.id);

 if (isOnline === null) {
  '読み込み中...' を返します。
 }
 isOnline を返します? 'オンライン' : 'オフライン';
}

オンライン情報も表示する必要がある別の友達リストがあるとします。

関数FriendListItem(props) {
 const isOnline = useFriendStatus(props.friend.id);

 戻る (
  <li style={{ color: isOnline ? 'green' : 'black' }}>
   {props.friend.name}
  </li>
 );
}

これにより組件復用が可能になります。

タロイモフック

Taro で Hooks API を使うのはとても簡単です。Taro 独自の Hooks (usePageScroll、useReachBottom など) は @tarojs/taro から導入し、フレームワーク独自の Hooks (useEffect、useState など) は対応するフレームワークから導入します。

import { usePageScroll, useReachBottom } from '@tarojs/taro' // Taro固有のフック
import { useState, useEffect } from 'react' // フレームワークフック(基本フック)

これで、React Hooks の始め方に関する詳細なチュートリアルの記事は終了です。React Hooks に関するより関連性の高い入門コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React 入門レベルの詳細なメモ
  • React Native の基礎: Flexbox レイアウトの初期使用
  • React Native の基礎: React Native アプリケーションのデバッグへの小さな一歩
  • react-reduxプラグインの詳細な紹介
  • React 高階コンポーネントの紹介
  • React を使い始める上で重要な知識ポイントをご存知ですか?

<<:  OR キーワードを使用した MySql 複数条件クエリ ステートメント

>>:  Linux システムの /etc/fstab ファイルの詳細な解釈

推薦する

Prometheusコンテナのデプロイメントのための実用的なソリューション

環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...

MySQL 数十億のデータのインポート、エクスポート、移行に関するメモ

最近はMySQLのメモをたくさん取っていますが、それは主に会社のOracleが比較的安定していてメン...

トリガーメソッドを使用して、ファイルタイプの入力をクリックせずにポップアップファイル選択ダイアログボックスを実現します。

トリガー メソッドを使用できます。JavaScript にはネイティブのトリガー関数はありません。自...

Vue-Routerのインストールと使用方法の詳細な説明

目次インストールルーティングの基本構成Vue にルーターをインストールするルーターの設定Router...

Ubuntuで顔認識ログインを実装するための完全な手順

1. Howdyをインストール: howdyプロジェクトアドレス sudo add-apt-repo...

Linux で txt を mysql にインポートする方法

序文昨日、小さなプロジェクトを書いていたときに、txt ドキュメントのデータを mysql データベ...

MySQLの認証コマンドgrantの使い方

この記事の例は MySQL 5.0 以降で実行されます。ユーザー権限を付与するための MySQL コ...

MySQL Community Server 8.0.12 のインストールと設定方法のグラフィックチュートリアル

MySQL 8 は、NoSQL、JSON などのサポートなど、まったく新しいエクスペリエンスをもたら...

動的および静的分離を実装するための Nginx サンプル コード

この記事のシナリオと組み合わせて、Nginx と Java 環境 (SpringBoot プロジェク...

Linux システムで httpd の自動インストールと構成を Ansible で実装する方法

1. Ansibleのプレイブックを使用してhttpdを自動的にインストールする1) まず、Ansi...

Linux ソフトウェアのインストール場所を確認する簡単な方法

1. ソフトウェアのインストールパスを確認します。 Linuxソフトウェアをインストールできる場所は...

Linux のバックグラウンドで実行するいくつかの方法 (まとめ)

1. ノーフープハングアップ信号を無視してプログラムを実行する追加メモnohup コマンドは、ハン...

Docker ベースの Etcd 分散デプロイメントの方法と手順

1. 環境整備1.1 基本環境NTP設定: 省略 #時間の一貫性を確保するためにNTPサービスを設定...

HTML ul および li タグを使用して画像を表示するサンプル コード

以下のコードをDreamweaverのコードエリアにコピーすると、プレビュー時に以下の画像が表示され...

Bootstrap FileInputは画像アップロード機能を実装します

この記事の例では、Bootstrap FileInputの具体的なコードを共有して、画像アップロード...