【发布时间】:2020-01-22 09:45:52
【问题描述】:
我的 vue.js 代码无法访问返回的 json 对象中的引用。
vue.js 代码
new Vue({
el: '#axios',
data: function() {
return {
bikes: null,
baseurl: "https://" + document.querySelector('#axios').dataset.hostportname + "/",
}
},
mounted () {
axios({
method: 'get',
url: 'api/v1/bicycles',
baseURL: this.baseurl
})
.then(response => {
this.bikes = response.data
console.log("now bikes are " + JSON.stringify(this.bikes[0].owner.userName));
})
.catch(error => console.log("There is an error getting bikes: " + error))
}
})
如果 HTML 文件(只是一部分)是
<div id="axios" th:data-hostportname="${hostportname}">
<li v-for="bike in bikes" :key="bike.id">
{{ bike.make }} ------- {{ bike.owner }}
</li>
</div>
那么html输出就是
dawes -------- { "id": 1, "userName": "user1"}
whyte -------- { "id": 2, "userName": "user2"}
whyte -------- { "id": 3, "userName": "user3"}
console.log 输出是
现在自行车是“user1”
如果我尝试单独输出所有者 ID
<div id="axios" th:data-hostportname="${hostportname}">
<li v-for="bike in bikes" :key="bike.id">
{{ bike.make }} ------ {{ bike.owner.id }}
</li>
</div>
没有输出,控制台错误为
TypeError: "bike.owner is undefined"
所以 Axios 代码返回了正确的数据。数组中的每个对象都是可访问的。但是每个数组成员中的嵌套对象在字段级别是不可访问的。
为了清楚起见,如果我要求 {{ bike.owner }} 然后我会显示自行车记录引用的原始记录。如果我要求 {{ bile.owner.id }} 那么我得到 console.log 的 Bike.owner 错误是未定义的,并且没有显示任何内容。所以我看不出这是一个加载问题,除非bike.owner.id 需要比bike.owner 更长的时间来检索,即使后者显示。
谁能解释我的误解?
问候。
【问题讨论】:
-
您是否尝试过添加条件 "{{ bike && bike.owner ? bike.owner.id : "" }}" ?
-
将你的 bikes:null 的值更改为 bikes: [ {owner:{}}]
-
似乎是竞争条件问题。该模板试图在 axios 完成请求之前显示 bike.owner.id。
-
根据@ChristhoferNatalius,我将在该块中添加一个
v-if。应该能解决问题。 -
通常,我将 v-for 包裹在一个 v-if="!loading" 中,并在加载时显示加载动画。所以我在axios调用之前做
this.loading = true,在axios.finally做this.loading = false
标签: javascript vue.js