我只是想将使用内置fetch()
方法从 AJAX 调用中获取的数据设置到我的 Vue 组件的数据变量courts
中(我正在使用 Vue2)。
我知道当你进入fetch()
方法时,关键字的上下文this
可能会改变。但是,如果我将变量courts
作为道具绑定到我的子组件,它会呈现到 HTML中,但我仍然无法从例如created()
和mounted()
生命周期钩子访问道具。
我已经阅读了这个问题,它指出了关于关键字的问题this
。
由于 JavaScript 的异步工作流程,我还检查是否使用setTimeout()
我做的方法获取数据,但不是在我的子组件中作为道具。
我从 Webpack 加载了 Babel,我试图用一个async await
函数对其进行排序,但没有运气。
App.vue(父组件)
<template>
<div class="container">
<court-map v-bind:items="courts"></court-map>
<navbar v-bind:items="courts"></navbar>
</div>
</template>
<script>
import CourtMap from './components/CourtMap.vue';
import Navbar from './components/Navbar.vue';
export default {
components: {
'navbar': Navbar,
'court-map': CourtMap
},
data() {
return {
courts: [],
}
},
created() {
this.getCourts();
},
methods: {
getCourts() {
let _self = this;
fetch('/api/courts', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-type': 'application/json'
}
})
.then(response => response.json())
.then(data => {
_self.courts = data; // With alias
this.courts = data;
console.log(_self.courts); // Shows my data
})
.catch(error => console.error(error));
console.log(_self.courts); // No longer shows my data
setTimeout(function() {
console.log(_self.courts); // Shows my data
console.log(this.courts); // Undefined
}, 3000);
}
}
}
</script>
我也this.$props.items
用来访问我的道具,但它给了我一个空数组。
CourtMap.vue(子组件)
编辑:对不起,我忘了this
在变量的索引中使用。
<template>
<div class="map-viewer">
<div class="esri-widget">
<camera-info v-bind:camera="camera"></camera-info>
</div>
<div>{{ items }}</div> // Renders the prop with the right data
<div id="viewMap"></div>
</div>
</template>
<script>
import { loadModules } from 'esri-loader';
export default {
components: {
'camera-info': CameraInfo
},
props: {
items: {
type: Array,
required: true
},
},
data() {
return {
firstIndex: 0,
camera: {
position: {
longitude: this.items[this.firstIndex].longitude, // Return this is not defined
latitude: this.items[this.firstIndex].latitude // Return this is not defined
},
tilt: 0,
heading: 0
},
}
},
created() {
},
methods: {
createMap() {
// Some function here
}
},
mounted() {
console.log(this.items); // Doesn't show the data
setTimeout(function() {
console.log(this.items); // Doesn't show the data too
}, 3000);
this.createMap();
},
}
</script>
Index.js(我开始我的 Vue 应用程序的地方)
import Vue from 'vue';
import App from './App.vue';
new Vue({
render: h => h(App)
}).$mount('#app');
我想这是新手必须经历的事情,但出于这个原因,我想知道每次我想访问 Vue 中获取的数据时我必须遵循哪种模式。我现在不知道如何进行。
预先感谢您花时间阅读本文。