Как создать уникальные идентификаторы для меток формы в React?
у меня есть форма с элементами label
s и я хочу иметь уникальные идентификаторы для ссылки label
S для элементов с . Что-то вроде этого:--6-->
React.createClass({
render() {
const id = ???;
return (
<label htmlFor={id}>My label</label>
<input id={id} type="text"/>
);
}
});
я использовал для генерации идентификаторов на основе this._rootNodeID
но он недоступен с момента React 0.13. Каков наилучший и / или самый простой способ сделать это сейчас?
7 ответов
такое решение отлично работает для меня.
utils/newid.js
:
let lastId = 0;
export default function(prefix='id') {
lastId++;
return `${prefix}${lastId}`;
}
и я могу использовать его так:
import newId from '../utils/newid';
React.createClass({
componentWillMount() {
this.id = newId();
},
render() {
return (
<label htmlFor={this.id}>My label</label>
<input id={this.id} type="text"/>
);
}
});
но он не будет работать в изоморфных приложениях.
добавлен 17.08.2015. Вместо пользовательской функции newId вы можете использовать уникальный идентификатор от лодашь.
обновление 28.01.2016. Лучше генерировать ID в componentWillMount
.
идентификатор должен быть помещен внутрь componentWillMount
, а не render
. Положить его в render
будет повторно генерировать новые идентификаторы излишне.
если вы используете подчеркивание или lodash, есть uniqueId
функция, поэтому ваш результирующий код должен быть чем-то вроде:
componentWillMount() {
const id = _.uniqueId("prefix-");
this.id = id;
}
render() {
const id = this.id;
return (
<div>
<input id={id} type="checkbox" />
<label htmlFor={id}>label</label>
</div>
);
}
есть много решений "клейкой ленты". Один https://github.com/DelvarWorld/Unique-Id-Mixin
вы можете использовать библиотеку, такую как узел-uuid для этого убедитесь, что вы получаете уникальные идентификаторы.
установить с помощью:
npm install node-uuid --save
затем в вашем компоненте react добавьте следующее:
import {default as UUID} from "node-uuid";
import {default as React} from "react";
export default class MyComponent extends React.Component {
componentWillMount() {
this.id = UUID.v4();
},
render() {
return (
<div>
<label htmlFor={this.id}>My label</label>
<input id={this.id} type="text"/>
</div>
);
}
}
надеюсь, это полезно для тех, кто ищет универсальное/изоморфное решение, поскольку проблема контрольной суммы-это то, что привело меня сюда в первую очередь.
Как сказано выше, я создал простую утилиту для последовательного создания нового идентификатора. Поскольку идентификаторы продолжают увеличиваться на сервере и начинаются с 0 в клиенте, я решил сбросить приращение каждый запуск SSR.
// utility to generate ids
let current = 0
export default function generateId (prefix) {
return `${prefix || 'id'}-${current++}`
}
export function resetIdCounter () { current = 0 }
а затем в конструкторе корневого компонента или componentWillMount вызовите сброс. Это по существу сбрасывает область JS для сервера в каждом рендеринге сервера. В клиенте это не имеет (и не должно иметь) никакого эффекта.
Я предпочитаю просто дайте react auto генерирует идентификатор для меня. Я не совсем уверен, что это правильное использование, поскольку подчеркивание обычно является частным, но оно делает трюк.
этого._reactInternalInstance._rootNodeID
render () {
<button
id={this._reactInternalInstance._rootNodeID}>
{this.props.children}
{/*tooltip */}
<div
htmlFor={this._reactInternalInstance._rootNodeID}
className="mdl-tooltip mdl-tooltip--large">
{this.props.children}
</div>
</button>
}
вот пример использования React для автоматического создания идентификаторов для компонентов, чтобы MDL (Material Design Lite ) мог нацелиться на родительскую подсказку компоненты
Не используйте идентификаторы вообще, если вам это не нужно, вместо этого оберните вход в метку следующим образом:
<label>
My Label
<input type="text"/>
</label>
тогда вам не нужно будет беспокоиться об уникальных идентификаторах.