co to jest atrybut data-actid w html?


94

Przeglądając kod HTML niektórych stron, zauważyłem, że niektóre z nich używają tego atrybutu „data -activeid”, na przykład:

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

Co to za atrybut i jaka jest jego funkcja?


30
data-reactidjest atrybutem niestandardowym używanym przez bibliotekę React JavaScript . Który został opracowany do użytku z Facebookiem i Instagramem.
amit

7
Należy pamiętać, że wszystkie odpowiedzi wyjaśniają, czym są niestandardowe atrybuty daty, a nie wyjaśniają, czym jest data-actid. Jest używany przez reagowanie, aby móc odwoływać się do obiektu dom z instancją klasy reagującego elementu.
adrianj98

2
@ adrianj98, dlaczego zamiast tego nie zamieściłeś swojego komentarza jako odpowiedzi?
Octopus

3
Zastanawiam się, jeśli Facebook używa React, dlaczego nie znajduję żadnych danych reagujących na ich stronie?
PabloRosales

Odpowiedzi:


132

data-reactidAtrybut jest atrybutem zwyczaj stosowany tak, że React można jednoznacznie zidentyfikować jego elementów w DOM.

Jest to ważne, ponieważ aplikacje React mogą być renderowane zarówno na serwerze, jak i na kliencie. Wewnętrznie React tworzy reprezentację odwołań do węzłów DOM, które tworzą twoją aplikację (uproszczona wersja jest poniżej).

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

Nie ma możliwości współdzielenia rzeczywistych odwołań do obiektów między serwerem a klientem, a wysłanie serializowanej wersji całego drzewa komponentów jest potencjalnie kosztowne. Kiedy aplikacja jest renderowana na serwerze, a React jest ładowany na kliencie, jedynymi danymi, jakie posiada, są data-reactidatrybuty.

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

Musi mieć możliwość konwersji tego z powrotem do powyższej struktury danych. Sposób, w jaki to robi, polega na unikalnych data-reactidatrybutach. Nazywa się to nadmuchiwaniem drzewa komponentów.

Możesz również zauważyć, że jeśli React renderuje się po stronie klienta, używa data-reactidatrybutu, nawet jeśli nie musi tracić swoich odniesień. W niektórych przeglądarkach wstawia aplikację do DOM, .innerHTMLa następnie od razu rozszerza drzewo komponentów, aby zwiększyć wydajność.

Inną interesującą różnicą jest to, że identyfikatory React renderowane po stronie klienta będą miały przyrostowy format liczby całkowitej (jak .0.1.4.3), podczas gdy identyfikatory renderowane przez serwer będą poprzedzone losowym ciągiem znaków (takim jak .loqi70ccu80.1.4.3). Dzieje się tak, ponieważ aplikacja może być renderowana na wielu serwerach i ważne jest, aby nie było kolizji. Po stronie klienta istnieje tylko jeden proces renderowania, co oznacza, że ​​liczniki mogą być używane do zapewnienia unikalnych identyfikatorów.

document.createElementZamiast tego używa React 15 , więc znaczniki renderowane przez klienta nie będą już zawierać tych atrybutów.


3
To powinna być akceptowana odpowiedź, ponieważ jest jedyną, która odpowiada na pytanie.
John


2
dla React v15 +:> data-actid jest nadal obecna w przypadku treści renderowanych przez serwer, jednak jest znacznie mniejsza niż wcześniej i jest po prostu licznikiem automatycznie zwiększającym się.
RationalDev lubi GoFundMonica

1
@RationalDev Ach, to interesujące. Jak można obejść problem kolizji, jeśli aplikacja jest renderowana na wielu serwerach?
Dan Prince

1
Szukałem tej ostatniej sekcji, dzięki za dodanie. Byłem zdezorientowany, dlaczego moje znaczniki klienta nie zawierały go tak, jak wcześniej, ale inna część mojej aplikacji go zawierała (była renderowana na serwerze).
jacoballenwood


11

Atrybut danych niestandardowych w HTML5

Chciałbym zacytować komentarz Iana w mojej odpowiedzi:

To tylko atrybut (ważny) elementu, którego możesz użyć do przechowywania danych / informacji o nim.

Ten kod następnie pobiera go później w programie obsługi zdarzeń i używa go do znalezienia docelowego elementu wyjściowego. Skutecznie przechowuje klasę div, do której powinien być wyprowadzony tekst.

reactidto tylko przyrostek, możesz mieć tutaj dowolną nazwę, np data-Ayman. : .

Jeśli chcesz znaleźć różnicę, sprawdź skrzypce w tej odpowiedzi SO i skomentuj .


8
pamiętaj, że nie możesz używać wielkich liter w nazwie atrybutu, zgodnie z podanym linkiem.
Lez

1
Tak, to ograniczenie jest trochę mylące. Rzeczywista nazwa atrybutu w samym DOM nie może mieć wielkich liter, ale atrybut zapisany w tagu HTML może, ponieważ wszystkie nazwy tagów i atrybutów są automatycznie zamieniane małymi literami podczas ich odczytywania. Tak więc w HTML możesz używać wielkich liter, ale w JS wszystko kończy się małymi. w3.org/TR/2010/WD-html5-20101019/ ...
Peeja

3

atrybuty danych są powszechnie używane w różnych interakcjach. Zwykle za pomocą javascript. Nie wpływają one na nic związanego z zachowaniem witryny i stanowią wygodną metodę przekazywania danych w dowolnym celu. Oto artykuł, który może wyjaśnić sprawę:

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

Atrybut danych można utworzyć, poprzedzając data-dowolny standardowy bezpieczny łańcuch atrybutów (alfanumeryczny bez spacji i znaków specjalnych). Na przykład data-idlub w tym przypadkudata-reactid


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.