HTMLのdata-reactid属性とは何ですか?


93

一部のページのHTMLを調べていたところ、一部のページで次のように「data-reactid」属性が使用されていることに気付きました。

 <a data-reactid="......" ></a>

その属性とは何ですか?その機能は何ですか?


30
data-reactidReact JavaScriptライブラリで使用されるカスタム属性です。FacebookとInstagramで使用するために開発されました。
2013

7
すべての回答は、カスタム日付属性が何であるかを説明するものであり、data-reactidが何であるかを説明するものではないことに注意してください。これは、反応によって使用され、反応オブジェクトクラスインスタンスでdomオブジェクトを参照できます。
adrianj98

2
@ adrianj98、なぜあなたは代わりにあなたのコメントを回答として投稿しなかったのですか?
タコ

3
不思議なことに、FacebookがReactを使用しているのに、自分のサイトでdata-reactidが見つからないのはなぜですか?
PabloRosales 2015年

回答:


131

このdata-reactid属性は、ReactがDOM内のコンポーネントを一意に識別できるようにするために使用されるカスタム属性です。

Reactアプリケーションはサーバーだけでなくクライアントでもレンダリングできるため、これは重要です。内部的にReactは、アプリケーションを構成するDOMノードへの参照の表現を構築します(簡略版は以下です)。

{
  id: '.1oqi7occu80',
  node: DivRef,
  children: [
    {
      id: '.1oqi7occu80.0',
      node: SpanRef,
      children: [
        {
          id: '.1oqi7occu80.0.0',
          node: InputRef,
          children: []
        }
      ]
    }
  ]
}

サーバーとクライアントの間で実際のオブジェクト参照を共有する方法はなく、コンポーネントツリー全体のシリアル化されたバージョンを送信すると、コストが高くなる可能性があります。アプリケーションがサーバーでレンダリングされ、クライアントにロードされて反応すると、それが持っている唯一のデータがあるdata-reactid属性。

<div data-reactid='.loqi70ccu80'>
  <span data-reactid='.loqi70ccu80.0'>
    <input data-reactid='.loqi70ccu80.0' />
  </span>
</div>

それを上記のデータ構造に変換できる必要があります。それを行う方法は、固有のdata-reactid属性を使用することです。これは呼ばれる膨張用コンポーネントツリーを。

また、Reactがクライアント側でレンダリングする場合data-reactid、その参照を失う必要はありませんが、属性を使用することに気付くかもしれません。一部のブラウザでは、アプリケーションをDOMに挿入.innerHTMLし、パフォーマンスを向上させるためにコンポーネントツリーをすぐに膨らませます。

その他の興味深い違いは、クライアント側でレンダリングされたReact IDは増分整数形式(など.0.1.4.3)を持つのに対し、サーバーでレンダリングされたものにはランダムな文字列(など.loqi70ccu80.1.4.3)が前に付けられることです。これは、アプリケーションが複数のサーバーにわたってレンダリングされる可能性があり、衝突がないことが重要であるためです。クライアント側では、レンダリングプロセスは1つしかありません。つまり、一意のIDを確保するためにカウンターを使用できます。

React 15document.createElement代わりにを使用するため、クライアントがレンダリングしたマークアップにはこれらの属性は含まれなくなります。


3
これは、質問に回答する唯一の回答であるため、受け入れられる回答である必要があります。
ジョン


2
React v15 +の場合:> data-reactidはサーバーレンダリングされたコンテンツに引き続き存在しますが、以前よりはるかに小さく、単なる自動インクリメントカウンターです。
RationalDevはGoFundMonicaを気に入っ

1
@RationalDevああ、それは面白いですね。アプリが複数のサーバーでレンダリングされる場合、どのようにして衝突の問題を回避しますか?
ダンプリンス

1
最後のセクションを探していました。追加してくれてありがとう。以前のようにクライアントマークアップに含まれていないのに混乱しましたが、アプリの別の部分には含まれていました(サーバーでレンダリングされました)。
jacoballenwood


11

HTML5のカスタムデータ属性

私の答えでイアンのコメントを引用したいと思います:

これは、要素に関するデータ(有効な属性)であり、要素に関するデータ/情報を格納するために使用できます。

その後、このコードはイベントハンドラーでそれを取得し、それを使用してターゲット出力要素を見つけます。テキストを出力するdivのクラスを効果的に格納します。

reactidは単なるサフィックスですdata-Ayman。ここに任意の名前を付けることができます(例:)。

違いを見つけたい場合は、このSO回答のフィドルをチェックしてコメントしてください


8
指定したリンクによると、属性名に大文字を使用できないことに注意してください。
Lez

1
ええ、その制限は少し誤解を招くものです。DOM自体の実際の属性名は大文字にすることはできませんが、HTMLタグで書き出された属性は大文字にできます。なぜなら、すべてのタグと属性名は、とにかく読み取られるときに自動的に小文字になるからです。したがって、HTMLでは大文字を使用できますが、JSではすべて小文字になります。w3.org/TR/2010/WD-html5-20101019/...
Peeja

3

データ属性は一般に、さまざまな相互作用に使用されます。通常はJavaScriptを使用します。これらはサイトの動作に影響を与えることはなく、必要な目的でデータを渡す便利な方法として機能します。以下に、問題を解決できる記事を示します。

http://ejohn.org/blog/html-5-data-attributes/

data-標準の属性セーフ文字列(スペースや特殊文字を含まない英数字)を前に付けることにより、データ属性を作成できます。たとえば、data-idまたはこの場合data-reactid


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.