これまで react.forwardRef は react の高階コンポーネントには適用できませんでした。最近やっとわかったので、書き留めておきます。重要な点は、React.forwardRef API の ref が React コンポーネントではなく dom 要素を指す必要があることです。 React.forwardRef の使用例以下は、React コンポーネントに適用されたこのエラーの例です。 const A = React.forwardRef((props,ref)=><B {...props} ref={ref}/>) これは私が以前よくやっていた間違いです。ここでの参照は効果的ではありません。 前述したように、ref は DOM 要素を指す必要があるため、正しいメソッドが適用されます。 const A = React.forwardRef((props, ref) => ( <div ref={ref}> <B {...小道具} /> </div> )) 機能と注意点
親コンポーネントは子コンポーネントのDom要素インスタンスを取得します。 React をインポートし、{useRef} を 'react' から取得します。 './content' からコンテンツをインポートします。 const ホーム = () => { // Ref オブジェクトを作成します。const connectRef = useRef(null); const handleFoucus = () => { _ref を connectRef.current に設定します。 _ref.focus(); }; 戻る ( <div> <ボタンのクリック={() => handleFoucus()}> 子コンポーネントでDOM要素のメソッドを使用する</button> <コンテンツref={connectRef} /> </div> ); }; デフォルトのホームをエクスポートします。 React をインポートし、{ forwardRef } を 'react' から取得します。 /** * forwardRefがラップした後、refは渡されたref属性を受け取るための2番目のパラメータとして使用されます。 * 例 * <コンテンツ数={count} ユーザー={user} 参照={connectRef}> * * @param props - {count, user} * @param ref - connectRef * */ const コンテンツ = (props, ref) => { 戻る ( <div> {/* 渡された ref に ref をバインドする ≈ ref={connectRef} */ <input type="password" ref={ref} /> </div> ) }; デフォルトの forwardRef(Content) をエクスポートします。 親コンポーネントは子コンポーネントのクラスコンポーネントインスタンスを取得します。React をインポートし、{useRef} を 'react' から取得します。 './content' からコンテンツをインポートします。 const ホーム = () => { // Ref オブジェクトを作成します。const connectRef = useRef(null); 定数handleAdd = () => { _ref を connectRef.current に設定します。 const { count } = _ref.state; _ref.setState({ カウント: カウント + 1 }) }; 戻る ( <div> <ボタンのクリック={() => handleAdd()}> 子コンポーネントでクラスコンポーネントのプロパティとメソッドを使用する</button> <コンテンツref={connectRef} /> </div> ); }; デフォルトのホームをエクスポートします。 React をインポートし、{ forwardRef } を 'react' から取得します。 './header' からヘッダーをインポートします。 './footer' からフッターをインポートします。 /** * forwardRefがラップした後、refは渡されたref属性を受け取るための2番目のパラメータとして使用されます。 * 例 * <コンテンツ数={count} ユーザー={user} 参照={connectRef}> * * @param props - {count, user} * @param ref - connectRef * */ const コンテンツ = (props, ref) => { 戻る ( <div> {/* 渡された ref に ref をバインドする ≈ ref={connectRef} */ <Header ref={ref} />{/* クラス コンポーネント*/ {/* <Footer ref={ref} /> 関数コンポーネントにはインスタンスがないので、connectRef.current: null */ </div> ) }; デフォルトの forwardRef(Content) をエクスポートします。 'react' から React をインポートします。 デフォルトクラス Header をエクスポートし、React.Component を拡張します { 状態 = { カウント: 0 }; 与える() { 戻る ( <div> {この州数} </div> ) } }; 高階成分の特殊なケース高階コンポーネントは受信したすべてのプロパティをラップされたコンポーネントに渡します(透過的な伝送) /* 参照の処理 例: Hoc1(Hoc2(コンテンツ)) <Content ref={myRef} /> Content にバインドされた ref は Hoc1 にバインドされ、最初のメソッド React.forwardRef には渡されません ================ React.forwardRef()を使用してHoc1の外部でrefを処理し、propsを使用してrefを渡す 0. forwardRefを高階成分の外側にラップし、refをインターセプトして取得し、props(xxx={ref})を追加し、実際の成分はprops.xxxを通じて取得されます1. 使用時にref={XXXX}を渡す // 2番目の方法との違い2. forwardRefの2番目のパラメータを使用してrefを取得します 3. 参照を下方に転送するための新しいプロパティを追加します。例: forwardedRef={ref} 4. 実際のコンポーネントにref={props.forwardedRef}をバインドする const Home = (props) => { 定数 connectRef = useRef(null); 戻る ( <div> <コンテンツref={connectRef} /> </div> ); }; // ラップされたコンポーネント const Content = (props) => { 戻る ( <div> <input type="password" ref={props.forwardedRef} /> </div> ); }; // forwardRef の 2 番目の入力パラメータは ref を受け取り、Hoc の外側のレイヤーで ref を処理できます export default React.forwardRef((props, ref) => { const Wrapper = React.memo(Content); // Hoc // forwardRef は Wrapper をラップします // Wrapper 内の実際のコンポーネントに ref を渡す必要があります // Wrapper に props 属性を追加し、ref オブジェクトを props として子コンポーネントに渡します return <Wrapper {...props} forwardedRef={ref} />; }); 2番目の方法 ========== 0. 使用時に参照を保存するにはpropsを使用します 1. 使用時にxxx={ref}を渡す // 最初の方法との違い 2. 実際のコンポーネントでref={props.xxx}をバインドする const Home = (props) => { 定数 connectRef = useRef(null); 戻る ( <div> <コンテンツ forwardedRef={connectRef} /> </div> ); }; // 高階コンポーネントを定義する export const Hoc = (WrappedComponent) => { クラス Wrapper は React.Component を拡張します { 与える() { <WrappedComponent {...props} /> を返します。 } } } // ラップされたコンポーネント const Content = (props) => { 戻る ( <div> <input type="password" ref={props.forwardedRef} /> </div> ); }; // パッケージ化プロセス export default Hoc(Content); * */ 以上がReact forwardRefの使い方と注意点の詳しい内容です。React forwardRefの使い方についてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご注目ください! 以下もご興味があるかもしれません:
|
<<: Linux で cmake を使用して MySQL をコンパイルおよびインストールするための詳細なチュートリアル
>>: CentOS8 jdk8 / java8 のインストールチュートリアル(推奨)
1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...
また、多くの場合、メンテナンスのために Web サイトを少なくとも数分間オフラインにする必要がありま...
スタンドアロンの hbase について、まずは説明しましょう。 Dockerをインストールするまず ...
これは私の最初のブログ投稿です。時間の制約があるため、どのようにフォーマットすればよいかわかりません...
目次序文vue-i18nをインストールするロケールの設定getLangs.js の実装i18nインス...
この記事では、WeChatアプレットで星評価を実装するための具体的なコードを参考までに紹介します。具...
dockerの登場により、多くのサービスが徐々にハードウェアアーキテクチャへの依存から脱却しました。...
目次1. 範囲2. 関数の戻り値3. 関数のネスト4. 終了5. クロージャの実用的応用1. 内部変...
シナリオ: データ量が増加すると、MySQL が配置されているディスクがいっぱいになり、より大きなス...
1. はじめにこの記事には MySQL インストール部分のスクリーンショットがないので、ある程度の基...
現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...
1. システムの Python バージョンに応じて、pip インストール パッケージをダウンロードし...
開発を行う際に、次のような状況に遭遇することがよくあります。 a.swf が Web ページに追加さ...
この記事の例では、参考のためにjsカスタム右クリックメニューの具体的なコードを共有しています。具体的...
tomcat の解凍されたディレクトリを開くと、次のディレクトリ構造が表示されます。 1.Tomca...