【发布时间】:2021-09-10 23:48:29
【问题描述】:
我在互联网上搜索了一个解决方案,但到目前为止都没有奏效。 我有一个 Vue 组件,之后我想在其中加载下拉内容。由于它不起作用,我简化了代码,使其只显示元素(即驱动程序名称)。 问题是,v-for 似乎不起作用,因为元素不是在 DOM 中创建的。
代码如下:
<template>
<div class="list-group">
<a class="list-group-item" v-for="driver in drivers">
{{driver.name}}
</a>
</div>
</template>
<script>
export default {
name: "DriverComponent",
data: function (){
return {
drivers: [],
}
},
mounted(){
this.loadDrivers();
console.log(this.drivers);
},
methods: {
loadDrivers: function(){
axios.get('/api/drivers')
.then(
(response) => {
this.drivers = response.data.data;
console.log(this.drivers);
}
)
.catch(function(error){
console.log(error);
});
// console.log(this.drivers);
}
}
}
</script>
在我的 app.js 中:
require('./bootstrap');
window.Vue = require('vue').default;
Vue.component('driver-component', require('./components/DriverComponent.vue').default);
const drivers = new Vue({
el: '#driv',
});
我的 html 如下所示:
<div id="driv">
<driver-component></driver-component>
</div>
如您所见,我添加了一些日志,如下所示: Image of console output
有趣的是,它应该是同一个数组,但第一个数组是空的,但第二个数组中有正确的值。-> 编辑:澄清,谢谢
为了突出问题:我希望有一个类似的列表:
v-for created list
相反,我得到一个空白页。
如果我用我在 json 中获得的数据初始化 drivers 数组,它就可以工作。但是,由于我之后加载数据,它似乎不起作用
感谢您的帮助! BR 约翰内斯
编辑:
我正在使用"axios": "^0.21",控制器是:
public function index(){
return DriverResource::collection(Drivers::all());
}
此控制器在data 字段中返回数组,因此,我设置了response.data.data(意思是两次data)
后端返回:
{"data":[{"id":1,"name":"UPS"},{"id":2,"name":"Hermes"}]}
【问题讨论】:
-
第一个空数组来自 console.log,在挂载的钩子内调用
this.loadDrivers();后您就拥有了。这可以是空的,因为在执行此行时 axios 调用尚未完成。在将响应数据分配给this.drivers之后,第二个数组在 axios 的已解决承诺内执行。您的代码可以正常工作。 -
此外,您可以将
created()事件用于较早的API 调用,而不是稍后调用的mounted()。有关示例,请参阅此 question。 -
@lisymcaydnlb 如果稍后调用mounted() 然后创建,那我为什么要调用created()?
-
@Chin.Udara 感谢您对数组的澄清。不幸的是,代码没有按我的预期工作,因为没有创建元素。似乎 v-for 不起作用