#vue.js #axios
#vue.js #axios
Вопрос:
У меня есть два цикла v-for следующим образом:
<div v-for="id in ids">
<div v-for="data in getData(id)">
<p>{{data.name}}</p>
</div>
</div>
Первый v-for
выполняет итерацию по массиву идентификаторов , хранящихся внутри data()
.
На втором v-for
он выполняет итерацию по результату, возвращаемому функцией getData()
.
Вызов axios возвращает массив результатов, включая имя для идентификаторов, однако <p>
тег не отображает имена.
<script>
data(){
id: ['1', '2', '3']
},
methods:{
getData(id){
//axios call
return response.data;
}
}
</script>
Комментарии:
1. это нехорошо. используя методы в
v-for
2. есть ли у вас другой подход, который даст желаемый результат? пожалуйста, предложите
3. Можем ли мы увидеть ответ. объект данных. Я также хотел бы предположить, что это довольно неэффективный способ проведения того, что я считаю операцией по получению информации о нескольких моделях. Вам лучше создать конечную точку, которая получает информацию о нескольких моделях одновременно.
4. Следуя вашему совету, что это плохой способ реализации этого подхода, я смог создать рабочий метод, который выполнялся после вызова axios. Метод сохранил все необходимые мне данные. Спасибо.
Ответ №1:
Я думаю, что это проблема:
когда v-for вызывает ваш метод, он не ожидает разрешения вызова axios, и поскольку для его итерации нет немедленно доступного массива, он ничего не может показать (показывать нечего), с другой стороны, когда вызов axios разрешает, для v-for нет возможностидля получения уведомлений и, следовательно, обновления шаблона. итак, ситуация выглядит примерно так:
- v-for запускает ваш метод
- метод не возвращает массив немедленно, и v-for не может ждать
- здесь нечего показывать, и он движется дальше
итак, вот что вы можете сделать:
- привязать v-for к массиву в объекте данных
- используйте результат axios для обновления указанного массива
и это должно работать нормально, ваш код может быть таким, например:
// template
<div v-for="data in axiosResult">
<p>{{data.name}}</p>
</div>
//script
<script>
data(){
id: ['1', '2', '3'],
axiosResult: [],
},
methods:{
getData(){
//axios call
this.id.forEach((id) => {
//axios function for each id
axiosCall(id).then((result) => {
this.axiosResult.push(result);
});
});
}
}
</script>
Комментарии:
1. Я решил создать другой метод, который в точности делает то же самое. Я по-прежнему буду отмечать это как правильный ответ, чтобы другие могли ссылаться на него и за ваши усилия. Спасибо.