Обратите внимание, что этот readyметод был удален в Vue 2.0 и выше. Я был очень сбит с толку, когда readyметод не выполнялся. stackoverflow.com/a/40209796/126751
К сожалению, в TypeScript это не работает, так как this._uidнедопустимо. Вместо этого создайте свой идентификатор самостоятельно, например public id = uuid4();, см. Uuid4 .
Erik Vullings
2
Мне пришлось поместить инициализацию в метод beforeMount (), чтобы убедиться, что идентификатор был установлен в DOM, когда я пытался получить к нему доступ из метода mount ().
На точку зрения Нихата (см. Выше): Эван Ю посоветовал не использовать _uid: "vm _uid зарезервирован для внутреннего использования, и важно сохранить его конфиденциальность (и не полагаться на него в пользовательском коде), чтобы мы могли гибко изменять его поведение для потенциальных вариантов использования в будущем ... Я бы посоветовал самостоятельно генерировать UID [с помощью модуля, глобального миксина и т. д.] "
Использование предлагаемого миксина в этой проблеме GitHub для генерации UID кажется лучшим подходом:
Обновление:
код выдает ошибку, если ._uidсвойство не существует в экземпляре, чтобы вы могли обновить его, чтобы использовать что-то настраиваемое или новое уникальное свойство id, если оно предоставлено Vue.
Хотя ответ zxzak великолепен; _uidне является опубликованным свойством API. Чтобы избавиться от головной боли на случай, если он изменится в будущем, вы можете обновить свой код всего одним изменением с помощью плагина, как показано ниже.
Vue.use({
install: function(Vue, options) {
Object.defineProperty(Vue.prototype, "uniqId", {
get: function uniqId() {
if ('_uid' in this) {
return this._uid;
}
throw new Error("_uid property does not exist");
}
});
}
});
Это все еще использует uid, который в вашем собственном ответе не рекомендуется. Пожалуйста, не публикуйте ответы, пропагандирующие плохие практики. Этот ответ следует удалить.
Гибридный веб-разработчик
2
Да, но в случае изменения / удаления опубликованного API, им придется изменить только одно место во всем коде. В другом ответе это было для каждого компонента. Я уже подчеркивал это в названии.
Nihat
Кроме того, я только что обновил код, чтобы он выдавал ошибку, если _uidсвойство больше не существует.
Ни одно из других решений не отвечает требованиям наличия более одного элемента формы в вашем компоненте. Вот мой взгляд на плагин, основанный на ранее полученных ответах:
Vue.use((Vue) => {
// Assign a unique id to each component
let uuid = 0;
Vue.mixin({
beforeCreate: function() {
this.uuid = uuid.toString();
uuid += 1;
},
});
// Generate a component-scoped id
Vue.prototype.$id = function(id) {
return "uid-" + this.uuid + "-" + id;
};
});
Создатель Vue.js говорит, что вам следует избегать использования _uid, потому что он предназначен для внутреннего использования, и когда-нибудь они могут удалить его, переименовать или изменить его поведение.
Омид Садеги
1
Спасибо, думаю, это правильно. Я обновил код другим решением, надеюсь, все еще достаточно простым. В любом случае идея этого примера заключалась в использовании вычисляемого свойства.
Cristi Draghici
uniqueId от lodash, на мой взгляд, лучший подход
Джорджио Темпеста
1
Если вы используете TypeScript без какого-либо плагина, вы можете просто добавить статический идентификатор в свой компонент класса и увеличить его в методе created (). Каждый компонент будет иметь уникальный идентификатор (добавьте строковый префикс, чтобы избежать столкновения с другими компонентами, которые используют тот же наконечник)
Использование компонентов - это тенденция. Компоненты классные, они маленькие, очевидные, простые в использовании и модульные. Пока дело не доходит до свойства id.
Некоторые атрибуты тегов HTML требуют использования свойства id, например label [for], input [form] и многих атрибутов aria- *. Проблема с идентификатором в том, что он не модульный. Если несколько свойств id на странице будут иметь одинаковое значение, они могут влиять друг на друга.
VueUniqIds поможет вам избавиться от этой проблемы. Он предоставляет набор директив, связанных с идентификатором, значение которых автоматически изменяется путем добавления уникальной строки, сохраняя при этом удобочитаемость атрибута.
Трудно оправдать такой подход, когда есть реальная вероятность столкновения id ...
Shadow
-7
Этого также можно достичь с помощью этого шаблона (Vue 2.0 v-bind), поэтому предположим, что у вас есть список элементов, которые нужно перебирать, и вы хотите присвоить некоторому элементу dom уникальный идентификатор.
new Vue({
el:body,
data: {
myElementIds : [1,2,3,4,5,6,8]
}
})
Html
<div v-for="id in myElementIds">
<label v-bind:for="id">Label text for {{id}}</label>
<input v-bind:id="id" type="text" />
<div>
Ответы:
Каждый компонент имеет уникальный идентификатор, к которому можно получить доступ как
this._uid
.Если вам нужен больший контроль над идентификаторами, вы можете, например, сгенерировать их внутри родительского компонента.
источник
ready
метод был удален в Vue 2.0 и выше. Я был очень сбит с толку, когдаready
метод не выполнялся. stackoverflow.com/a/40209796/126751data
должна быть функцией, возвращающей объект: vuejs.org/v2/guide/components.html#data-Must-Be-a-Functionthis._uid
недопустимо. Вместо этого создайте свой идентификатор самостоятельно, напримерpublic id = uuid4();
, см. Uuid4 ._uid
, он « зарезервирован для внутреннего использования, и важно сохранить его конфиденциальность (и не полагаться на него в пользовательском коде), чтобы мы могли гибко изменять его поведение для возможных будущих вариантов использования ».На точку зрения Нихата (см. Выше): Эван Ю посоветовал не использовать _uid: "vm _uid зарезервирован для внутреннего использования, и важно сохранить его конфиденциальность (и не полагаться на него в пользовательском коде), чтобы мы могли гибко изменять его поведение для потенциальных вариантов использования в будущем ... Я бы посоветовал самостоятельно генерировать UID [с помощью модуля, глобального миксина и т. д.] "
Использование предлагаемого миксина в этой проблеме GitHub для генерации UID кажется лучшим подходом:
источник
Обновление: код выдает ошибку, если
._uid
свойство не существует в экземпляре, чтобы вы могли обновить его, чтобы использовать что-то настраиваемое или новое уникальное свойство id, если оно предоставлено Vue.Хотя ответ zxzak великолепен;
_uid
не является опубликованным свойством API. Чтобы избавиться от головной боли на случай, если он изменится в будущем, вы можете обновить свой код всего одним изменением с помощью плагина, как показано ниже.источник
_uid
свойство больше не существует.Обновить
Я опубликовал для этого плагин Vue vue-unique-id на npm .
Ответ
Ни одно из других решений не отвечает требованиям наличия более одного элемента формы в вашем компоненте. Вот мой взгляд на плагин, основанный на ранее полученных ответах:
Это не зависит от внутреннего
_uid
свойства, которое зарезервировано для внутреннего использования .Используйте это в своем компоненте так:
Чтобы произвести что-то вроде этого:
источник
Тогда в вашем коде ...
Таким образом, вы не загружаете всю библиотеку lodash или даже не сохраняете всю библиотеку в
node_modules
.источник
В Vue2 используйте v-bind.
Скажем, у меня есть объект для опроса
источник
v-for="(option, index) in poll.body.options"
и использоватьindex
в себе v-bind.Простой подход, который я не видел в ответах:
источник
Если вы используете TypeScript без какого-либо плагина, вы можете просто добавить статический идентификатор в свой компонент класса и увеличить его в методе created (). Каждый компонент будет иметь уникальный идентификатор (добавьте строковый префикс, чтобы избежать столкновения с другими компонентами, которые используют тот же наконечник)
источник
Этот пакет кажется хорошим решением основной проблемы наличия неуникальных идентификаторов в вашей DOM для нескольких компонентов:
vue-uniq-ids
источник
Если ваш uid не используется другим компоментом, у меня есть идея.
uid: Math.random()
Просто и достаточно.
источник
Этого также можно достичь с помощью этого шаблона (Vue 2.0 v-bind), поэтому предположим, что у вас есть список элементов, которые нужно перебирать, и вы хотите присвоить некоторому элементу dom уникальный идентификатор.
Html
Надеюсь, поможет
источник