У меня есть элементы формы с label
s, и я хочу иметь уникальные идентификаторы для связывания label
s с элементами с htmlFor
атрибутом. Что-то вроде этого:
React.createClass({
render() {
const id = ???;
return (
<label htmlFor={id}>My label</label>
<input id={id} type="text"/>
);
}
});
Раньше я генерировал идентификаторы на основе, this._rootNodeID
но он недоступен с React 0.13. Как лучше и / или проще это сделать сейчас?
id = 'unique' + (++GLOBAL_ID);
гдеvar GLOBAL_ID=0;
?<label>My label<input type="text"/></label>
Ответы:
Эти решения отлично подходят для меня.
utils/newid.js
:И я могу использовать это так:
Но в изоморфных приложениях это не сработает.
Добавлено 17.08.2015 . Вместо настраиваемой функции newId вы можете использовать uniqueId из lodash.
Обновлено 28.01.2016 . ID лучше генерировать в формате
componentWillMount
.источник
render
! Создайте идентификатор вcomponentWillMount
render
. facebook.github.io/react/docs/component-specs.html . Хотя это должно быть довольно легко исправить.componentWillMount
устарел, сделайте это в конструкторе. См. Responsejs.org/docs/react-component.html#unsafe_componentwillmountИдентификатор должен быть помещен внутри
componentWillMount(обновление на 2018 год)constructor
, а неrender
. Помещая это вrender
приведет к повторному созданию новых идентификаторов без необходимости.Если вы используете подчеркивание или lodash, есть
uniqueId
функция, поэтому ваш результирующий код должен быть примерно таким:Обновление хуков 2019:
источник
const {current: id} = useRef(_uniqueId('prefix-'))
По состоянию на 04.04.2019, похоже, это можно сделать с помощью React Hooks
useState
:Насколько я понимаю, вы игнорируете второй элемент массива в деструктурировании массива, который позволяет вам обновляться
id
, и теперь у вас есть значение, которое не будет обновляться снова в течение срока службы компонента.Значение
id
будетmyprefix-<n>
где<n>
- возвращаемое целочисленное значениеuniqueId
. Если это недостаточно для вас, подумайте о создании своего собственного лайка.или просмотрите опубликованную мной библиотеку здесь: https://github.com/rpearce/simple-uniqueid . Существуют также сотни или тысячи других уникальных идентификаторов, но lodash
uniqueId
с префиксом должно быть достаточно для выполнения работы.Обновление 2019-07-10
Спасибо @Huong Hk за указание на ленивое начальное состояние хуков , сумма которого состоит в том, что вы можете передать функцию,
useState
которая будет запускаться только при начальном монтировании.источник
<input />
, что бы дело в том , чтоhtmlFor
иid
атрибуты должны быть связаны друг с другом независимо от того , какие значения.initialState
№1const [ id ] = useState(() => uniqueId('myprefix-'))
вместо результата функции №2const [ id ] = useState(uniqueId('myprefix-'))
. Состояние:id
двух вышеуказанных способов не будет отличаться. Но другойuniqueId('myprefix-')
будет выполняться один раз (# 1) вместо каждого повторного рендеринга (# 2). См .: Ленивое начальное состояние: reactjs.org/docs/hooks-reference.html#lazy-initial-state Как лениво создавать дорогие объекты ?: reactjs.org/docs/…Вы можете использовать такую библиотеку, как node-uuid чтобы получить уникальные идентификаторы.
Установить с помощью:
npm install node-uuid --save
Затем в вашем компоненте реакции добавьте следующее:
источник
render
нарушает facebook.github.io/react/docs/component-specs.htmlНадеюсь, это будет полезно для всех, кто ищет универсальное / изоморфное решение, поскольку проблема с контрольной суммой - это то, что в первую очередь привело меня сюда.
Как было сказано выше, я создал простую утилиту для последовательного создания нового идентификатора. Поскольку идентификаторы продолжают увеличиваться на сервере и начинаются с 0 в клиенте, я решил сбрасывать приращение при каждом запуске SSR.
А затем в конструкторе корневого компонента или componentWillMount вызовите сброс. Это по существу сбрасывает область JS для сервера при каждом рендеринге сервера. В клиенте это не имеет (и не должно) иметь никакого эффекта.
источник
Для обычного использования
label
иinput
проще поместить ввод в метку следующим образом:Это также позволяет в флажках / переключателях применять отступы к корневому элементу и по-прежнему получать обратную связь при нажатии на ввод.
источник
select
, с несколькими метками в разных позициях, несвязанными компонентами пользовательского интерфейса и т. Д., Также рекомендуется использовать идентификаторы a11y: Как правило, явные метки лучше поддерживаются вспомогательной технологией, w3. org / WAI / tutorials / forms / labels /…Я нашел такое простое решение:
источник
Другой простой способ с машинописным текстом:
источник
Создаю модуль генератора uniqueId (Typescript):
И используйте модуль top для генерации уникальных идентификаторов:
источник
Не используйте идентификаторы вообще, если они вам не нужны, вместо этого оберните ввод такой меткой:
Тогда вам не нужно будет беспокоиться об уникальных идентификаторах.
источник