qual è l'attributo data-reactid in html?


93

Mentre esaminavo l'HTML di alcune pagine, ho notato che alcune di esse utilizzano questo attributo "data-reactid" come:

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

Qual è questo attributo e qual è la sua funzione?


30
data-reactidè un attributo personalizzato utilizzato dalla libreria JavaScript di React . Sviluppato per essere utilizzato con Facebook e Instagram.
amit

7
Si noti che tutte le risposte spiegano cosa sono gli attributi data personalizzati e non spiegano cosa sia data-reactid. Viene utilizzato da React per poter fare riferimento all'oggetto dom con l'istanza della classe dell'elemento React.
adrianj98

2
@ adrianj98, perché invece non hai postato il tuo commento come risposta?
Octopus

3
Mi chiedo, se Facebook utilizza React, perché non trovo alcun data-reactid nel loro sito?
PabloRosales

Risposte:


131

L' data-reactidattributo è un attributo personalizzato utilizzato in modo che React possa identificare in modo univoco i suoi componenti all'interno del DOM.

Questo è importante perché le applicazioni React possono essere renderizzate sia sul server che sul client. Internamente React crea una rappresentazione di riferimenti ai nodi DOM che compongono la tua applicazione (la versione semplificata è sotto).

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

Non è possibile condividere i riferimenti agli oggetti effettivi tra il server e il client e l'invio di una versione serializzata dell'intero albero dei componenti è potenzialmente costoso. Quando l'applicazione viene visualizzata sul server e React viene caricato sul client, gli unici dati di cui dispone sono gli data-reactidattributi.

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

Deve essere in grado di riconvertirlo nella struttura dati sopra. Il modo in cui lo fa è con gli data-reactidattributi unici . Questo si chiama gonfiare l'albero dei componenti.

Potresti anche notare che se React esegue il rendering sul lato client, utilizza l' data-reactidattributo, anche se non ha bisogno di perdere i suoi riferimenti. In alcuni browser, inserisce la tua applicazione nel DOM utilizzando .innerHTMLquindi gonfia immediatamente l'albero dei componenti, come aumento delle prestazioni.

L'altra differenza interessante è che gli ID React renderizzati lato client avranno un formato intero incrementale (come .0.1.4.3), mentre quelli renderizzati dal server saranno preceduti da una stringa casuale (come .loqi70ccu80.1.4.3). Questo perché l'applicazione potrebbe essere renderizzata su più server ed è importante che non ci siano collisioni. Sul lato client, esiste un solo processo di rendering, il che significa che i contatori possono essere utilizzati per garantire ID univoci.

React 15 usa document.createElementinvece , quindi il markup renderizzato dal client non includerà più questi attributi.


3
Questa dovrebbe essere la risposta accettata in quanto è l'unica che risponde alla domanda.
Giovanni


2
per React v15 +:> data-reactid è ancora presente per i contenuti renderizzati dal server, tuttavia è molto più piccolo di prima ed è semplicemente un contatore a incremento automatico.
RationalDev ha aggiunto GoFundMonica

1
@ RationalDev Ah, è interessante. Come si aggira il problema di collisione se l'app viene visualizzata su più server?
Dan Prince

1
stavo cercando l'ultima sezione, grazie per averla aggiunta. Ero confuso sul motivo per cui il markup del mio client non lo includeva come faceva prima, ma un'altra parte della mia app lo aveva (era reso sul server).
jacoballenwood


11

Attributo dei dati personalizzati in HTML5

Vorrei citare il commento di Ian nella mia risposta:

È solo un attributo (valido) dell'elemento che puoi utilizzare per memorizzare dati / informazioni su di esso.

Questo codice lo recupera quindi in un secondo momento nel gestore eventi e lo utilizza per trovare l'elemento di output di destinazione. Memorizza efficacemente la classe del div in cui deve essere emesso il testo.

reactidè solo un suffisso, si può avere qualsiasi nome qui ad esempio: data-Ayman.

Se vuoi trovare la differenza controlla i violini in questa risposta e commenta SO .


8
nota che non puoi usare lettere maiuscole nel nome dell'attributo, secondo il link che hai fornito.
Lez

1
Sì, quella restrizione è un po 'fuorviante. Il nome dell'attributo effettivo, nel DOM stesso, non può contenere lettere maiuscole, ma l'attributo così come scritto nel tag HTML sì, perché tutti i nomi di tag e attributi vengono automaticamente minuscoli mentre vengono letti comunque. Quindi in HTML puoi usare lettere maiuscole, ma in JS finirà tutto in minuscolo. w3.org/TR/2010/WD-html5-20101019/…
Peeja

3

gli attributi dei dati sono comunemente usati per una varietà di interazioni. Tipicamente tramite javascript. Non influenzano nulla sul comportamento del sito e rappresentano un metodo conveniente per trasmettere dati per qualsiasi scopo necessario. Ecco un articolo che potrebbe chiarire le cose:

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

È possibile creare un attributo di dati aggiungendo data-un prefisso a qualsiasi stringa sicura di attributi standard (alfanumerico senza spazi o caratteri speciali). Ad esempio, data-ido in questo casodata-reactid


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.