目次
ref 概要
ref はコールバック関数の代わりに文字列値に設定することもできます; このメソッドは基本的に推奨されないか、将来の反応バージョンではサポートされなくなりますこの方法ですが、理解できます。
ref 設定値がコールバック関数であっても文字列であっても、
前述のとおり
ref在无状态组件中的使用
ref在HOC中存在问题
总结

React の ref とは何ですか

Feb 01, 2021 am 09:13 AM
react.js

ref は、React コンポーネント インスタンスまたは DOM 要素を操作するために React によって提供されるインターフェイスです。コールバック関数は dom ノードまたはコンポーネントに関数をマウントするもので、関数の入力パラメータは dom ノードまたはコンポーネントです。目的の効果を達成するためのインスタンス。文字列形式と同じであり、その参照が取得されます。

React の ref とは何ですか

react の一般的なデータ フローでは、props を渡すことが、親コンポーネントと子コンポーネントが対話する唯一の方法です。新しい props 値を渡すことで、子コンポーネントを Rere-render して、親子コンポーネントの通信を実現します。もちろん、react 公式 Web サイトに記載されているように、react では通常のデータ量に加えて、場合によっては (サードパーティの dom ライブラリとの統合や、特定の dom 要素に焦点を当てるなど)、サブコンポーネントを変更する必要があります。これは ref の方法です。

ref 概要

React によって提供される ref 属性は、コンポーネントの実際のインスタンスへの参照を表し、実際には ReactDOM です。 render() はコンポーネント インスタンスを返します; 区別する必要があります。ReactDOM.render()コンポーネントをレンダリングする場合はコンポーネント インスタンスを返し、dom 要素をレンダリングする場合はコンポーネント インスタンスを返します。特定の dom ノード。

たとえば、次のコード:

    const domCom = <button>button</button>;
    const refDom = ReactDOM.render(domCom,container);
    //ConfirmPass的组件内容省略
    const refCom = ReactDOM.render(<confirmpass></confirmpass>,container);
    console.log(refDom);
    console.log(refCom);
ログイン後にコピー
上記のコードは、以下に示すようなコンソール結果を返します:

React の ref とは何ですか

ref コンポーネントまたは dom 要素のいずれかのコンポーネントにハングできます。この 2 つの違いは、上の図の答えと同じです:

コンポーネントにハング (ここで、コンポーネントはステートフルなものを指します) コンポーネントの ref はコンポーネント インスタンスへの参照を表し、dom 要素にマウントされている場合、特定の dom 要素ノードを表します。

ref はコールバック関数に設定できます

ref 属性はコールバック関数に設定できますが、これは公式に推奨されている使用法でもあり、この関数の実行のタイミングは次のとおりです。

  • コンポーネントがマウントされると、 コールバック関数がすぐに実行され、コールバック関数のパラメータはコンポーネントの特定のインスタンスになります。

  • コンポーネントがアンインストールされるか、元の ref 属性自体が変更される場合も 、コールバックもすぐに実行されます。このとき、コールバック関数のパラメーターは ## です。 #null メモリリークを確実にするため。

  • 関連する推奨事項: 「
react チュートリアル

たとえば、次のコード:

    RegisterStepTwo = React.createClass({
        getInitialState(){
          return {visible: true};
        },
      changeVisible(){
        this.setState({visible: !this.state.visible});
      },
      refCb(instance){
        console.log(instance);
      },
      render(){
        return(
          <p>
            <button>{this.state.visible ? '卸载' : '挂载'}ConfirmPass
            </button>
            {
              this.state.visible ?
                <confirmpass></confirmpass>: null
             }
           </p>
         )
      }
    });
ログイン後にコピー

上記のコードは次のようになります。対応するコンポーネント インスタンスが console.log に表示されることがわかります。ボタンを切り替えると、

confirmPass

もマウントとアンマウントが切り替わり、異なる console.log の結果が表示されます。 ref は文字列に設定できます

