これまで 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 のインストールチュートリアル(推奨)
開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバイ...
検索ページ: search.wxml ページ: <view class="form&...
この記事では、例を使用して、MySQL 外部キー制約の一般的な操作について説明します。ご参考までに、...
目次1. プロジェクトの見通し2. 知識ポイントObject.assign() の使用法filter...
目次序文1. es6の前にオブジェクトを作成する2. es6 後のクラス宣言3. クラスの継承4. ...
目次1. MySQLをダウンロードする1.1 ダウンロード1.2 インストール1. MySQLをダウ...
シェルを起動する頻度は非常に低いですが。 。 。しかし、書くたびに、多くの jar ファイル パスを...
目次導入始めるReact Nativeゲームエンジンの簡単な紹介React Nativeでスネークゲ...
1. インデックスの役割一般的に言えば、インデックスは本の目次に相当します。条件に基づいてクエリを実...
序文この記事では、最近私が遭遇した 2 つの状況について説明します。今後、新たな発見があれば追加して...
かつて、サイコロを振るゲームについて話しました。その時は、steps 属性 + スプライト画像を使用...
mptemp は安全な方法で一時ファイルまたはディレクトリを作成します。このコマンドの適用範囲: R...
目次序文時間型を保存するのに文字列を使用しないでくださいMySQL の日付型日時タイムスタンプTIM...
目次成果を達成する利用可能なプラグインの紹介ニーズに応じてプラグインを選択するプラグインのインストー...
まず、仮想マシンを開きます xshell5 を開いて仮想マシンに接続します (より便利です。Linu...