Mam elementy formularza z label
si chcę mieć unikalne identyfikatory, aby połączyć label
je z elementami z htmlFor
atrybutem. Coś takiego:
React.createClass({
render() {
const id = ???;
return (
<label htmlFor={id}>My label</label>
<input id={id} type="text"/>
);
}
});
Kiedyś generowałem identyfikatory na podstawie, this._rootNodeID
ale jest niedostępne od React 0.13. Jaki jest najlepszy i / lub najprostszy sposób, aby to zrobić teraz?
id = 'unique' + (++GLOBAL_ID);
gdzievar GLOBAL_ID=0;
?<label>My label<input type="text"/></label>
Odpowiedzi:
To rozwiązanie działa dobrze dla mnie.
utils/newid.js
:I mogę tego użyć w ten sposób:
Ale nie będzie działać w aplikacjach izomorficznych.
Dodano 17.08.2015 . Zamiast niestandardowej funkcji newId możesz użyć uniqueId z lodash.
Zaktualizowano 28.01.2016 . Lepiej jest wygenerować ID w
componentWillMount
.źródło
render
! Utwórz identyfikator wcomponentWillMount
render
. facebook.github.io/react/docs/component-specs.html . Jednak powinno to być dość łatwe do naprawienia.componentWillMount
jest przestarzałe, zamiast tego zrób to w konstruktorze. Zobacz: Reactjs.org/docs/react-component.html#unsafe_componentwillmountIdentyfikator należy umieścić w module
componentWillMount(aktualizacja na 2018 r.)constructor
, A nierender
. Wprowadzenie gorender
spowoduje niepotrzebne ponowne wygenerowanie nowych identyfikatorów.Jeśli używasz podkreślenia lub lodash, istnieje
uniqueId
funkcja, więc wynikowy kod powinien wyglądać mniej więcej tak:Aktualizacja haków 2019:
źródło
const {current: id} = useRef(_uniqueId('prefix-'))
Po 04.04.2019 wydaje się, że można to osiągnąć za pomocą haków React
useState
:Jak rozumiem, ignorujesz drugi element tablicy w procesie destrukturyzacji tablicy, który pozwoliłby na aktualizację
id
, a teraz masz wartość, która nie zostanie ponownie zaktualizowana przez cały okres użytkowania komponentu.Wartość
id
will tomyprefix-<n>
gdzie<n>
jest zwracana przyrostowa wartość całkowitauniqueId
. Jeśli to nie jest dla Ciebie wystarczająco wyjątkowe, rozważ stworzenie własnego lajkalub sprawdź bibliotekę, którą opublikowałem wraz z tym tutaj: https://github.com/rpearce/simple-uniqueid . Istnieją również setki lub tysiące innych unikalnych identyfikatorów, ale lodash
uniqueId
z prefiksem powinien wystarczyć, aby wykonać zadanie.Aktualizacja 2019-07-10
Dzięki @Huong Hk za wskazanie mi leniwego stanu początkowego hooków , którego sumą jest to, że możesz przekazać funkcję,
useState
która zostanie uruchomiona tylko na początkowym montowaniu.źródło
<input />
liczy się to, że atrybutyhtmlFor
iid
powinny być ze sobą powiązane, niezależnie od wartości.initialState
# 1const [ id ] = useState(() => uniqueId('myprefix-'))
zamiast jako wynik funkcji # 2.const [ id ] = useState(uniqueId('myprefix-'))
Stany:id
dwóch powyższych sposobów nie różnią się. Ale inneuniqueId('myprefix-')
zostanie wykonane raz (nr 1) zamiast każdego ponownego renderowania (nr 2). Zobacz: Leniwy stan początkowy: awarejs.org/docs/hooks-reference.html#lazy-initial-state Jak leniwie tworzyć drogie obiekty ?: awarejs.org/docs/…Możesz użyć do tego biblioteki, takiej jak node-uuid, aby upewnić się, że otrzymujesz unikalne identyfikatory.
Zainstaluj za pomocą:
npm install node-uuid --save
Następnie w komponencie reaguj dodaj:
źródło
render
narusza facebook.github.io/react/docs/component-specs.htmlMam nadzieję, że jest to pomocne dla każdego, kto szuka uniwersalnego / izomorficznego rozwiązania, ponieważ kwestia sumy kontrolnej doprowadziła mnie do tego w pierwszej kolejności.
Jak wspomniano powyżej, stworzyłem proste narzędzie do sekwencyjnego tworzenia nowego identyfikatora. Ponieważ identyfikatory stale rosną na serwerze i zaczynają od 0 w kliencie, zdecydowałem się zresetować przyrost przy każdym uruchomieniu SSR.
Następnie w konstruktorze komponentu głównego lub componentWillMount wywołaj reset. To zasadniczo resetuje zakres JS dla serwera w każdym renderowaniu serwera. W kliencie nie ma to (i nie powinno) mieć żadnego efektu.
źródło
W przypadku zwykłych zastosowań
label
iinput
po prostu łatwiej jest umieścić dane wejściowe w takiej etykiecie:Umożliwia również w polach wyboru / przyciskach radiowych stosowanie dopełnienia do elementu głównego i nadal otrzymywanie informacji zwrotnych o kliknięciu wejścia.
źródło
select
wieloma etykietami na różnych pozycjach, odłączonymi komponentami interfejsu użytkownika itp., Zaleca się również używanie identyfikatorów a11y: Ogólnie rzecz biorąc, wyraźne etykiety są lepiej obsługiwane przez technologię wspomagającą, w3. org / WAI / tutorials / form / labels /…Znalazłem takie proste rozwiązanie:
źródło
Inny prosty sposób z maszynopisem:
źródło
Tworzę moduł generatora uniqueId (Typescript):
I użyj górnego modułu do generowania unikalnych identyfikatorów:
źródło
W ogóle nie używaj identyfikatorów, jeśli nie musisz, zamiast tego zawiń dane wejściowe etykietą taką jak ta:
Wtedy nie musisz martwić się o unikalne identyfikatory.
źródło