#vue.js #dom #axios
#vue.js #dom #axios
Вопрос:
Я использую Vue и пытаюсь выполнить поиск в реальном времени. Но при обновлении содержимого поиска оно не обновляется.
Данные действительно обновляются в массиве при проверке в инструментах разработки. Но DOM не обновляется.
шаблон
<div class="dropdown">
<input type="text" v-model="input" placeholder="Search" @keyup="searching" data-toggle="dropdown">
<span class="caret"></span>
<ul class="dropdown-menu">
<li v-for="(data,index) in availSearchData" :key="index">
<a href="#">{{data.name}}</a>
</li>
</ul>
</div>
метод
searching() {
if (this.input) {
let url = this.domain "search";
axios
.get(url, {
params: {
table: this.table,
data: this.input
}
})
.then(res => {
this.availSearchData = [];
res.data.forEach(doc => {
this.availSearchData.push(doc);
});
});
}
}
Я не знаю, где я делаю неправильно.
Пожалуйста, помогите, если это возможно.
Комментарии:
1. можете ли вы показать мне свой ответ?
2. В пользовательском интерфейсе я ничего не получаю.. В инструментах разработки, после обновления, когда я ввожу ‘salt’: availSearchData:Array[1] 0: Код объекта: 4 название: «СОЛИ И САХАР» subcatid:»1″
3. просто console.log (res) и покажите вывод здесь
Ответ №1:
Чтобы добавить элемент в конец массива и заставить его реагировать в Vue, ниже приведено то, что сработало для меня:
this.$set(this.items,
this.items.length,
JSON.parse(JSON.stringify(this.item))
);
this.$set
Это встроенная функция управления массивом Vue, которая гарантирует реактивность.
this.items
Это массив, this.items.length
(ПРИМЕЧАНИЕ: это items.length
НЕ items.length - 1
является) заключается в том, чтобы поместить новый индекс в конец массива и, наконец, JSON.parse(JSON.stringify(this.item))
клонировать this.item
в новый объект перед отправкой в массив. Часть клонирования может быть неприменима к вам, и я использовал this
в переменных, потому что все переменные объявлены в моей data()
функции.
Ответ №2:
Используйте вычисляемое свойство в вашем компоненте и используйте его для синтаксического анализа шаблона следующим образом
<li v-for="(data,index) in availSearch" :key="index">
<a href="#">{{data.name}}</a>
</li>
и вычисляемое свойство будет тогда
availSearch() {
return this.availSearchData;
},
таким образом, это вычисляемое свойство всегда возвращает массив, если он обновляется.
Также, если ваш ответ — это именно тот массив, который вы хотите использовать, попробуйте это
searching() {
if (this.input) {
let url = this.domain "search";
axios
.get(url, {
params: {
table: this.table,
data: this.input
}
})
.then(res => {
this.availSearchData = [];
Vue.set(this, 'availSearchData', res.data);
});
}
}
Комментарии:
1. Это сработало потрясающе, но я получаю эту ошибку, которой было присвоено вычисляемое свойство «availSearch», но у него нет установщика.
2. Не устанавливайте значения с помощью «availSearch». Это просто для чтения значений.
3. Я не устанавливал с помощью «availSearch»
4. Тогда, вероятно, пожалуйста, предоставьте свой код, чтобы я мог проверить, как именно вы это используете
5. и когда в массиве есть только один элемент. Это ничего не показывает в пользовательском интерфейсе
Ответ №3:
Возможными объяснениями этого могут быть:
- Вы не объявляете свойство в компоненте и, следовательно, нормальная реактивность не работает.
- Вы используете индекс в качестве ключа в вашем массиве. Это может сбить с толку систему реактивности, поэтому она не обязательно знает, изменился ли элемент
. Попробуйте вместо этого использовать имя элемента в качестве ключа.
Ответ №4:
Попробуйте вызвать свою функцию из mounted
перехвата. Я думаю, проблема в том, что вы пытаетесь отобразить данные, когда DOM еще не отрисован. Вызывая вашу функцию в mounted
, вы получаете данные обратно после рендеринга DOM.
mounted() {
this.searching();
}
с веб-сайта Vue «смонтировано»: вызывается после монтирования экземпляра, где el заменяется на вновь созданную виртуальную машину.$el. Если корневой экземпляр смонтирован к элементу in-document, vm.$el также будет в документе при вызове mounted.»
Комментарии:
1. Это сработало, оно действительно показало данные .. но когда в массиве есть только один элемент. Он ничего не показывает
2. измените
:key="name"
. Еслиmounted
сработало, то проблема может заключаться в использовании индекса в качестве ключа3. На самом деле я не могу, он содержит дублирующиеся данные