J'ai des éléments de formulaire avec label
s et je souhaite avoir des identifiants uniques pour lier les label
s aux éléments avec htmlFor
attribut. Quelque chose comme ça:
React.createClass({
render() {
const id = ???;
return (
<label htmlFor={id}>My label</label>
<input id={id} type="text"/>
);
}
});
J'avais l'habitude de générer des identifiants basés sur this._rootNodeID
mais ce n'est pas disponible depuis React 0.13. Quelle est la meilleure et / ou la plus simple façon de le faire maintenant?
id = 'unique' + (++GLOBAL_ID);
oùvar GLOBAL_ID=0;
?<label>My label<input type="text"/></label>
Réponses:
Cette solution fonctionne très bien pour moi.
utils/newid.js
:Et je peux l'utiliser comme ceci:
Mais cela ne fonctionnera pas dans les applications isomorphes.
Ajouté le 17.08.2015 . Au lieu de la fonction newId personnalisée, vous pouvez utiliser uniqueId de lodash.
Mis à jour le 28.01.2016 . Il est préférable de générer une pièce d'identité
componentWillMount
.la source
render
! Créer l'identifiant danscomponentWillMount
render
. facebook.github.io/react/docs/component-specs.html . Cela devrait être assez facile à réparer.componentWillMount
est obsolète, faites-le plutôt dans le constructeur. Voir: reactjs.org/docs/react-component.html#unsafe_componentwillmountL'identifiant doit être placé à l'intérieur de
componentWillMount(mise à jour pour 2018)constructor
, pasrender
. Le mettre enrender
génèrera inutilement de nouveaux identifiants.Si vous utilisez un trait de soulignement ou un lodash, il existe une
uniqueId
fonction, donc votre code résultant devrait être quelque chose comme:Mise à jour des Hooks 2019:
la source
const {current: id} = useRef(_uniqueId('prefix-'))
Suite à partir du 04/04/2019, cela semble pouvoir être accompli avec les React Hooks
useState
:Si je comprends bien, vous ignorez le deuxième élément du tableau dans la déstructuration du tableau qui vous permettrait de mettre à jour
id
, et vous avez maintenant une valeur qui ne sera pas mise à jour à nouveau pendant la durée de vie du composant.La valeur de
id
seramyprefix-<n>
où<n>
est une valeur entière incrémentielle renvoyéeuniqueId
. Si ce n'est pas assez unique pour vous, pensez à créer le vôtreou consultez la bibliothèque que j'ai publiée avec ceci ici: https://github.com/rpearce/simple-uniqueid . Il existe également des centaines ou des milliers d'autres éléments d'identification uniques, mais les lodash
uniqueId
avec un préfixe devraient suffire pour faire le travail.Mise à jour 10/07/2019
Merci à @Huong Hk de m'avoir pointé vers l'état initial paresseux des hooks , dont la somme est que vous pouvez passer une fonction à
useState
qui ne sera exécutée que sur le montage initial.la source
<input />
, ce qui importe, c'est que les attributshtmlFor
etid
doivent être liés, quelles que soient les valeurs.initialState
# 1const [ id ] = useState(() => uniqueId('myprefix-'))
au lieu du résultat d'une fonction # 2const [ id ] = useState(uniqueId('myprefix-'))
L'état:id
des 2 façons ci-dessus ne sont pas différentes. Mais le différentuniqueId('myprefix-')
sera exécuté une fois (# 1) au lieu de chaque nouveau rendu (# 2). Voir: État initial paresseux: reactjs.org/docs/hooks-reference.html#lazy-initial-state Comment créer des objets coûteux paresseusement?: Reactjs.org/docsVous pouvez utiliser une bibliothèque telle que node-uuid pour cela afin de vous assurer d'obtenir des identifiants uniques.
Installez en utilisant:
npm install node-uuid --save
Ensuite, dans votre composant de réaction, ajoutez ce qui suit:
la source
render
viole facebook.github.io/react/docs/component-specs.htmlJ'espère que cela sera utile à tous ceux qui recherchent une solution universelle / isomorphe, car le problème de la somme de contrôle est ce qui m'a amené ici en premier lieu.
Comme indiqué ci-dessus, j'ai créé un utilitaire simple pour créer séquentiellement un nouvel identifiant. Étant donné que les ID continuent d'augmenter sur le serveur et recommencent à partir de 0 dans le client, j'ai décidé de réinitialiser l'incrément à chaque démarrage du SSR.
Et puis dans le constructeur ou componentWillMount du composant racine, appelez la réinitialisation. Cela réinitialise essentiellement la portée JS du serveur dans chaque rendu de serveur. Chez le client, cela n'a pas (et ne devrait pas) avoir d'effet.
la source
Pour les utilisations habituelles de
label
etinput
, il est simplement plus facile d'encapsuler l'entrée dans une étiquette comme celle-ci:Cela permet également dans les cases à cocher / boutons radio d'appliquer un remplissage à l'élément racine et d'obtenir toujours des commentaires sur le clic sur l'entrée.
la source
select
, des étiquettes multiples sur différentes positions, des composants d'interface utilisateur non couplés, etc., l'utilisation d'id est également recommandée a11y: En général, les étiquettes explicites sont mieux prises en charge par la technologie d'assistance, w3. org / WAI / tutorials / forms / labels /…J'ai trouvé une solution simple comme celle-ci:
la source
Autre moyen simple avec dactylographié:
la source
Je crée un module générateur uniqueId (Typescript):
Et utilisez le module supérieur pour générer des identifiants uniques:
la source
N'utilisez pas du tout d'ID si vous n'en avez pas besoin, enveloppez plutôt l'entrée dans une étiquette comme celle-ci:
Vous n'aurez alors plus à vous soucier des identifiants uniques.
la source