React制御コンポーネントと非制御コンポーネントとは何ですか?


101

ReactJSの制御コンポーネントと非制御コンポーネントとは何ですか?それらはどのように互いに異なりますか?


21
再開するための指名。それは実際にはかなり正確な質問です。それが広すぎると考えることができるかわかりません。
チャーリーフラワーズ

回答:


127

これはステートフルDOMコンポーネント(フォーム要素)に関連し、Reactドキュメントは違いを説明します:

  • 制御されたコンポーネントはを通じて現在の値をとるものですpropsようにコールバックして変更と通知onChange。親コンポーネントは、コールバックを処理して自身の状態を管理し、新しい値をプロップとして制御されたコンポーネントに渡すことによって、それを「制御」します。これを「ダムコンポーネント」と呼ぶこともできます。
  • A 制御されていないコンポーネントは、内部で自身の状態を保存するものであり、あなたが使用してDOMを照会refあなたがそれを必要とするとき、現在の値を見つけること。これは、従来のHTMLに少し似ています。

ほとんどのネイティブReactフォームコンポーネントは、制御された使用と制御されていない使用の両方をサポートします。

// Controlled:
<input type="text" value={value} onChange={handleChange} />

// Uncontrolled:
<input type="text" defaultValue="foo" ref={inputRef} />
// Use `inputRef.current.value` to read the current value of <input>

ほとんど(またはすべて)の場合、制御されたコンポーネントを使用する必要があります


1
stateいうよりも値をとっていませんpropsか?
Ivanka Todorova、2018年

9
@IvankaTodorova制御されたコンポーネントの場合、値はを介して渡されますprops。制御されていないコンポーネントはstate、値自体を内部的に制御するために使用します。これが大きな違いです。
Aaron Beall 2018年

1
それらの間の違いは、その値が設定/渡され、コールバックが呼び出されていていることをその構成部品であるcontrolled components<input type="text" value="value" onChange={handleChangeCallbackFn} />入力要素は、独自の値を処理し、経由して読み取ることができ、従来のHTML対)refsと呼ばれますuncontrolled components<value type="text" />)。制御されたコンポーネントはsetState、親コンポーネントからプロップとして、または親コンポーネントから取得して、独自の状態を管理しています。
Lior Elrom

defaultValueプロップを介してそれを取得するコンポーネントをどのように呼び出しますが、コントローラーに通知しますonBlurか?
Paul Razvan Berg、

@PaulRazvanBergアンチパターンのように聞こえますが、状態は1か所で制御する必要があります。通常は、最も近い共通の祖先に状態持ち上げます。
アーロンBeall

1
  • 制御されたコンポーネントは、コールバックを使用して他のコンポーネントに変更について通知します。次に例を示します<Button onClick={() => console.log("clicked")}>Click</Button>
  • 制御されていないコンポーネントは、変更について他のコンポーネントに通知せず、ref-sを使用してのみコンポーネントにアクセスできます。HTML要素の実際のdomにアクセスする必要がある場合は、Refが役立つことがあります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.