ref はコールバック関数の代わりに文字列値に設定することもできます; このメソッドは基本的に推奨されないか、将来の反応バージョンではサポートされなくなりますこの方法ですが、理解できます。

たとえば、次の

input

は ref の値を文字列に設定します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;input&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div>これにより、実際には dom 要素ノードである

this.refs.input

を介してイベント コールバックなどの他の場所でコンポーネント インスタンスにアクセスできるようになります。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">let inputEl = this.refs.input; //然后通过inputEl来完成后续的逻辑,如focus、获取其值等等</pre><div class="contentsignin">ログイン後にコピー</div></div>ref 参照コンポーネントに対応する dom ノードの取得

ref 設定値がコールバック関数であっても文字列であっても、

ReactDOM.findDOMNode( ref)

マウント後の実際の dom ノード。 ただし、HTML 要素に ref を使用する場合、ref 自体は要素の実際の dom ノードを参照します。これを取得するために

ReactDOM.findDOMNode(ref)

を使用する必要はありません。メソッドは React コンポーネントでよく使用されます。 ステートフル コンポーネントでの ref の使用

前述のとおり

ref

react ステートフル コンポーネントを使用する場合、ref はコンポーネントのインスタンスを参照するため、##サブコンポーネントの #ref を使用すると、propsstaterefs、およびサブコンポーネント インスタンスのインスタンス メソッド (非継承) にアクセスできます。方法)など。 ref を使用してサブコンポーネントにアクセスする場合は、次のような場合があります:

  • this.refs を通じて、サブコンポーネントの特定の dom ノードにアクセスして、特定のロジックを完了します。 childComponentRefName.refs.someDomRefName

    を入力して完了します (segmentfault で質問者が提起した質問など)。

  • サブコンポーネントのパブリック インスタンス メソッドにアクセスして、特定の書き込みロジックを完了できます。たとえば、子コンポーネントは、子コンポーネントのフォーム要素の値をリセットする
  • reset

    メソッドを定義します。このとき、親コンポーネントは、this.refs.childComponentRefName.reset( ) 要素のリセット。

  • ...
  • そうは言っても、React では、親コンポーネント内の子コンポーネントのインスタンス メソッドに直接アクセスして、特定のロジックを完了するには、ほとんどの場合、代わりに標準の反応データ フロー メソッドを使用する方が明確です;

さらに、上記の場合、コンポーネントの関係が深くネストされている場合、このメソッドは非常に見苦しくなります。

ref在无状态组件中的使用

上文说到的react组件都是指有状态的,对于无状态组件stateless component而言,正如这篇文章React创建组件的三种方式及其区别里描述的一样,无状态组件是不会被实例化的,在父组件中通过ref来获取无状态子组件时,其值为null,所以:

无法通过ref来获取无状态组件实例。

虽然无法通过ref获取无状态组件实例,但是可以结合复合组件来包装无状态组件来在其上使用ref引用。

另外,对于无状态组件我们想访问的无非是其中包含的组件或者dom元素,我们可以通过一个变量来保存我们想要的组件或者dom元素组件的实例引用。例如下面代码:

function TestComp(props){
    let refDom;
    return (<p>
        </p><p> refDom = node}>
            ...
        </p>
    )
}
ログイン後にコピー

这样,可以通过变量refDom来访问到无状态组件中的指定dom元素了,访问其中的其他组件实例类似。

ref在HOC中存在问题

react的HOC是高阶组件,简单理解就是包装了一个低阶的组件,最后返回一个高阶的组件;高阶组件其实是在低阶组件基础上做了一些事情,比方说antd组件的Form create的方法,它就是在为低阶组件封装了一些特殊的属性,比如form属性。

既然HOC会基于低阶组件生成一个新的高阶组件,若用ref就不能访问到我们真正需要的低阶组件实例,我们访问到的其实是高阶组件实例。所以:

若HOC不做特殊处理,ref是无法访问到低阶组件实例的

要想用ref访问低阶组件实例,就必须得HOC支持,就像Redux的connect方法提供的withRef属性来访问低阶组件一样。具体可以参考这里。

