これまで 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. イジェクトが推奨されないのはなぜですか? 1. eject を実行した後、どのような変化があり...
目次インデックスモデルB+ツリーインデックスの選択インデックスの最適化インデックスの選択性カバーイン...
MySQL の行から列への操作いわゆる行から列への操作は、テーブルの行情報を列情報に変換することです...
目次ウェブパック5公式スタート建築ガイド構築を開始する依存する準備が完了したら、プロジェクトの構築を...
1つ。まず、アイデアとしてパッケージ化する必要があります。私はSpringbootフレームワークプロ...
サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...
1. Dockerサーバーへのリモートアクセスを有効にするdocker が配置されているリモート サ...
01. コマンドの概要seq コマンドは整数のシーケンスを生成するために使用されます。 02. コマ...
インターネット技術の発展に伴い、ユーザーはますます Web ページに依存するようになり、Web フロ...
目次1. Document.execCommand() メソッド(1)コピー操作(2)貼り付け操作(...
目次1. forループ: 基本的でシンプル2. forEach() メソッド: コールバック関数の使...
アプリケーション例ウェブサイト http://www.uhuigou.net画像の動的読み込みは目新...
MySQL 8.0.12のダウンロードとインストールのチュートリアルは参考までに、具体的な内容は次の...
目次Django でのタイムゾーン設定USE_TZ=真USE_TZ=偽Linux コンテナでのタイム...
参考までにWindowsにMySQLをインストールします。具体的な内容は次のとおりです。 1.まずM...