Eu tenho elementos de formulário com label
s e quero ter IDs exclusivos para vincular label
s a elementos com htmlFor
atributo. Algo assim:
React.createClass({
render() {
const id = ???;
return (
<label htmlFor={id}>My label</label>
<input id={id} type="text"/>
);
}
});
Eu costumava gerar IDs com base, this._rootNodeID
mas não está disponível desde o React 0.13. Qual é a melhor e / ou mais simples maneira de fazer isso agora?
id = 'unique' + (++GLOBAL_ID);
ondevar GLOBAL_ID=0;
?<label>My label<input type="text"/></label>
Respostas:
Essas soluções funcionam bem para mim.
utils/newid.js
:E eu posso usá-lo assim:
Mas não funcionará em aplicativos isomórficos.
Adicionado 17.08.2015 . Em vez da função newId personalizada, você pode usar uniqueId do lodash.
Atualizado 28.01.2016 . É melhor gerar um ID
componentWillMount
.fonte
render
! Crie o id emcomponentWillMount
render
. facebook.github.io/react/docs/component-specs.html . Deve ser bem fácil de corrigir.componentWillMount
estiver obsoleto, faça isso no construtor. Veja: reactjs.org/docs/react-component.html#unsafe_componentwillmountO ID deve ser colocado dentro de
componentWillMount(atualização para 2018)constructor
, nãorender
. Colocá-lorender
irá gerar novos IDs desnecessariamente.Se você estiver usando sublinhado ou lodash, há uma
uniqueId
função; portanto, o código resultante deve ser algo como:Atualização de ganchos de 2019:
fonte
const {current: id} = useRef(_uniqueId('prefix-'))
No seguimento de 04-04-2019, isso parece ser possível com o React Hooks '
useState
:Pelo que entendi, você ignora o segundo item da matriz na desestruturação da matriz que permitiria a atualização
id
e agora você tem um valor que não será atualizado novamente durante a vida útil do componente.O valor de
id
serámyprefix-<n>
onde<n>
é um valor inteiro incremental retornadouniqueId
. Se isso não for único o suficiente para você, considere fazer o seu próprioou confira a biblioteca que publiquei aqui: https://github.com/rpearce/simple-uniqueid . Existem também centenas ou milhares de outras coisas únicas de identificação por aí, mas os lodashs
uniqueId
com um prefixo devem ser suficientes para fazer o trabalho.Atualização 2019-07-10
Agradeço ao @Huong Hk por me indicar um estado inicial lento , cuja soma é que você pode passar uma função para
useState
que só seja executada na montagem inicial.fonte
<input />
, o que importa é que os atributoshtmlFor
eid
devem estar ligados, independentemente dos valores.initialState
# 1 emconst [ id ] = useState(() => uniqueId('myprefix-'))
vez de resultado de uma função # 2const [ id ] = useState(uniqueId('myprefix-'))
O estado:id
de 2 maneiras acima não serão diferentes. Mas o diferente éuniqueId('myprefix-')
será executado uma vez (# 1) em vez de cada re-renderizado (# 2). Veja: preguiçoso estado inicial: reactjs.org/docs/hooks-reference.html#lazy-initial-state Como criar objetos caros preguiçosamente ?: reactjs.org/docs/...Você pode usar uma biblioteca como o node-uuid para garantir que você obtenha IDs exclusivos.
Instale usando:
npm install node-uuid --save
Em seguida, no seu componente de reação, adicione o seguinte:
fonte
render
viola o facebook.github.io/react/docs/component-specs.htmlEspero que isso seja útil para quem procura uma solução universal / isomórfica, já que o problema da soma de verificação foi o que me levou aqui em primeiro lugar.
Como dito acima, criei um utilitário simples para criar sequencialmente um novo ID. Como os IDs continuam aumentando no servidor e iniciam novamente a partir de 0 no cliente, decidi redefinir o incremento a cada inicialização do SSR.
E, em seguida, no construtor do componente raiz ou componentWillMount, chame a redefinição. Isso redefine essencialmente o escopo JS do servidor em cada renderização do servidor. No cliente, isso não (e não deve) ter nenhum efeito.
fonte
Para os usos usuais de
label
einput
, é apenas mais fácil agrupar as entradas em um rótulo como este:Também possibilita nas caixas de seleção / botões de opção aplicar preenchimento ao elemento raiz e ainda obter feedback do clique na entrada.
fonte
select
, múltiplos-etiquetas em posições diferentes, componentes ui desacoplados etc., também usando ids é recomendado A11y: Em geral, as etiquetas explícitas são melhor suportados pela tecnologia de apoio, w3. org / WAI / tutoriais / formulários / etiquetas /…Encontrei uma solução fácil como esta:
fonte
Outra maneira simples com o texto datilografado:
fonte
Eu crio um módulo gerador uniqueId (Typescript):
E use o módulo superior para gerar IDs exclusivos:
fonte
Não use IDs, se você não precisar, em vez disso, envolva a entrada em um rótulo como este:
Então você não precisará se preocupar com IDs únicos.
fonte