[解決済み] React.forwardRefの使用価値とカスタムrefプロップの使用価値
疑問点
私は、次のように考えています。
React.forwardRef
は、reactのドキュメントから、子機能コンポーネントに参照を渡すための公認の方法であるように見えます。
const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));
// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
しかし、単にカスタムpropを渡すよりも、このようにすることの利点は何でしょうか?
const FancyButton = ({ innerRef }) => (
<button ref={innerRef} className="FancyButton">
{props.children}
</button>
));
const ref = React.createRef();
<FancyButton innerRef={ref}>Click me!</FancyButton>;
私が思いつく唯一の利点は、refに対して一貫したapiを持つことかもしれませんが、他に利点はあるのでしょうか?カスタムプロパティを渡すと、レンダリング時の差分に影響を与え、追加のレンダリングが発生するのでしょうか?
current
フィールドに変更可能な状態として保存されるからです。
例えば、複数の参照先を渡したい場合(実際、コードの匂いを示すかもしれませんが、それでも)、私が見ることができる唯一の解決策は、customRef プロップを使用することでしょう。
私の疑問は
forwardRef
を使うことの価値は何でしょうか?
どのように解決するのですか?
でも
Reactのドキュメント
に対するより柔軟なアプローチとして、カスタム ref プロップに言及しています。
forwardRef
:
React 16.2以下を使用している場合、あるいは による転送よりも柔軟性がある が必要な場合、この代替アプローチを使うことができ、明示的に を別の名前のプロップとして渡すことができます。 .
また 要旨 で、Dan Abramov がその利点について書いています。
- すべてのReactのバージョンと互換性がある
- クラスとファンクションコンポーネントで動作する
- 数層深いネストされたコンポーネントへの参照渡しを簡素化します。
私は、通常のプロップとしてrefを渡しても、そのrefが
の変更
を引き起こすことはなく、複数のrefのために行くべき方法であることを付け加えておきます。の唯一の利点は
forwardRef
が頭に浮かぶのは
- DOM ノード、関数、およびクラス コンポーネントのための統一されたアクセス API (あなたはこれについて言及しました)
-
ref
属性は、例えば TypeScript で型を提供する場合、props API を肥大化させません。
カスタムプロップを渡すと、レンダリング時に差分が影響し、追加のレンダリングが発生するのでしょうか?
ref は、インラインの
コールバック参照
関数を prop として渡すと、再描画を引き起こす可能性があります。しかし、それは
より良いアイデア
のようにクラスインスタンスのメソッドとして定義するか、メモ化するのが良いでしょう。
useCallback
.
関連
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] .prop() vs .attr()
-
[解決済み] JavaScriptでドロップダウンリストの選択値を取得する
-
[解決済み] 配列を値でコピーする
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み] Promise : then vs then + catch [重複].
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?