ReactでuseStateを使用する詳細な例

ReactでuseStateを使用する詳細な例

使用状態

useState は、関数コンポーネント内で呼び出すことで、コンポーネントに内部状態を追加します。 React は再レンダリング後もこの状態を保持します。使用状態
これは、現在の状態と、それを更新できる関数のペアを返します。この関数は、イベント ハンドラー内または他の場所から呼び出すことができます。クラスコンポーネントに似ています
this.setState ですが、新しい状態と古い状態はマージされません。

次に、useState の使用方法を示す例を見てみましょう。

要件があります: iframe で外部 Web ページを読み込む必要があります

最初のコードでは、この要件を満たすために関数コンポーネントを使用します。これには、 iframe の単純なレンダリングのみが必要です

React をインポートし、{useState} を 'react' から取得します。

'./index.less' からスタイルをインポートします。

関数Link(props) {
  const { 一致: { パラメータ: { リンク = '' } = {} } = {} } = プロパティ;
  const enCodeUrl = decodeURIComponent(リンク);
  const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`;
  戻る (
    <React.フラグメント>
        <iframe
          タイトル={リンク}
          src={url}
          スタイル={{ 幅: '100%', 高さ: '100%', 垂直配置: 'top' }}
          フレームボーダー="0"
        />
    </React.フラグメント>
  );
}

デフォルトリンクをエクスポートします。

新しい要件が来ました。ページに読み込み効果を追加する必要があります。実装方法は非常に簡単です。iframeの load イベントをリッスンして、読み込みの開始と終了を設定します

この要件を満たすには、読み込みステータスを保存する必要がありますが、機能コンポーネントには独自のステータスがないため、クラス コンポーネントに変換する必要があります。

'react' から React をインポートします。
'antd' から Spin をインポートします。

'./index.less' からスタイルをインポートします。

デフォルトのクラスLinkをエクスポートし、React.Componentを拡張します。
  状態 = {
    //ストアの読み込みステータス iLoading: true,
  };

  リンクロード() {
    // 更新の読み込み
    this.setState({ iLoading: false });
  }

  与える() {
    const { 一致: { パラメータ: { リンク = '' } = {} } = {} } = this.props;
    const { iLoading } = this.state;
    const enCodeUrl = decodeURIComponent(リンク);
    const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`;
    戻る (
      <React.フラグメント>
        <Spin spinning={iLoading} wrapperClassName={styles['iframe-loading']}>
          <iframe
            onLoad = {this.linkLoad.bind(this)}
            タイトル={リンク}
            src={url}
            スタイル={{ 幅: '100%', 高さ: '100%', 垂直配置: 'top' }}
            フレームボーダー="0"
          />
        </スピン>
      </React.フラグメント>
    );
  }
}

ページの読み込みを実現するためには、クラスを使用する必要があり、また、これとその他の面倒な動作をバインドする必要があります。これは単なる単純な要件ですが、フックを通じてこれらの問題を解決し、同時にコンポーネント間の状態の再利用の問題も解決できます。これを実現するために useState を使用します

useState をインポートする
React をインポートし、{useState} を 'react' から取得します。
状態を定義します // useState のパラメーターは状態の初期値であり、setInitLoading は状態値を変更するメソッドです const [initLoading, setInitLoading] = useState(true);
状態の更新 onLoad = {() => setInitLoading(false)}
完全なコードは次のとおりです。

React をインポートし、{useState} を 'react' から取得します。
'hzero-ui' から Spin をインポートします。

'./index.less' からスタイルをインポートします。

