これまで 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 のインストールチュートリアル(推奨)
この記事では、例を使用して、MySQL マスター/スレーブ レプリケーションと読み取り/書き込み分離...
このチュートリアルは Windows システムにのみ適用されます。インストールしたがまだインストール...
以前はaタグのname属性を使ってジャンプする方法しか知らなかったのですが、idも使えることを今日知...
効果図は以下のとおりです。 <!DOCTYPE html> <html lang=...
目次1. MySQLのインストール1.2 テーブル、データベース、ユーザーを作成する1.3 リモート...
目次背景問題の説明原因分析シミュレーションする総括する背景日常の使用において、MySQL で個別また...
序文この記事はかなり詳細で、少し面倒です。他のチュートリアル ドキュメントでは多くの手順が省略されて...
日々の開発経験と関連するオンライン情報に基づいて、アダプティブとレスポンシブの違いをシンプルでわかり...
Vue $set 配列コレクションオブジェクトの割り当てVue カスタム配列オブジェクト コレクショ...
React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...
アプリケーションが牛のように遅い理由は数多くあります。ネットワーク、システム アーキテクチャ、または...
目次1. はじめに2. es5メソッド3. 非同期関数のシリアル実行4. 非同期関数の並列実行5. ...
1. 表示効果: 2、HTML構造 <div class="プロセスリスト-lpu...
Alibaba Cloud ServerがFTPに接続できないFileZilla 425 データ接続...
目次作成機能配列プロトタイプの削減Array.prototype.reduceRightパイプ関数作...