Tengo elementos de formulario con label
sy quiero tener ID únicos para vincular label
s a elementos con htmlFor
atributo. Algo como esto:
React.createClass({
render() {
const id = ???;
return (
<label htmlFor={id}>My label</label>
<input id={id} type="text"/>
);
}
});
Solía generar ID basados en this._rootNodeID
pero no está disponible desde React 0.13. ¿Cuál es la mejor y / o más simple forma de hacerlo ahora?
id = 'unique' + (++GLOBAL_ID);
dondevar GLOBAL_ID=0;
?<label>My label<input type="text"/></label>
Respuestas:
Esta solución funciona bien para mí.
utils/newid.js
:Y puedo usarlo así:
Pero no funcionará en aplicaciones isomorfas.
Añadido 17.08.2015 . En lugar de la función newId personalizada, puede usar uniqueId de lodash.
Actualizado 28.01.2016 . Es mejor generar ID en
componentWillMount
.fuente
render
! Crear la identificación encomponentWillMount
render
. facebook.github.io/react/docs/component-specs.html . Sin embargo, debería ser bastante fácil de arreglar.componentWillMount
está en desuso, haga esto en el constructor en su lugar. Ver: reactjs.org/docs/react-component.html#unsafe_componentwillmountLa identificación debe colocarse dentro de
componentWillMount(actualización para 2018)constructor
, norender
. Poniéndolo enrender
volverá a generar nuevos identificadores innecesariamente.Si está usando subrayado o lodash, hay una
uniqueId
función, por lo que su código resultante debería ser algo como:Actualización de ganchos 2019:
fuente
const {current: id} = useRef(_uniqueId('prefix-'))
A partir del 04/04/2019, esto parece lograrse con los ganchos de reacción
useState
:Según tengo entendido, ignora el segundo elemento de la matriz en la desestructuración de la matriz que le permitiría actualizar
id
, y ahora tiene un valor que no se actualizará nuevamente durante la vida útil del componente.El valor de
id
serámyprefix-<n>
donde<n>
es un valor entero incremental devuelto desdeuniqueId
. Si eso no es lo suficientemente exclusivo para ti, considera hacer tu propio me gustao echa un vistazo a la biblioteca que publiqué aquí: https://github.com/rpearce/simple-uniqueid . También hay cientos o miles de otras cosas de identificación únicas, pero lodash
uniqueId
con un prefijo debería ser suficiente para hacer el trabajo.Actualizar 2019-07-10
Gracias a @Huong Hk por señalarme al estado inicial lento de los ganchos , cuya suma es que puedes pasarle una función
useState
que solo se ejecutará en el montaje inicial.fuente
<input />
, lo que importa es que los atributoshtmlFor
yid
deben estar unidos sin importar cuáles sean los valores.initialState
# 1 enconst [ id ] = useState(() => uniqueId('myprefix-'))
lugar del resultado de una función # 2const [ id ] = useState(uniqueId('myprefix-'))
El estado:id
de 2 formas anteriores no son diferentes. Pero lo diferente seuniqueId('myprefix-')
ejecutará una vez (# 1) en lugar de cada re-renderizado (# 2). Ver: Estado inicial diferido : reactjs.org/docs/hooks-reference.html#lazy-initial-state ¿Cómo crear objetos caros perezosamente ?: reactjs.org/docs/…Podría usar una biblioteca como node-uuid para asegurarse de obtener identificadores únicos.
Instalar usando:
npm install node-uuid --save
Luego, en su componente de reacción, agregue lo siguiente:
fuente
render
viola facebook.github.io/react/docs/component-specs.htmlEspero que esto sea útil para cualquiera que esté buscando una solución universal / isomórfica, ya que el problema de la suma de verificación es lo que me llevó aquí en primer lugar.
Como se dijo anteriormente, he creado una utilidad simple para crear secuencialmente una nueva identificación. Como las ID siguen aumentando en el servidor y comienzan de nuevo desde 0 en el cliente, decidí restablecer el incremento cada vez que se inicia el SSR.
Y luego, en el constructor del componente raíz o componentWillMount, llame al reinicio. Esto esencialmente restablece el alcance de JS para el servidor en cada render del servidor. En el cliente no tiene (y no debería) tener ningún efecto.
fuente
Para los usos habituales de
label
yinput
, es más fácil ajustar la entrada en una etiqueta como esta:También hace posible que en las casillas de verificación / botones de radio se aplique el relleno al elemento raíz y aún así obtener comentarios del clic en la entrada.
fuente
select
, por ejemplo , etiquetas múltiples en diferentes posiciones, componentes de interfaz de usuario desacoplados, etc., también se recomienda usar identificadores a11y: en general, las etiquetas explícitas son mejor compatibles con la tecnología de asistencia, w3. org / WAI / tutoriales / formularios / etiquetas / ...Encontré una solución fácil como esta:
fuente
Otra forma simple con mecanografiado:
fuente
Creo un módulo generador de ID único (Typecript):
Y use el módulo superior para generar identificadores únicos:
fuente
No use ID en absoluto si no lo necesita, en su lugar, ajuste la entrada en una etiqueta como esta:
Entonces no tendrá que preocuparse por identificaciones únicas.
fuente