总结

ref提供了一种对于react标准的数据流不太适用的情况下组件间交互的方式,例如管理dom元素focus、text selection以及与第三方的dom库整合等等。 但是在大多数情况下应该使用react响应数据流那种方式,不要过度使用ref。

另外,在使用ref时,不用担心会导致内存泄露的问题,react会自动帮你管理好,在组件卸载时ref值也会被销毁。

最后补充一点:

不要在组件的render方法中访问ref引用,render方法只是返回一个虚拟dom,这时组件不一定挂载到dom中或者render返回的虚拟dom不一定会更新到dom中。

以上がReact の ref とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Reactの親コンポーネントで子コンポーネントのメソッドを呼び出す方法 Reactの親コンポーネントで子コンポーネントのメソッドを呼び出す方法 Dec 27, 2022 pm 07:01 PM

呼び出しメソッド: 1. クラス コンポーネントの呼び出しは、React.createRef()、ref または props のカスタム onRef 属性の関数宣言を使用して実装できます; 2. 関数コンポーネントおよびフック コンポーネントの呼び出しは、useImperativeHandle または forwardRef を使用して実装できます。子コンポーネントの ref が実装されています。

React ソースコードをデバッグするにはどうすればよいですか?複数のツールを使用したデバッグ方法の紹介 React ソースコードをデバッグするにはどうすればよいですか?複数のツールを使用したデバッグ方法の紹介 Mar 31, 2023 pm 06:54 PM

React ソースコードをデバッグするにはどうすればよいですか?次の記事では、さまざまなツールで React のソース コードをデバッグする方法について説明し、コントリビューター、create-react-app、vite プロジェクトで React の実際のソース コードをデバッグする方法を紹介します。

React のカスタムフックについての深い理解 React のカスタムフックについての深い理解 Apr 20, 2023 pm 06:22 PM

React カスタム フックは、コンポーネント ロジックを再利用可能な関数にカプセル化する方法であり、クラスを作成せずに状態ロジックを再利用する方法を提供します。この記事では、カプセル化フックをカスタマイズする方法を詳しく紹介します。

Reactでdivの高さを設定する方法 Reactでdivの高さを設定する方法 Jan 06, 2023 am 10:19 AM

React で div の高さを設定する方法: 1. CSS を通じて div の高さを実装します; 2. ステートでオブジェクト C を宣言し、オブジェクトに変更ボタンのスタイルを格納し、A を取得して C の "marginTop" をリセットします. それがキャンです。

React がアプリ構築の第一選択肢として Vite を使用しない理由 React がアプリ構築の第一選択肢として Vite を使用しない理由 Feb 03, 2023 pm 06:41 PM

React はなぜ Vite をアプリケーション構築の第一の選択肢として使用しないのでしょうか?次の記事では、React が Vite をデフォルトの推奨事項として推奨しない理由について説明します。

7 つの優れた実用的な React コンポーネント ライブラリ (プレッシャーの下で共有) 7 つの優れた実用的な React コンポーネント ライブラリ (プレッシャーの下で共有) Nov 04, 2022 pm 08:00 PM

この記事では、日常の開発で頻繁に使用される、優れた実用的な React コンポーネント ライブラリを 7 つ紹介します。

よりクリーンな React コードを書くための 10 の実践的なヒント よりクリーンな React コードを書くための 10 の実践的なヒント Jan 03, 2023 pm 08:18 PM

この記事では、よりシンプルな React コードを記述するための 10 の実践的なヒントを紹介します。

[翻訳] カスタムフックを使用した React コンポーネントのリファクタリング [翻訳] カスタムフックを使用した React コンポーネントのリファクタリング Jan 17, 2023 pm 08:13 PM

React の関数コンポーネントについて人々が話し、関数コンポーネントは必然的に大きくなり、論理的により複雑になるという話をよく聞きます。結局のところ、コンポーネントを「関数」で記述したため、コンポーネントが拡張され、関数も拡張し続けることを受け入れる必要があります。

See all articles