Reactにおける制御されたコンポーネントと制御されていないコンポーネントの簡単な分析

Reactにおける制御されたコンポーネントと制御されていないコンポーネントの簡単な分析

制御されていないコンポーネント

フォームデータは DOM 自体によって処理されます。つまり、setState() によって制御されず、従来の HTML フォーム入力に似ています。入力値は最新の値を示します (ref を使用して DOM からフォーム値を取得します)

1. 制御されていないコンポーネント

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>タイトル</title>
</head>
<本文>
<!--コンテナを準備する-->
<div id="test"></div>

<!--React Core ライブラリの紹介-->
<script src="../js/react.development.js"></script>
<!-- react 操作 dom をサポートするために react-dom を導入します -->
<script src="../js/react-dom.development.js"></script>
<!--jsx を js に変換するには babel を導入します-->
<script src="../js/babel.min.js"></script>
<!--コンポーネント タグのプロパティを制限するために prop-types を導入します-->
<script src="../js/prop-types.js"></script>

<script type="text/babel">
    クラスLoginはReact.Componentを拡張します。
        React のインスタンスを作成します。
        React のインスタンスを作成します。
        handleSubmit = (イベント) => {
            event.preventDefault() // フォームの送信を禁止する const username = this.myRef1.current
            const パスワード = this.myRef2.current
            alert(`入力したユーザー名は: ${username.value}、入力したパスワードは: ${password.value}`)
        }
        与える() {
            戻る (
                <フォームonSubmit={this.handleSubmit}>
                    ユーザー名: <input ref={this.myRef1} type="text"/> &nbsp;
                    パスワード: <input ref={this.myRef2} type="text"/> &nbsp;
                    <button>ログイン</button>
                </フォーム>
            )
        }
    }
    ReactDOM.render(<Login/>,document.getElementById('test'))
</スクリプト>
</本文>
</html>

制御コンポーネント

HTML では、通常、<input>、<textarea>、<select> タグの値はユーザー入力に基づいて更新されます。 React では、変更可能な状態は通常、コンポーネントの状態プロパティに保存され、 setState() を使用してのみ更新できます。フォームをレンダリングする React コンポーネントは、その後のユーザー入力時にそのフォームに何が起こるかを制御します。このように、React によって制御される入力フォーム要素は値を変更します。これは「制御されたコンポーネント」と呼ばれます。

2. 制御対象コンポーネント(制御対象)

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>タイトル</title>
</head>
<本文>
<!--コンテナを準備する-->
<div id="test"></div>

<!--React Core ライブラリの紹介-->
<script src="../js/react.development.js"></script>
<!-- react 操作 dom をサポートするために react-dom を導入します -->
<script src="../js/react-dom.development.js"></script>
<!--jsx を js に変換するには babel を導入します-->
<script src="../js/babel.min.js"></script>
<!--コンポーネント タグのプロパティを制限するために prop-types を導入します-->
<script src="../js/prop-types.js"></script>

<script type="text/babel">
    クラスLoginはReact.Componentを拡張します。
        // 状態を初期化する state = {
            ユーザー名: ''、
            パスワード: ''
        }

        // ユーザー名を状態に保存する saveUsername = (e) => {
            this.setState({ユーザー名: e.target.value})
        }

        // パスワードを状態に保存する savePassword = (e) => {
            this.setState({パスワード: e.target.value})
        }

        ハンドル送信 = (e) => {
            e.preventDefault() // フォームの送信を禁止する const {username,password} = this.state
            alert(`入力したユーザー名は: ${username}、入力したパスワードは: ${password}`)
        }
        与える() {
            // onChange の変更 return (
                <フォームonSubmit={this.handleSubmit}>
                    ユーザー名: <input onChange={this.saveUsername} type="text"/> &nbsp;
                    パスワード: <input onChange={this.savePassword} type="text"/> &nbsp;
                    <button>ログイン</button>
                </フォーム>
            )
        }
    }
    ReactDOM.render(<Login/>,document.getElementById('test'))
</スクリプト>
</本文>
</html> 

ここに画像の説明を挿入

知らせ

一般的に、ref は非制御コンポーネントで複数回使用されるため、制御コンポーネントの方が頻繁に使用されます。公式ドキュメントには「ref を過度に使用しないでください」と記載されています。ref を過度に使用すると、効率の問題が発生します。

結論は

制御される要素と制御されない要素にはそれぞれ利点があり、選択は具体的な状況によって異なります。フォームが UI フィードバックの点で非常に単純な場合は、ref を制御する、つまり制御されていないコンポーネントを使用することはまったく問題ありません。

特徴制御不能制御された
1回限りの取得(フォームの送信など)はいはい
タイムリーな検証いいえはい
送信ボタンを条件付きで無効にするいいえはい
入力フォーマットを実行するいいえはい
1つのデータに複数の入力いいえはい
ダイナミック入力いいえはい

上記は、React における制御コンポーネントと非制御コンポーネントの詳細についての簡単な分析です。React における制御コンポーネントと非制御コンポーネントの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 反応制御コンポーネントと非制御コンポーネントに関する簡単な説明 (要約)
  • React ディーププログラミングにおける制御されたコンポーネントと制御されていないコンポーネントについての簡単な説明
  • React 学習制御コンポーネントとデータ共有例の分析
  • Reactはフックを使用して、制御されたコンポーネントの状態バインディングを簡素化します。

<<:  Linuxサーバ侵入緊急対応記録(概要)

>>:  MySQL 増分バックアップとブレークポイントリカバリスクリプトの例

推薦する

Linuxシステムはポート3306、8080などを外部に開放します。ファイアウォール設定の詳しい説明

多くの場合、Linux システムに Web サービス アプリケーション (Tomcat、Apache...

Oracle と MySQL の高可用性ソリューションの比較分析

Oracle と MySQL の高可用性ソリューションについては、以前からまとめたいと思っていたので...

CSS変数を使用してダークモードを実装するためのサンプルコード

最近、WeChatはAppleによってダークモードの開発を強制されました。ますます多くのウェブサイト...

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorException の解決方法

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorExce...

jQueryでフルスクリーンスクロール効果を実現

この記事の例では、フルスクリーンスクロールを実現するためのjQueryの具体的なコードを参考までに共...

Deepin Linuxでカーネルを手動でアップグレードする方法

deepinとUbuntuどちらもdebianをベースにしたディストリビューションであり、ここではU...

MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

質問今日、プロジェクト関数を書いていたとき、金額の統計計算を行い、単位を変換する必要がありました。そ...

TypeScript 学習ノート: 型の絞り込み

目次序文型推論真理値の絞り込み平等の縮小演算子の絞り込みインスタンスの絞り込み狭まりの本質ユニオン型...

Nginx プロセス スケジューリングの問題の詳細な説明

Nginx は、マスター プロセス (MasterProcess) と、同じ数のホスト CPU コア...

uniappは録音アップロード機能を実現

目次uni-app の紹介HTML部分js部分インスタンスを作成する録音を開始録音終了録音を再生再生...

Nodejs での WeChat アプレット メッセージ プッシュの実装

サブスクリプションメッセージテンプレートを選択または作成するWeChat アプレットにログインし、「...

DockerはPruneコマンドを使用してnoneイメージをクリーンアップします

目次無イメージの創造と混乱Noneオブジェクトをクリーンアップする方法トリムミラーコンテナで使用され...

Nginx 正規表現の詳細な説明

Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

MySQL で SQL 文の実行時間を表示する方法

目次1. 初期SQLの準備2.MysqlはSQL文の実行時間をチェックします3. さまざまなクエリの...