関数Link(props) {
  const { 一致: { パラメータ: { リンク = '' } = {} } = {} } = プロパティ;
  定数[initLoading、setInitLoading] = useState(true);
  const enCodeUrl = decodeURIComponent(リンク);
  const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`;
  戻る (
    <React.フラグメント>
      <Spin spinning={initLoading} wrapperClassName={styles['iframe-loading']}>
        <iframe
          onLoad = {() => setInitLoading(false)}
          タイトル={リンク}
          src={url}
          スタイル={{ 幅: '100%', 高さ: '100%', 垂直配置: 'top' }}
          フレームボーダー="0"
        />
      </スピン>
    </React.フラグメント>
  );
}

デフォルトリンクをエクスポートします。

使用上の注意を以下に見てみましょう

useStateパラメータ

useState のパラメータは、プリミティブ型またはオブジェクト型のいずれかになります。オブジェクト型を更新するときは、古い状態をマージすることを忘れないでください。そうしないと、古い状態が失われます。

const [パラメータ、setParams] = useState({
  回転: 0,
  色: "#000000"
});

const handleInputChange = イベント => {
  定数ターゲット = イベント.ターゲット;
  setParams({
    ...パラメータ、
    [ターゲット名]: ターゲット値
  });
};

状態依存

最後に更新された状態の値に基づいて現在の状態を計算する必要がある場合は、状態を更新する関数に関数が渡されます。この関数の最初のパラメーターは最後の更新の値であり、計算された結果が戻り値として返されます。

要約する

useState フックを使用すると、関数コンポーネントに状態管理機能を持たせることができます。これは従来のクラス コンポーネントの状態管理に似ていますが、より簡潔で、頻繁に使用する必要はありません。次の記事では、コンポーネント コードとフック コードがそれぞれの機能を実行できるように、他のフックを組み合わせてビジネス ロジックを抽出する方法を紹介します。

以下もご興味があるかもしれません:
  • ReactにおけるuseRefの具体的な使い方
  • JavaScript の useRef と useState の紹介

<<:  データベースクエリの最適化: サブクエリの最適化

>>:  リソースアップロード機能を実現するための SpringBoot+nginx の詳細な例

推薦する

MySQL 5.7.17 圧縮パッケージのインストール不要の構成プロセス図

MySQL データベース管理ソフトウェアには、エンタープライズ エディションとコミュニティ エディシ...

MySQLコマンドプロンプトで入力エラーが発生したときに前のコマンドを修正する方法

目次現在の問題解決プロセス具体的な手順解決した事件現在の問題MySQL コマンド プロンプトに複数行...

MYSQL の binlog 最適化に関する考察の要約

質問質問 1: トランザクションをコミットするときに REDO ログをフラッシュすることによって発生...

CSS で適応型ディバイダーを巧みに実装する N 通りの方法

分割線はウェブページでよく使われるデザインです。例えば、Zhihuのその他の回答をご覧ください。 こ...

MySQL スロークエリ: スロークエリを有効にする

1. スロークエリの用途は何ですか? long_query_time を超えて実行されるすべての S...

Flex レイアウトで適応型ページを作成する (構文と例)

Flex レイアウトの紹介英語の Flex はフレキシブル ボックス、つまり伸縮性のあるボックスを...

Vueはシンプルなマーキー効果を実装します

この記事では、Vueの具体的なコードを共有して、シンプルなマーキー効果を実現しています。具体的な内容...

画像のプリロードと遅延ロードを実装するJavaScript

この記事では、JavaScriptで画像のプリロードと遅延ロードを実装するための具体的なコードを参考...

JavaScriptを使用してSMS認証コード間隔を送信する機能を実装する

多くのアプリやウェブサイトでは、ログインやアカウント登録の際にSMS認証コード1を送信する場所があり...

JavaScript でピンボール ゲームの Web バージョンを実装する

参考までに、JavaScriptのオブジェクトとメソッドを使用して実装されたWebピンボールゲームを...

Vue3 でサードパーティのコンポーネントライブラリをオンデマンドでロードする方法

序文Element Plus を例に、コンポーネントとスタイルのオンデマンド読み込みを構成します。環...

ウェブデザインのためのオンライン開発ツール10選の紹介

1. オンラインテキストジェネレーターBlindTextGenerator: デザイナーにとって、こ...

Linux で PHP を 5.6 にアップグレードする実用的な方法

1: ターミナルに入ったらPHPのバージョンを確認する php -v出力は次のようになります。 PH...

TypeScript の基本型の紹介

目次1. 基本タイプ2. オブジェクトタイプ2.1 配列2.2 タプル2.3 オブジェクト3. 型推...

Docker-compose ネットワークの詳細な例

今日は Docker でのネットワーク設定を試し、後で忘れないようにプロセスを記録しました。 (シス...